【问题标题】:What dimension should the cuRAND initialization kernel havecuRAND初始化内核应该有什么维度
【发布时间】:2016-06-30 06:47:09
【问题描述】:

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

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

【问题讨论】:

标签: cuda


【解决方案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&lt;&lt;&lt;x, y&gt;&gt;&gt;(...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2017-01-17
    • 2022-09-27
    • 1970-01-01
    • 2011-09-07
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多