#blocksとblockSizeの選び方については多くの議論がありましたが、それでも何かが足りません。私の懸念の多くはこの質問に対処しています:CUDAブロック/ワープ/スレッドはどのようにCUDAコアにマッピングされますか? (説明を簡単にするために、十分なperThreadおよびperBlockメモリがあります。メモリ制限はここでは問題になりません。)
kernelA<<<nBlocks, nThreads>>>(varA,constB, nThreadsTotal);
1)SMをできるだけビジーに保つためnThreads
に、の倍数に設定する必要がありwarpSize
ます。本当ですか?
2)SMは、一度に1つのカーネルしか実行できません。つまり、そのSMのすべてのHWcoreはkernelAのみを実行しています。(kernelAを実行しているHWcoreもあれば、kernelBを実行しているHWcoreもありません。)したがって、実行するスレッドが1つしかない場合は、他のHWcoreを「無駄にしている」ことになります。本当ですか?
3)ワープスケジューラーの発行がwarpSize
(32スレッド)単位で機能し、各SMに32個のHWコアがある場合、SMは十分に活用されます。SMに48個のHWcoreがあるとどうなりますか?スケジューラーが32のチャンクで作業を発行しているときに、48のコアすべてを完全に利用し続けるにはどうすればよいですか?(前の段落が当てはまる場合、スケジューラーがHWcoreサイズの単位で作業を発行した方がよいのではないでしょうか?)
4)ワープスケジューラが一度に2つのタスクをキューに入れているように見えます。そのため、現在実行中のカーネルがストールまたはブロックしたときに、2番目のカーネルがスワップインされます(明確ではありませんが、ここのキューは2カーネル以上の深さだと思います)。これは正しいですか?
5)ハードウェアの上限がブロックあたり512スレッド(nThreadsMax)である場合、512スレッドのカーネルが1つのブロックで最速で実行されることを意味するわけではありません。(繰り返しになりますが、問題ではありません。)512スレッドのカーネルを1つだけでなく多くのブロックに分散させると、パフォーマンスが向上する可能性が高くなります。ブロックは1つまたは複数のSMで実行されます。本当ですか?
5a)小さい方がいいと思いますが、どれだけ小さくしてもnBlocks
大丈夫ですか?問題は、その価値をどのように選択するかというnBlocks
ことです。(必ずしも最適ではありません。)を選択するための数学的アプローチはありますかnBlocks
、それとも単に試行錯誤です。