# 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 數目增加而開始影響結果了。