# 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`