OpenCLで配列の最大値を見つけるという単純なタスクに問題があります。
__kernel void ndft(/* lots of stuff*/)
{
size_t thread_id = get_global_id(0); // thread_id = [0 .. spectrum_size[
/* MATH MAGIC */
// Now I have float spectrum_abs[spectrum_size] and
// I want the maximum as well as the index holding the maximum
barrier();
// this is the old, sequential code:
if (*current_max_value < spectrum_abs[i])
{
*current_max_value = spectrum_abs[i];
*current_max_freq = i;
}
}
これで、シングルコアシステムで行うのと同じようにすべてを追加if (thread_id == 0)
してループすることができますが、パフォーマンスが重要な問題であるため(そうでない場合は、GPUでスペクトル計算を行わない)、それを行うためのより高速な方法があります?
上記のカーネルの最後でCPUに戻ることはオプションではありません。これは、カーネルがその後も実際に続行するためです。