Vector 传递一个恒定的共享内存

Vector 传递一个恒定的共享内存,vector,cuda,shared-memory,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的向量;在整个计算过程中,所有元素都是常量

我喜欢在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值复制到此共享内存?我应该把这个共享内存传递给我的内核吗?

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,您必须首先通过全局内存将数据传递给它,然后(使用内核代码)从全局内存将数据复制到
\uuuu共享空间中

对内核代码进行简单修改以演示此概念,如下所示:

__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];
}
注:

  • 有许多CUDA示例代码演示了更高级的共享内存使用

  • 这里的用法没有任何好处。共享内存通常用于需要线程间通信的情况,或者用于数据重用的情况。您的代码既不演示也不演示

  • 还有许多其他方法可以向内核提供常量值,包括常量数组,例如
    \uuuuu constant\uuuu
    内存。其中任何一个是否有益都将在很大程度上取决于您的实际用例和访问模式,我假设您所展示的代码并不代表这些。在任何情况下,CUDA标签上都有很多问题,讨论了各种固定数据使用,我相信您可以通过搜索找到这些问题

  • \uuu syncthreads()
    对于此代码来说可能不是必需的。但在共享内存的许多更典型的使用中,这是必要的,所以我选择在这里指出这一点。在这段特定的代码中,这是不必要的,但是这段特定的代码也不会合理地使用共享内存


  • 你在哪里读到共享内存的存在?没有关于如何使用它的任何解释吗?你读过Nvidia的文章吗?谢谢,罗伯特。你总是那么乐于助人。