我不明白为什么下面的程序对于 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) 。
但是,那么,我总是必须使用这个排列块(N,1,1)吗?
我必须明白这一点!谢谢!