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

时间:2017-01-28 23:08:04

标签: parallel-processing cuda thrust

我有一个测试代码需要更新类的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个密钥和100个线程:使用1个线程。
500个密钥和250个线程:每个线程负责2.
240个密钥和80个线程:每个线程负责3个。

1 个答案:

答案 0 :(得分:1)

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

__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参数提供的输入数量或数量。如果运行的线程多于键,则某些线程将不执行任何操作。如果运行的线程少于键,则某些线程将处理多个键。