1

プログラムを評価すると、ある時点で最大 100 ミリ秒のタイム ラプスが発生することがわかりました。すべての操作を検索しましたが、個人的には今回の操作はありませんでした。次に、cudaThreadSynchronize 呼び出しをどこに配置しても、最初の呼び出しに 100 ミリ秒かかることに気付きました。次に、そのような例を以下に書きました。最初の行で cudaThreadSynchronize を呼び出すと、最後の経過時間の値が 1 ミリ秒未満であることがわかります。ただし、呼び出されない場合は、平均で 110 ミリ秒かかります。

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}

最初の cudaThreadSynchronize() が CUDA ライブラリの初期化を処理していると思います。カーネルを完全に初期化するのは正しい方法なので、他の操作の時間評価には影響しませんか? 最初に cudaThreadSynchronize を呼び出すだけで十分ですか、それとも正しい方法がありますか..

4

1 に答える 1

1

CUDA を使用するには、最初に「CUDA コンテキスト」を GPU で作成する必要があります。これには約 70 ~ 100 ミリ秒かかります。あなたの例cudaThreadSynchronize();では、コンテキストを作成しています。コンテキストは、アプリケーションに対して 1 回だけ作成されます。タイミング解析を行うとき、コンテキストを作成するためにダミーのメモリ コピーも行います (上記で を使用して行ったようにcudaThreadSynchronize();)。

于 2012-07-28T23:23:26.633 に答える