2017-04-15 4 views
0

GPGPUとCUDAを初めて使用しています。私の読書から、現在の世代のCUDA GPUでは、スレッドは32スレッドのワープにバンドルされます。ワープ内のすべてのスレッドが同じ命令を実行するので、分岐に分岐がある場合、すべてのスレッドは基本的に、発生したすべての分岐を取ることに対応する時間を要します。しかし、GPU上で同時に実行される異なるワープは、別個の計算資源によって異なるワープが実行されるので、このコストなしに分岐ブランチを有することができるように思われる。ですから、私の質問は、発散がこのペナルティを引き起こさない場合、つまりスペックシートで調べなければならない数字は何であるのかを、同時実行できるワープの数にします。ここに関連する「シェーダプロセッサ」の数または「ストリーミングマルチプロセッサ」の数ですか?GPUプログラミングモデル - ペナルティなしで同時に多数のスレッドが混在する

また、AMD Radeonについても同じ質問があります。ここで関連用語は「統一シェーダ」と「コンピューティングユニット」です。

最後に、ワードごとに1つのスレッドしか必要としないように、スレッド間で非常に異なるワークロードがあるとします。基本的にGPUを通常のマルチコアCPUとして使用する。それは可能ですか?これを行うためにスレッドとスレッドブロックをどのようにレイアウトする必要がありますか?ワープ中の31の冗長スレッドにメモリなどを割り当てるのを避けることはできますか?私はこれがGPGPUの理想的なワークロードではないかもしれないが、ホストCPUをブロックすることなくバックグラウンドでアクティビティを実行するのに使用できることを理解しています。

答えて

0

私はGPGPUを初めて使用しており、OpenCLを習得しています。しかし、この質問は何ヶ月も答えられていないので、私はそれに刺すようにしています(私が間違っていると、専門家が私を正してくれるはずです)。

しかし、別の反りが別々の計算リソース

必ずしもそうではありません

によって実行されているので、GPU上で同時に実行される異なる縦糸は、このコストをかけずに発散支店を持つことができるようです。 AMDシステムでは、常に64個の作業項目(CUDAのスレッドと呼ばれます)が常に処理されます(技術的には、AMDシステムの各VALUは一度に16個の項目で動作しますが、毎回任意の命令が4回繰り返されます)。したがって、「AMD Wavefront」あたり64項目)。 NVidiaシステムでは、1回のワープにつき32スレッドが一度に実行されるようです。

もちろん、「ブロックサイズ」は64よりはるかに大きい可能性があります。したがって、32x32ピクセルブロックを実行している場合は、ワークグループ(OpenCL)またはワープごとに1024コア/シェーダー/ワークアイテムが必要です。彼らはあなたがの32×32ブロックに相関する、1024年のワークグループ/ワープ・サイズを持っている場合は32


のセットに分割しているので

これらの1024件のスレッドは、NVidiaのパスカルの下にペナルティなしで分岐するCAN最初の2行は1つのVALU(AMD GCN)またはSM(NVidia Pascal)で実行されます。それらの32スレッド/ 64作業項目のすべてが同じブランチを取る限り、あなたはペナルティを受けることはありません。

最後に、ワードごとに1つのスレッドしか必要としないように、スレッド間で非常に異なるワークロードがあるとします。基本的にGPUを通常のマルチコアCPUとして使用する。それは可能ですか?これを行うためにスレッドとスレッドブロックをどのようにレイアウトする必要がありますか?ワープ中の31の冗長スレッドにメモリなどを割り当てるのを避けることはできますか?私はこれがGPGPUの理想的なワークロードではないかもしれないが、ホストCPUをブロックすることなくバックグラウンドでアクティビティを実行するのに使用できることを理解しています。あなただけ発散し、最高の希望場合

if(threadid> 0) { 
} else { 
    dostuff(); 
} 

は正直なところ、私はその最高だと思います。これらのコアにはそれぞれ独自のリソースがあります(レジスタやもの)。

関連する問題