# homework 5 report 姓名:張議隆 學號:F74082125 ## 第一大題 程式碼放於家目錄裡下,以及`~/hw5`資料夾下的`h5_problem1.c` ### 第一題 private變數 : i, j, count shared變數 : a[], temp[], n ### 第二題 我找不到loop-carried dependency ### 第三題 我目前有一個想法可能可以做到平行化 想法只停留在設想階段 還沒確認過是否可行 ``` for(int i = 0; i < n; i++){ memcpy((a+i), (temp+i) , sizeof(int)); } ``` 這個想法是使用parallel for的作法把這整個block做平行化 但是我不確定這種呼叫`memcpy()`的方式會不會導致奇怪的行為 如果改成 `a[i] = temp[i]` 可能會比較好一點...嗎? ### 第四題 程式碼的其他片段可在h5_problem1.c中找到 底下只放上我的Count_sort()片段 ``` void Count_sort(int a[], int n, int thread_count) { int i, j, count; int* temp = malloc(n*sizeof(int)); #pragma omp parallel for num_threads(thread_count) \ private(i,j,count) for (i = 0; i < n; i++) { count = 0; for (j = 0; j < n; j++) if (a[j] < a[i]) count++; else if (a[j] == a[i] && j < i) count++; temp[count] = a[i]; } #pragma omp single memcpy(a, temp, n*sizeof(int)); free(temp); } ``` ### 第五題 平行程式使用16個thread去運行 | n | Parallel count sort | Serial count sort | qsort | | -------- | -------- | -------- | -------- | | 10000 | <1 seconds | <1 seconds | <1 seconds | | 50000 | 5 seconds | 16 seconds | <1 seconds | | 75000 | 10 seconds | 38 seconds | <1 seconds | 100000 | 18 seconds | 65 seconds | <1 seconds| | 200000 | 72 seconds | 264 seconds | <1 seconds | | 400000 | 280 seconds | 1038 seconds | 1 second | `qsort()`的執行效率遠好過`count sort()`的執行效率 而平行化後的`count sort()`比循序執行的`count sort()`還更快 ## 第二大題 程式碼放於`~/hw5`底下 `h5_problem2.c`、`queue.h`、`queue.c`都是使用到的程式碼 另外`keyword`定義在`keyword.txt`底下 可以使用`Makefile`進行編譯 我的寫法只有使用到兩個`thread` `thread 0`當成`producer`、`thread 1`當成`consumer` 整個程式碼裡頭有不少是`hardcoded`的方式撰寫 其實整體來說不太好 或許我應該想想如何做到可以執行多個`thread`可以執行 但我在寫這份程式碼時真的太過擔心可能會出錯 因此就只能用`hardcode`的方式處理 ###### tags: `1101_平行程式設計` `報告` `report` `parallel`