Cuda cuRAND初始化内核应该具有什么维度
我正在开发一个有两个主要内核的程序 由于对性能的影响,每个内核都有自己的维度。因此,我有两种不同的块和网格大小(其值在编译时无法知道) 两个内核都需要使用cuRAND库,因此在启动第三个内核以初始化设备上的cuRAND状态之前 当我需要选择这个内核的维度时,我的问题就来了 假设内核1和内核2有: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
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(…)代码>您应该阅读。你的问题不清楚。。。