cuRAND初始化内核应该具有什么维度

时间:2016-06-29 10:12:49

标签: cuda

我正在开发一个有两个主要内核的程序。

由于对性能的影响,每个内核都有自己的维度。因此,我有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)?

1 个答案:

答案 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>