2

私は自分自身にCUDAをゼロから教えています。2D配列内の関連する各要素に1を追加するこの単純なカーネルを作成しました。2D配列の要素は、画像の赤チャンネル(zebra.jpg)に由来します。

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です。

ここに画像の説明を入力してください

4

1 に答える 1

4

あなたの問題は次のようになります:
int rowID = blockDim.y * blockDim.y + threadIdx.y;
それは次のようになります:
int rowID = blockDim.y * blockIdx.y + threadIdx.y;

于 2012-11-08T08:39:54.143 に答える