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プログラミングガイドを読みました。しかし、私は問題を解決するために何をすべきか理解できません。誰かアイデアがあれば、道を教えてください。前もって感謝します。