【问题标题】:Access to Shared Memory in CUDA访问 CUDA 中的共享内存
【发布时间】: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 我认为这是问题之一,因为我也尝试过单次内核调用,但它给了我同样的错误。

标签: c++ c cuda gpgpu


【解决方案1】:

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

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

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

【讨论】:

  • 这是有道理的。是否应该使用 cudaMemcpyToSymbol 解决我遇到“无法在设备函数中直接读取主机变量“pos_x_h”之类的错误的问题?为了安全起见,我将调用函数定义为 host____device 仍然没有改变任何东西。
  • 不,我认为这不会解决任何问题。我查看了您的代码,其中似乎有各种错误,但我看不出会出现什么特定问题。
  • 我想我指出了我的大部分错误。我通过执行 device 全局声明了我的位置错误,它似乎已经处理了所有事情(手指交叉)。我刚刚编辑了代码以反映这一点。我现在遇到的错误是分配错误。我敢打赌我又把指针搞砸了。
  • 内核之后的 cudaMemcpy 操作在我看来是一团糟。
  • 是的,我看到了,我在内核之后删除了那个部分。我现在遇到的错误来自我试图在全局内存(这是一个指针)中分配/编辑值。如果这部分有效,那么我认为我可以很好地完成这件事......
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2012-01-24
  • 2014-08-14
  • 2019-03-04
相关资源
最近更新 更多