---
# System prepended metadata

title: Multi-thread programming

---

# Programming Assignment II: Multi-thread Programming
## Q1:
A1: 
圖1為VIEW1測試資料
![image](https://hackmd.io/_uploads/Syh6PphXT.png)圖1
圖2為VIEW2測試資料
![image](https://hackmd.io/_uploads/SJhMOph76.png)圖2
若是把這兩組數據做成折線圖(圖3)
![image](https://hackmd.io/_uploads/B1eh_6hX6.png)圖3

推論:
VIEW1在3個thread的時候反而下降，而VIEW2則根據thread數量而成接近線性成長。

觀察VIEW1與VIEW2的不同
![image](https://hackmd.io/_uploads/HJ6D5ah7a.png)

可以從中發現兩張圖顏色深淺較不一樣，VIEW1黑白分明，而VIEW2則較為淺色系。接著，藉由這兩張灰階程度的不同我們可以觀察以下程式碼：
```
  for (i = 0; i < count; ++i)
  {

    if (z_re * z_re + z_im * z_im > 4.f)
      break;

    float new_re = z_re * z_re - z_im * z_im;
    float new_im = 2.f * z_re * z_im;
    z_re = c_re + new_re;
    z_im = c_im + new_im;
  }
```
由於黑色在灰階是0，而白色則是255。。再藉由上方的程式碼可發現越接近白色需要跑的迴圈數較多，要符合z_re*z_re+z_im*z_im>4.f才可以跳脫迴圈。因此當thread數量=3時，第2個thread在VIEW1會分配到較多的白色，可能導致這個thread跑的時間比其他多，speed up就會因而無法比thread=2時高。

## Q2:

A2:
以下3張分別為thread區分成2、3、4。
![image](https://hackmd.io/_uploads/B1y9F4pQT.png =30%x) ![image](https://hackmd.io/_uploads/ryB0YE6ma.png =32%x)![image](https://hackmd.io/_uploads/Sknl5VTXT.png =32%x)



以下為VIEW1測試數據:
thread數量=2
![image](https://hackmd.io/_uploads/r1pmvE67T.png)
thread數量=3
![image](https://hackmd.io/_uploads/Hk_IDEpXp.png)
thread數量=4
![image](https://hackmd.io/_uploads/BymFD4pma.png)

根據上方圖片切割線以及程式跑出的時間測試，可以發現當thread數量=3確實是中間的thread(thread 1)花的時間特久，而thread數量=4，也是中間的thread(thread 1/2)花比較久。
因此，工作分布不均，導致加速的程度降低，證實Q1的推測是對的!

## Q3:

A3:
將workThreadStart()這個function裡改成以下程式碼:
```
    for (int i = args->threadId; i < args->height; i=i+args->numThreads) {
        mandelbrotSerial(args->x0, args->y0, args->x1, args->y1, args->width, args->height, i, 1, args->maxIterations, args->output);        
    }
```
VIEW1的數據
![image](https://hackmd.io/_uploads/S1C7RVamp.png)
VIEW2的數據
![image](https://hackmd.io/_uploads/HJKU0Ea7p.png)

採用的方法如圖4:
![image](https://hackmd.io/_uploads/H11jJBTQT.png)圖4

以3個thread為例，運用round robin的模式，讓每個thread輪流做，這樣可以讓工作量不平均的問題得以解決。
最終:VIEW1 speed up(3.78x)/VIEW2 speed up(3.79x)以上皆為4個thread。



## Q4:
VIEW1/2在8 thread的數據
![image](https://hackmd.io/_uploads/Byuk-SpXp.png)
顯然相較於4thread，speed up有略微降低。猜測是因為server提供的是4核心，而8個thread會有context switch overhead，因而導致8 thread比 4 thread speed up低。