【问题标题】:global vs shared memory in CUDACUDA 中的全局与共享内存
【发布时间】:2011-06-08 06:13:14
【问题描述】:

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

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;
    }
}

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

    【讨论】:

    • 如果加载也是并行的,一切都会很完美。每个线程将某些部分加载到共享内存中
    【解决方案2】:

    IMO,如果您在 Windows 机器上安装了 parallel nsight 并对执行进行跟踪,您可能会有更多见解。或者,通过您的应用运行 cudaprof 以尝试找出可能的延迟在哪里。

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2013-11-09
      相关资源
      最近更新 更多