---
# System prepended metadata

title: Untitled

---

#Parrel programmong assigment2
##HW2 #511557009 曾智謙

在 view 1 中，speedup 的成長是非線性的，當 thread_num 為 3 時，只有 1.62倍的加速比，甚至比當 thread_num 為 2 時還要低。然而，在 view 2 中，隨著 thread_num 的增加，speedup 則持續上升。

![](https://i.imgur.com/WTmTuyF.png)
![](https://i.imgur.com/HzN6jjM.png)

我們可以通過函式 mandel發現每個像素的值是由迴圈執行的次數所決定的。換言之，數值越大且越接近白色。我們可以從view1發現白色區域主要集中在中心位置，此區域相應的像素所需的計算時間較長，因此可以推測被分配到處理此區域的 thread 可能會成為效能瓶頸。


![](https://i.imgur.com/hhv8haD.png)
![](https://i.imgur.com/WRmpqGG.png)

Q2
從下圖中可以發現，thread_num=3 時 thread 1 明顯花費時間多於其他 thread，thread_num=4 中也可發現 thread 1, 2 同樣明顯花費時間較多。
此測試結果與 Q1 的推測一致。(白色像素較多的地方花費時間較長)
![](https://i.imgur.com/2L5av2f.png)

![](https://i.imgur.com/jbSrGwl.png)

![](https://i.imgur.com/F3RzL9y.png)

Q3

我將每個 thread 的計算範圍改為 {image row index} % {thread id} == 0，以分散單一 thread 計算的區域，減少工作分配不均的可能性。
![](https://i.imgur.com/bFwpA6j.png)
for (size_t i = args->threadId; i < args->height; i += args->numThreads)
    {
        mandelbrotSerial(args->x0, args->y0, args->x1, args->y1, args->width, args->height, i, 1, args->maxIterations,           args->output);
    }

![](https://i.imgur.com/lRdyx8H.png)



Q4
發現在8 thread 時，speedup 3.77X->3.57X

因為本工作站有4個核心和4個thread，如果使用8個thread去執行，反而會發生額外的context switch overhead。工作站是幾核心的話就最好使用多少thread。
![](https://i.imgur.com/wm0laGF.png)

