繁体   English   中英

访问CUDA中的共享内存

[英]Access to Shared Memory in CUDA

我将3个大小为N = 224的数组传递给内核。 内核本身调用另一个函数foo(threadIdx.x),foo调用另一个函数bar(i),其中i从1变为224.第二个函数需要访问传递给内核的数组,但我现在的代码告诉我论证我是未定义的。

我试图将数组副本保存到共享内存中,但它不起作用::

__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行,这意味着它与共享内存有关。 完整的代码在这里

是否可以启动两个内核,第一个将数据发送到共享内存。 那么,第二个做计算?

不,这是不可能的。 共享内存的生存期是与该共享内存关联的线程块。 线程块无法可靠地使用共享内存中由不同线程块(无论是来自相同还是不同的内核启动)存储的值。

将数据从一个内核启动保存到下一个内核的唯一方法是通过全局内存(或主机内存)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM