我有一个测试代码需要更新类的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个。
答案 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
参数提供的输入数量或数量。如果运行的线程多于键,则某些线程将不执行任何操作。如果运行的线程少于键,则某些线程将处理多个键。