【发布时间】:2014-04-13 22:20:25
【问题描述】:
我将 3 个大小为 N=224 的数组传递给内核。内核本身调用另一个函数 foo(threadIdx.x) 并且 foo 调用另一个函数 bar(i),其中 i 从 1 变为 224。第二个函数需要访问传递给内核的数组,但我现在的代码告诉我参数 i 是未定义的。
我试图将数组的副本保存到共享内存中,但没有成功::
__global__ void dummy(double *pos_x_d, double *pos_y_d, double *hist_d){
int i = threadIdx.x;
hist_d[i]=pos_x_d[i]+pos_y_d[i];
__syncthreads();
foo(i);
__syncthreads();
}
主机代码如下::
cudaMalloc((void **) &pos_x_d,(N*sizeof(double)));
cudaMalloc((void **) &pos_y_d,(N*sizeof(double)));
cudaMalloc((void **) &hist_d,(N*sizeof(double)));
//Copy data to GPU
cudaMemcpy((void *)pos_x_d, (void*)pos_x_h,N*sizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy((void *)pos_y_d, (void*)pos_y_h,N*sizeof(double),cudaMemcpyHostToDevice);
//Launch Kernel
dummy<<<1,224>>>(pos_x_d,pos_y_d,hist_d);
是否可以启动两个内核,第一个将数据发送到共享内存。那么,第二个做计算呢?我还需要循环第二个内核,这就是为什么我想首先在共享内存中发送数据。错误来自第 89、90 行,这意味着它与共享内存有关。完整代码为here
【问题讨论】:
-
共享内存的生命周期仅限于内核线程块 (AFAIK) p 的生命周期。
-
@Dominik Selzer 当我使用单线程时它也不起作用。我调用一个函数 f1,它调用另一个函数 f2。错误来自我对 f2 的调用,它需要访问传递给内核的数组。
-
我快速查看了您的代码,我只看到两个单独的内核调用。第一次调用只填充共享内存,但之后不使用共享内存。
-
好的...我再次检查(已经很晚了:-))。问题是——正如我已经告诉过你的那样,共享内存的生命周期是每个块和每个内核的。第二个内核调用对您在内核 1 中使用的共享内存一无所知。这不是您使用共享内存的方式。共享内存用于每个块的非全局线程间通信。
-
@Dominik Selzer 我认为这是问题之一,因为我也尝试过单次内核调用,但它给了我同样的错误。