Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda cuRAND初始化内核应该具有什么维度_Cuda - Fatal编程技术网

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

Cuda cuRAND初始化内核应该具有什么维度,cuda,Cuda,我正在开发一个有两个主要内核的程序 由于对性能的影响,每个内核都有自己的维度。因此,我有两种不同的块和网格大小(其值在编译时无法知道) 两个内核都需要使用cuRAND库,因此在启动第三个内核以初始化设备上的cuRAND状态之前 当我需要选择这个内核的维度时,我的问题就来了 假设内核1和内核2有: block_size_1 = 256 grid_size_1 = 10 block_size_2 = 512 grid_size_2 = 2 对于cuRAND初始化内核,我应该使用最大的大小(10*5

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

由于对性能的影响,每个内核都有自己的维度。因此,我有两种不同的块和网格大小(其值在编译时无法知道)

两个内核都需要使用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
)?

选择最大的内核大小,因为这是您将使用的最大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]);
}
\uuuuu主机\uuuuuuu无效乐趣(){
库兰州立大学*randState;
int myCurandSize=((块大小1*网格大小1)>(块大小2*网格大小2))?块大小1*网格大小1:块大小2*网格大小2);
错误=cudaMalloc((void**)和randState,myCurandSize*sizeof(curandState));
如果(错误==CudaErrorMemoryLocation){
cudaDeviceReset();
返回1;
}
设置存储(随机状态,未签名(时间(空));
//别忘了腾出空间
库达弗里(兰德州立大学);
}
__全局\uuuuu无效设置\u cuRand(curandState*状态,无符号长种子)
{
int id=threadIdx.x;
curand_init(seed、id、0和state[id]);
}
编辑:我正在计算
block\u size*grid\u size
将不会超过最大线程限制,否则,您可以执行相同的操作,但同时保留网格和块维度,并启动该数量的线程
setup\u curand(…)

您应该阅读。你的问题不清楚。。。