我正在开发一个有两个主要内核的程序。
由于对性能的影响,每个内核都有自己的维度。因此,我有2种不同的块和网格大小(在编译时无法知道其值)。
两个内核都需要使用cuRAND库,因此在启动第三个内核以初始化设备上的cuRAND状态之前。
当我需要选择此内核的维度时,我的问题就来了。
让我们说我有内核1和2:
block_size_1 = 256
grid_size_1 = 10
block_size_2 = 512
grid_size_2 = 2
对于cuRAND初始化内核,我应该使用最大的大小(10*512
)还是最大的线程数(10*256
)?
答案 0 :(得分:1)
选择最大的内核大小,因为这是您将使用的最大cuRand生成器数。您可以使用
之类的内容轻松评估所需的大小__host__ void fun(){
curandState * randState;
int myCurandSize = ((block_size1 * grid_size1) > (block_size2 * grid_size2))? Block_size1 * Grid_size1 : Block_size2 * Grid_size2);
error = cudaMalloc((void **)&randState, myCurandSize * sizeof(curandState));
if (error == cudaErrorMemoryAllocation){
cudaDeviceReset();
return 1;
}
setup_cuRand <<<1, myCurandSize>>> (randState, unsigned(time(NULL)));
//Don't forget to free the space
cudaFree(randState);
}
__global__ void setup_cuRand(curandState * state, unsigned long seed)
{
int id = threadIdx.x;
curand_init(seed, id, 0, &state[id]);
}
编辑:我认为block_size * grid_size
不会超过最大线程限制,否则,你可以做同样的事情,但保持网格和块的维度并启动那个线程数setup_curand<<<x, y>>>(...);
< / p>