---
# System prepended metadata

title: OpenCL Programming

---

# Programming Assignment VI: OpenCL Programming
## Q1: Explain your implementation. How do you optimize the performance of convolution?
## A1: 
在hostFE.c中，調整localws/globalws，這樣確保在處理每個pixel時，會有分配好的item來做計算，如以下程式碼。
```
size_t localws[2] = {25,25} ; 
size_t globalws[2] = {imageWidth, imageHeight};
```
在kernel.cl中，又可以分配說每個item該做那些pixel，如以下程式碼。
```
int ix = get_global_id(0); //column
int iy = get_global_id(1); //row  
```
最後，再把處理完的pixel，儲存回去相對應的位置，如此一來，就能比serial版的convolution有更好的表現。
```
 int halffilterSize = filterWidth/2;
    for (k = -halffilterSize; k <= halffilterSize; k++)
    {
        for (l = -halffilterSize; l <= halffilterSize; l++)
        {
            if (iy + k >= 0 && iy + k < imageHeight &&
                ix + l >= 0 && ix + l < imageWidth)
            {
                sum += inputImage[(iy + k) * imageWidth + ix + l] *
                        filter[(k + halffilterSize) * filterWidth +
                                l + halffilterSize];
            }
        }
    }
    outputImage[iy * imageWidth + ix] = sum;
```

## Q2: (1)Explain your CUDA implementation
## A2(1): 
大致架構與OpenCL類似，而小部分修改的code如下。
```
int thisX = blockIdx.x * blockDim.x + threadIdx.x;
int thisY = blockIdx.y * blockDim.y + threadIdx.y;
```
將ix、iy修改為thisx、thisy，而numblock也稍作修改已配合OpenCL做比較。
```
dim3 numBlocks(imageWidth / threadsPerBlock.x, imageHeight / threadsPerBlock.y);
```
這樣一來可以確保每一個pixel都有相對應的thread負責，而計算方法也與OpenCL一樣，只是記位子的方式是CUDA的方式而已。

## Q2: (2)plot a chart to show the performance difference between using OpenCL and CUDA

## A2(2):
OpenCL:
![image](https://hackmd.io/_uploads/rJLECy0D6.png)
CUDA:
![image](https://hackmd.io/_uploads/SJ1LRkAPp.png)

利用長條圖兩者的關係(單位為ms)
![image](https://hackmd.io/_uploads/BywdCkRwT.png)

## Q2: (3)explain the Result
## A2(3):
藉由分別測量5次的平均，可以發現OpenCL與CUDA的時間大約一致，CUDA甚至略高一些，但我認為這些只是誤差
我認為造成這樣的結果的原因如下:
(1)CUDA中block size與OpenCL中Localws設定的大小一致，所以他們處理pixel的thread數量差不多。
(2)兩者皆只用memory copy等操作，並沒有利用到他們相關加速的api
(3)處理的資料並不複雜，所以兩者的差距並沒有很多。若是改用較大的圖形，那差距可能會看得更明顯。