当从主机启动内核块时,它的 warp 大小为 32。通过动态并行启动的子内核是否相同?我的猜测是肯定的,但我没有在文档中看到它。
当然,更大的问题是:值得吗?
__global__ void kernel(const int * vec, float * outvec){
int idx = threadIdx.x;
float random_sum=0;
for(int j=0; j<vec[idx]; j++){
random_sum+=threadsafe_rand_uniform();
}
outvec[idx] = random_sum;
}
好的,这个例子有点做作。不过,关键是,如果线程之间有一个不同长度的循环,那么尝试动态并行化它是很诱人的。但是,如果 warp 仍然是 32,那么您最终会在大小不均的 warp 上浪费大量处理器。在这个特定的示例中,您可能希望首先对数据进行排序,然后将动态可并行化的索引分派到一个内核中,并将形状不佳的索引分派到另一个内核中。