---
# System prepended metadata

title: PP-HW5

---

PP-HW5
=====================================

> 0716078 鄒義杰

## Q1

- Host memory alloc  
  `malloc`  
  - 優點
     - 為 Pageable Memory 不常使用到的可以 swap 到 virtual memory
     - 適合大量資料的情況
  - 缺點
     - 因為分配的 memory 是 pageable，所以在 cudaMemcpy 時，CUDA API 會隱性的將需要複製的 memory 先複製一份到所 Pinned Memory，所以 cudaMemcpy 會比較慢

  `cudaHostAlloc`  
  - 優點
     - 為 Pinned Memory，直接在 physical memory 上分配，不會被 swap 
     - cudaMemcpy 時可以直接以 DMA 的方式搬動資料到 Device 上，所以 cudaMemcpy 會比較快
  - 缺點
     - alloc 的速度相較 malloc 慢
     - 要考慮 physical memory 的上限

- Device memory alloc  
  `cudaMalloc`  
  - 優點
     - 為 linear memory，配置一塊連續的記憶體空間，使用起來必較方便
  - 缺點
     - 因為不一定 aligned 所以有可能效能不佳。

  `cudaMallocPitch`  
  - 優點
     - 分配的記憶體會加 pitch 使記憶體 aligned，提升存取 memory 的速度
  - 缺點
     - 因為有 padding 所以使用上會比較麻煩
     - 因為有 padding，所以在 cudaMemcpy 上會比較慢 (如果不用 padding 則速度相同)

基於以上優缺點，我認為表現上 Method 2 > Method 1  

而 Method 3 則是一個 thread 處理多個 pixels，這樣可以減少 block 數，減少 GPU 使用率，但同時也會降低平行度，所以 Method 3 應該是裡面表現最差的。  

## Q2

![](https://i.imgur.com/1W34Xgl.png)  
![](https://i.imgur.com/rKLc3aC.png)  
![](https://i.imgur.com/16Tvw7Q.png)  

## Q3

根據實際跑出來的圖表來看 Method 3 確實是表現最差的。但是 Method 1 表現卻比 Method 2 來的好，這與我一開始想的不太一樣。  

從數據上分析  

||alloc|copy|
|:-:|:-:|:-:|
|Method 1|0.002ms|3.7292ms|
|Method 2|2.4624ms|2.0078ms|

雖然 Method 2 的 copy 比較快，但是 alloc 上的速度比 Method 1 慢太多了，所以導致 Method 2 的表現比 Method 1 還要來的差。

## Q4

我是使用 Method 1，但是不在 host malloc 一次，就直接把 device img copy 到參數裡的 img