ループ展開を使用して次のコードがあります:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
ここで、nが定義された定数の場合、すべてが正常に機能します。ただし、nが変数の場合、パフォーマンスは大幅に低下します。命令が発行され実行されるのは約3回であることに気づきました。実行時にループ展開を行う方法を探していると思いますが、それは現実的ではないかもしれません。
CUDAはコンパイルされた言語です。ループ展開はコンパイラの最適化です。ランタイムループの展開は、ある種のランタイムインタープリターまたは動的コード生成を意味します。それは明らかに起こり得ない。
コンパイラがループをループの内容の繰り返しに置き換えるため、展開されたケースがナイーブループと同じかそれ以上の命令を実行することは理にかなっています。展開されたケースで実行される命令が少ない場合は、コンパイラがループの内容の一部またはすべてを事前に計算し、コードを一定の結果に置き換えていることを意味します。
それはすべて、ループに何が含まれているかによって異なります。