传递一个恒定的共享内存

时间:2017-07-12 15:31:55

标签: vector cuda shared-memory

我有一个长度为128的向量;所有元素在整个计算过程中都是恒定

我喜欢在我的CUDA内核中使用这个常量向量。我正在考虑将此向量存储在共享内存中,并在内核中使用它。我想知道该怎么做?几行代码会很好。

或者这是最好的方法吗?非常感谢。

在头顶我们可以传递全局记忆:

__global__ void fun(float* a, float* coeff)
{
  size_t
        i = blockIdx.x * blockDim.x + threadIdx.x;

  if (i >= 128)
       return;

  a[i] *= coeff[i];
}

但这可能不是最好的方法。我想像

这样的东西
__shared__ float coeff[128];

但是如何将CPU值复制到此共享内存?我是否将这个共享内存传递给我的内核?

1 个答案:

答案 0 :(得分:3)

无法从主机代码直接访问

__shared__内存。所以你必须首先通过全局内存将数据传递给它,然后从那里将它(使用内核代码)复制到__shared__空间。

对内核代码进行简单修改以演示这个概念:

__global__ void fun(float* a, float* coeff)
{
  __shared__ float scoeff[128];
  size_t
        i = blockIdx.x * blockDim.x + threadIdx.x;

  if (i >= 128)
       return;
  scoeff[i] = coeff[i];
  __syncthreads();

  a[i] *= scoeff[i];
}

注意:

  1. 有许多CUDA示例代码可以展示共享内存的更高级用法。

  2. 此处的使用不会带来任何好处。共享内存通常用于需要线程间通信的情况,或者在有数据重用的情况下使用。您的代码均未显示。

  3. 还有许多其他方法可以为内核提供常量值,包括常量数组,例如__constant__内存。这些中的任何一个是否有益将在很大程度上取决于您的实际用例和访问模式,我认为这些模式并未由您显示的代码表示。无论如何,这里有很多关于CUDA标签的问题,讨论各种不断的数据使用,我相信你可以通过一些搜索找到它。

  4. 此代码可能无需__syncthreads()。但是在共享内存的更多典型用途中是必要的,所以我选择在这里指出它。在这个特定的代码中,没有必要,但这个特定的代码也不是合理使用共享内存。