У меня есть два ядра 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;
}
}