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。
我真的不知道有关pycuda。你需要将结果从设备内存拷贝到/返回到主机内存吗? 如果您想编辑整个图像,则需要将网格设置为图像大小。 即:grid.x = width%block.x? width/block.x:width/block.x + 1 –
谢谢!我基本上试图找出如何编辑一个数组,然后将其发送回CPU。我想知道为什么pycuda没有这样做... – dangerChihuahua007
@DavidFaux:如果你使用pycuda.driver.InOut(im),它会为你做gpu的副本。 – brano