---
# System prepended metadata

title: PP-HW2

---

PP-HW2
==================================

> 0716078 鄒義杰

## Q1

- View 1
    ![](https://i.imgur.com/ZI7IRHK.png)
- View 2
    ![](https://i.imgur.com/G8WMd7k.png)


速度與 Thread 數 **不成線性關係**。  
我認為在 View 1 使用三個 Threads 的情況下，應該有一個 Thread 他的計算量相較於其他兩個較高，導致速度較慢，拖累整加速的效果。

## Q2

- View 1
    ![](https://i.imgur.com/44wOGU2.png)
- View 2
    ![](https://i.imgur.com/P1ndj1k.png)

    
我分別算了每個 Thread 的耗時，發現在 View 1 使用三個 Thread 的情況下，有一個 Thread 的耗時明顯高於另外兩個，沒有有效的分配工作量導致的。  
在其他情況下，每個 Thread 的耗時就沒有差這麼多，所以整體的加速效果就有呈線性關係。
    
## Q3

我的作法是第 i 個 row 就交給第 (i % numThreads) Thread 做，這樣可以有效的平均分配工作量。不管是工作量大或小的空間都可以平均的分配，就不會出像上述 Q1 Q2 的問題。

```cpp=
for (int i = args->threadId; i < (int)(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/jJwEd78.png)

修正分配方法後再 View 1 & 2 上都可以跑到 3.80x 的加速。

## Q4

表現比用 4 threads 時還要差一點點。  
我認為應該是因為工作站上面只有 4 個 hardware thread，就算多開 thread 去跑，每次能平行執行的也只有 4 個 thread，所以 8 threads 跑出來的時間跟 4 threads 的差不多，但是因為 context switch 的次數會比較多次，所以效能略比 4 threads 的差一點點。

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