我有两个计算类似内容的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;
}
}
答案 0 :(得分:3)
问题是只有每个块中的第一个线程从全局内存读取到共享内存,这比让所有线程同时从全局内存中读取要慢得多。
当单个线程需要从全局内存访问相邻元素时,使用共享内存是一个优势 - 但这似乎不是这种情况。
答案 1 :(得分:0)
IMO,如果您在Windows计算机上安装 parallel nsight 并对执行情况进行跟踪,则可能会有更多见解。或者,通过您的应用运行 cudaprof ,以尝试找出可能的延迟时间。