CUDA中的全局与共享内存

CUDA中的全局与共享内存,cuda,Cuda,我有两个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

我有两个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;
    }
}
\uuuu global\uuuu 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指数=0;
浮动最大值s=1e+37F;
如果(tid最大值)
{
max_s=s;
指数=i;
}
}
d_z[tid]=指数;
d_u[tid]=最大值;
}
}
使用共享内存:

__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;
    }
}
\uuuu global\uuuuu 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指数=0;
浮动最大值s=1e+37F;
外部共享浮点m[];
if(threadIdx.x==0)
加载阵列(m,d_x);
__同步线程();
如果(tid最大值)
{
max_s=s;
指数=i;
}
}
d_z[tid]=指数;
d_u[tid]=最大值;
}
}

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


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

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

如果加载也是并行的,那么一切都会很完美。每个线程将一些部分加载到共享内存中