---
# System prepended metadata

title: homework 5 report
tags: [1101_平行程式設計, 報告, parallel, report]

---

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