2012-11-08 92 views
2

我從頭開始自學CUDA。我製作了這個簡單的內核,爲2D數組中的每個相關元素添加1。 2D陣列的元素來自圖像的紅色通道(zebra.jpg)。爲什麼我的CUDA內核不改變我的數組?

from pycuda.compiler import SourceModule 
import matplotlib.image as img 
import pycuda.driver as cuda 
import pycuda.autoinit 
import numpy as np 

my_image = img.imread("zebra.jpg")[:,:,0] 
block = (32, 32, 1) 
grid = (8, 8) 

if __name__ == '__main__': 
    width, height = np.int32(my_image.shape) 
    im = np.array(my_image) 
    print 'original sum: ' + str(np.sum(im)) 

    # Create the CUDA kernel, and run it. 
    mod = SourceModule(""" 
    __global__ void add1ToEverything(float* r, int w, int h) { 
     int rowID = blockDim.y * blockDim.y + threadIdx.y; 
     int colID = blockDim.x * blockIdx.x + threadIdx.x; 

     if (rowID > 0 && rowID < h - 2 && colID > 0 && colID < w - 2) 
     r[rowID * w + colID] += 1.0; 
    } 
    """) 
    func = mod.get_function('add1ToEverything') 

    for i in range(0, 5): 
    func(cuda.InOut(im), width, height, block=block, grid=grid) 
    print 'new sum: ' + str(np.sum(im)) 

不過,後來我運行這個程序,我得到下面的結果。

original sum: 1828815 
new sum: 1828815 

爲什麼我的原始金額與我的新金額相同?新的總和不應該更大?

這是zebra.jpg。

enter image description here

+0

我真的不知道有關pycuda。你需要將結果從設備內存拷貝到/返回到主機內存嗎? 如果您想編輯整個圖像,則需要將網格設置爲圖像大小。 即:grid.x = width%block.x? width/block.x:width/block.x + 1 –

+0

謝謝!我基本上試圖找出如何編輯一個數組,然後將其發送回CPU。我想知道爲什麼pycuda沒有這樣做... – dangerChihuahua007

+0

@DavidFaux:如果你使用pycuda.driver.InOut(im),它會爲你做gpu的副本。 – brano

回答

4

你的問題是在該行:
int rowID = blockDim.y * blockDim.y + threadIdx.y;
它應該是:
int rowID = blockDim.y * blockIdx.y + threadIdx.y;

相關問題