以下のプログラムが block=N,1,1 に対して正常に実行されるのに、1,1,N (結果が無効な値) または 1,N,1 (結果が 0,1,0...) に対しては正常に実行されない理由がわかりません。 ..0) または 10,50,1 (結果は 0,1,0..0) (N=500)。
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
import random
from pycuda.curandom import rand
import cmath
import pycuda.driver as drv
N=500
a_gpu=gpuarray.to_gpu(np.zeros(N).astype(np.int32))
mod =SourceModule("""
#include <cmath>
extern "C" {
__global__ void myfunc(int *a,int N)
{
int idx=threadIdx.x; //+blockIdx.x*blockDim.x;
if (idx<N)
a[idx]=idx;
}
}
""",no_extern_c=1)
#call the function(kernel)
func = mod.get_function("myfunc")
func(a_gpu,np.int32(N), block=(N,1,1),grid=(1,1))
a=a_gpu.get()
print("a = ",a)
- - - - - - - 編集 - - - - - - - - - - - - - - - - - - -----
わかりました、 int idx=threadIdx.y を使用すると、 block(1,N,1) を使用できることを忘れていました。
しかし、それでは、常にこの配置 block(N,1,1) を使用する必要がありますか?
私はそれを理解しなければなりません!ありがとうございました!