---
# System prepended metadata

title: Parallel Programing HW2

---

# Parallel Programing HW2
## Q1
經過將child thread 所執行的 workThreadStart 設定好計算範圍後，calling mandelbrotSerial()，以下是view 1得到的speedup 和serial process 的時間比較結果。
#### **Result**:
![](https://i.imgur.com/Zuei6rd.png)
![](https://i.imgur.com/Tgl057t.png)
![](https://i.imgur.com/ZSD0cVe.png)
![](https://i.imgur.com/zCiFi5x.png)
#### **Graph**
**view 1**
![](https://i.imgur.com/siU4a7n.png)
**view 2**
![](https://i.imgur.com/dWLH7PO.png)

很明顯thread process 沒有完全貼近理想值，甚至差很多，執行時間多了將近50%左右。
但是每個thread 處理的面積是一樣的，表示可能某些區域計算的時間比其他區域還需花更多資源計算。
我們可以看到下面那張圖中，if 那行可能就是造成每個thread 執行時長不一樣的主要原因，因為符合判斷式的話就會執行break 意味著每次iteration 數都會不一樣，那執行時間當然也會不一樣。
![](https://i.imgur.com/YaXCsWf.png)

:::info
沒有回答是否為 linear，且題目要求的圖是 speedup 而不是 speed
>[name=TA]
:::

## Q2
![](https://i.imgur.com/p6Njn2T.png)
![](https://i.imgur.com/HrkYhmX.png)
![](https://i.imgur.com/MXTMPr4.png)
方法:
    struct timeval start;
    struct timeval end;
    gettimeofday(&start,NULL);
    ***...working...***
    gettimeofday(&end,NULL);
    printf("Using time = %ld us\n", 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec);
上述五行程式即可得出working part 的執行時間


thread 數為 2 時我們可以發現兩個子thread 執行時間是差不多的，但是thread 數為 3 時就可以發現thread 1 執行時間遠遠超過另外兩個threads, 而thread 數為 4 時 thread 1 2 執行時間也遠遠大於另外兩個 thread。
由此可以發現在view 1 情況下，圖片的中間部分需花更多時間來處理，所以造成了question 1 的圖表顯示出我們無法貼近理想值，因為每個thread 工作分配不均，最後的執行時長最終以執行時間最長的child thread 為準。
## Q3
**Code**
![](https://i.imgur.com/YZeuIiY.png)
**Speedup**
![](https://i.imgur.com/qFTrOZS.png)
**Graph**
![](https://i.imgur.com/P7BXmLh.png)
方法是我將原本的執行區域改變，比如說原本的版本是thread 0 執行 0 ~ height/2 row，而thread 1 執行 height/2+1 ~ height row。 經過改變後變成thread 0 執行 0 ~ height/4 和 height/2 ~ 3* height/4 row，而thread 1 執行 height/4+1 ~ height/2 和 3* height/4+1 ~height row，依此類。簡單來說就是將運算輛不同的區域平均分配到每個thread 當中執行，這樣就可以拉近每個thread 這樣就可以進每個thread 的執行時間。從圖表我們也可以得知這個方法是確實有效的，thread 測量出來的執行時長的確更貼近理想值了，當thread 數為 4 時speedup 為3.61。
## Q4
![](https://i.imgur.com/vcX21vL.png)
最後，若是thread 數目大於4的話，會發生甚麼是? 我實驗thread number = 8,12,16來當作參考，我們可以發現speedup 都不會再高於4了是非常平緩的，因為工作站只有4個core，所以一次也只能同時執行四個thread，其他的thread 就依然只能等到resource 被 released之後才能執行，而且我們可以發現thread 數量為16時，總時常會更長，我想是因為context switch 隨著thread 數目增加而開始影響結果了。









