我在CUDA内核关于网格跨入循环和在共享存储器优化降低算法的使用一起以下问题。 试想一下,你有一个元素比格(BLOCK_SIZE * GRID_SIZE)多线程数量的一维数组。 在这种情况下,你会写这样的内核:
#define BLOCK_SIZE (8)
#define GRID_SIZE (8)
#define N (2000)
// ...
__global__ void gridStridedLoop_kernel(double *global_1D_array)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
int i;
// N is a total number of elements in the global_1D_array array
for (i = idx; i < N; i += blockDim.x * gridDim.x)
{
// Do smth...
}
}
现在,你要寻找最大元素在global_1D_array
使用共享内存减少和上面的内核会看起来像这样的:
#define BLOCK_SIZE (8)
#define GRID_SIZE (8)
#define N (2000)
// ...
__global__ void gridStridedLoop_kernel(double *global_1D_array)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
int i;
// Initialize shared memory array for the each block
__shared__ double data[BLOCK_SIZE];
// N is a total number of elements in the global_1D_array array
for (i = idx; i < N; i += blockDim.x * gridDim.x)
{
// Load data from global to shared memory
data[threadIdx.x] = global_1D_array[i];
__syncthreads();
// Do reduction in shared memory ...
}
// Copy MAX value for each block into global memory
}
显然,在一些值data
将被覆盖,即你需要更长的共享存储阵列或有权组织内核以另一种方式。 什么是最好的(最有效)的方式来使用共享内存减少和循环跨入一起?
提前致谢。