c++ - CUDA 中的全局内存与共享内存

标签 c++ cuda gpu-shared-memory

我有两个计算类似内容的 CUDA 内核。一种是使用全局内存(myfun 是一个从全局内存读取大量数据并进行计算的设备函数)。第二个内核将该数据 block 从全局内存传输到共享内存,以便数据可以在 block 的不同线程之间共享。我使用全局内存的内核比使用共享内存的内核快得多。可能的原因有哪些?

loadArray 只是将 d_x 的一小部分复制到 m

__global__ void mykernel(float *d_x, float *d_y, int *d_z, float *d_u, int N, int K, int D)
{

  int tid = blockIdx.x*blockDim.x + threadIdx.x;
  int index = 0;
  float max_s = 1e+37F;


  if (tid < N)
    {

      for (int i = 0; i < K; i++)
        {

          float s = myfun(&d_x[i*D], d_y, tid);

          if (s > max_s)
            {
              max_s = s;
              index = i;
            }
        }

      d_z[tid] = index;
      d_u[tid] = max_s;
    }
}

使用共享内存:

__global__ void mykernel(float *d_x, float *d_y, int *d_z, float *d_u, int N, int K)
{
  int tid = blockIdx.x*blockDim.x + threadIdx.x;
  int index = 0;
  float max_s = 1e+37F;

  extern __shared__ float m[];
  if( threadIdx.x == 0 )
    loadArray( m, d_x );
  __syncthreads();

  if (tid < N)
    {

      for (int i = 0; i < K; i++)
        {

          float s = myfun(m, d_y, tid);

          if (s > max_s)
            {
              max_s = s;
              index = i;
            }
        }

      d_z[tid] = index;
      d_u[tid] = max_s;
    }
}

最佳答案

问题在于,只有每个 block 中的第一个线程从全局内存读取到共享内存,这比让所有线程同时从全局内存读取要慢得多。

当单个线程需要访问全局内存中的相邻元素时,使用共享内存是一个优势 - 但这里的情况似乎并非如此。

关于c++ - CUDA 中的全局内存与共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4676311/

相关文章:

Cuda::入口函数共享数据

cuda - 在主机和 GPU 上添加 CUDA 的结果不同

c++ - 将 CUDA 添加到 ROS 包

cuda - 与 CUDA 共享内存互斥体 - 添加到项目列表

c++ - 在 if 语句中比较枚举类型时出错

调试时 CUDA 共享内存不独占阻塞

c++ - 二维数组的CUDA动态共享内存分配

c++ - 将 std::string 转换为 char* const* 的数组

c++ - 带有参数的自定义对象的 QVector?

c++ - 在类的成员初始化器列表中初始化 std::tuple