0
extern "C" void callKernel()
{
    for(int i=0;i<10;i++)
    {
        calc<<< grid, thread >>>(d_arr);
        copyElement<<< grid, thread >>>(d_arr,d_arr_part,3);
        findMax<<< grid, thread >>>(d_arr_part, d_max);
        positionChange<<< grid, thread >>>(d_arr, d_max);
    }
}

上記のコードは、カーネルの計算に関するものです。

カーネル関数の機能はこんな感じ。

"calc":d_arrで計算し、d_arrの要素値を更新します。

"copyElement":たとえば、d_arrは4ステップの配列です。配列には3番目の要素が必要なので、他の変数d_arr_partを割り当て、d_arrの3番目の要素にd_arr_partにコピーします。

"findMax":d_arr_partで最大値を検索し、最大値をd_maxに保存します。

"positionChange":d_arr要素はd_max値に従って更新されます。

問題

プログラムを実行すると、結果に一貫性がありません。実行するたびに結果が変わります。この問題をグーグルで検索すると、カーネル関数が同時に実行されていることがわかりました。私の意図は、すべてのカーネル関数が順番に実行されることです。セクション3.2.5でNVIDIAのCUDACプログラミングガイドを読みました。しかし、私は問題を解決するために何をすべきか理解できません。誰かアイデアがあれば、道を教えてください。前もって感謝します。

4

1 に答える 1

1

カーネルの実行の合間に使用cudaDeviceSynchronizeして、順番を保証できます。ただし、コードはこれを必要としないため、カーネルにバグがある可能性があります。

于 2012-07-23T05:41:37.123 に答える