使用 Thrust 在 Cuda 中为线程划分作业

Dividing jobs for threads in Cuda using Thrust

我有一个测试代码需要更新 class 的 device_vector 中的密钥。因此,如何将部分工作划分到特定线程?

没有除法的代码示例:

__global__ void UpdateKeys(Request* vector, int size, int seed, int qt_threads){
   curandState_t state;
   curand_init(seed, threadIdx.x, 0, &state);
   int id = blockIdx.x * blockDim.x + threadIdx.x;
   if(id < size){
       vector[i].key_ = (curand(&state % 100) / 100;
   }
}

该向量作为 thrust::device_vector 传递。

我想要的例子:

1000 个密钥和 2000 个线程:只使用 1000 个并给每个密钥一个密钥。
1000 个键和 1000 个线程:全部使用。
1 key and 100 threads:使用1个线程。
500 个键和 250 个线程:每个线程负责 2 个。
240 个键和 80 个线程:每个线程负责 3.

如果你像这样修改你的基本内核结构:

__global__ void UpdateKeys(Request* vector, int size, int seed, int qt_threads){
   curandState_t state;
   curand_init(seed, threadIdx.x, 0, &state);
   int id = blockIdx.x * blockDim.x + threadIdx.x;
   int gid = blockDim.x * gridDim.x;
   for(; id < size; id += gid){
       vector[id].key_ = (curand(&state) % 100) / 100;
   }
}

那么任何合法的一维块大小(和一维块的数量)都应该可以处理您选择通过 size 参数提供的尽可能多或尽可能少的输入。如果你 运行 的线程比键多,一些线程将什么都不做。如果您 运行 线程少于密钥,一些线程将处理多个密钥。