0

カーネル ブロックがホストから起動されると、ワープ サイズは 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 つのカーネルにディスパッチし、不適切な形状のインデックスを別のカーネルにディスパッチすることができます。

4

1 に答える 1