カーネル ブロックがホストから起動されると、ワープ サイズは 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;
}
わかりました、この例は一種の不自然です。ただし、重要なのは、スレッドごとに異なる長さのループがある場合、それを動的に並列化しようとする誘惑に駆られるということです。ただし、ワープがまだ 32 の場合、不均一なサイズのワープで多くのプロセッサを浪費することになります。この特定の例では、最初にデータをソートしてから、動的に並列化可能なインデックスを 1 つのカーネルにディスパッチし、不適切な形状のインデックスを別のカーネルにディスパッチすることができます。