# Programming Assignment HW5
## Q1:
> What are the pros and cons of the three methods? Give an assumption about their performances.
**Method1:**
* pros :
執行較簡單,memory的overhead比較小。
* cons :
記憶體之間沒有對應關係,在執行cudaMemcpy()和memcpy()時,花費的時間比較長,memory的overhead比較大。
**Method2:**
* pros :
透過 `cudaHostAlloc`就會使用到Pinned(page-locked)的memory,它可以讓GPU直接使用,省掉一些在不同memory間copy的動作跟時間。
使用 `cudaMallocPitch`分配GPU的memory,可以保證memory都照256或512的倍數對齊,進而提高訪問的效率。
* cons :
使用`cudaHostAlloc`時Pinned memory不能分配過多,過多會導致整體系統速度下降。
使用`cudaMallocPitch`分配GPU memory時會為了要對齊而多分配出額外不會使用到的空間造成浪費。
產生Pinned memory或對齊記憶體空間也都需要花額外時間,所以如果沒有很多的memory access效果通常不會太好。
**Method3:**
* pros :
每個thread一次可以處理較多的pixels,節省運算資源。
減少Block的數量,也降低了記憶體存取的次數。
* cons :
雖然節省了運算資源,但讓每個thread的負擔變重,也會因為計算量的分配不均而拖慢運算的時間導致效能降低。
**Assumption:**
`cudaMallocPitch`為了對齊記憶體而產生的overhead會讓它的performance沒有Method1好,所以Method1的表現應該大於Method2。而Method3的計算多個Group造成的load balancing問題,應該是performance最差的,所以排名應該會是Method1 > Method2 > Method3。
## Q2:
> How are the performances of the three methods? Plot a chart to show the differences among the three methods



## Q3:
> Explain the performance differences thoroughly based on your experimental results. Does the results match your assumption? Why or why not.
**Method1 vs Method2**
從nvprof中可以看到兩者在計算的時間上沒什麼差別,但當MaxIteration越大的時候,Method2會花更多的時間在cudaDeviceSynchronize上,導致它的performance變得比Method1還差。
**Method2 vs Method3**
從View2的nvprof中可以發現,Method3在計算的時間上面比Method2來的多,因為View2的圖比View1圖中比較少高計算量的資料聚集在一起,所以在分配之後每個Group要計算的量都蠻多的,造成整體的計算時間大於Method2。
## Q4:
>Can we do even better? Think a better approach and explain it. Implement your method in `kernel4.cu`
host memory不需要malloc,直接利用argument的img,這樣節省malloc和free的時間。