CUDA Fermi GPU で非常に単純なカーネル <<<1,512>>> を起動します。
__global__ void kernel(){
int x1,x2;
x1=5;
x2=1;
for (int k=0;k<=1000000;k++)
{
x1+=x2;
}
}
カーネルは非常に単純で、10^6 回の加算を行い、グローバル メモリには何も転送しません。結果は正しいです。つまり、ループ x1 の後 (512 個のスレッド インスタンスすべてで) には 10^6 + 5 が含まれます。
カーネルの実行時間を測定しようとしています。Visual Studio のパラレル nsight と nvvp の両方を使用します。Nsight は 2.5 マイクロ秒を測定し、nvvp は 4 マイクロ秒を測定します。
問題は次のとおりです。たとえば、ループのサイズを 10^8 に大幅に増やしても、時間は一定のままです。ループサイズを大幅に減らしても同じです。なぜこれが起こるのですか?
ループ内で共有メモリまたはグローバル メモリを使用する場合、測定値は実行中の作業を反映することに注意してください (つまり、比例関係があります)。