float* メモリ ブロックのコードでいくつかの計算を行います。私は画像に取り組んでいるので、幅 * 高さのポイントと 180 回転でこれを行う必要があります。これはコード内で唯一の並列化可能な手順であるため、180 スレッド (1 度の回転ごとに 1 つ) を開始しています。画像を回転させ、回転ごとに、すべての点について結果の float 値を取得します。各ポイントで現在の最大値を格納する別の float* ブロックがあります。
if(resultMap[i] < convrst)
{
resultMap[i] = convrst;
rMap[i] = (unsigned char)r0;
oMap[i] = (unsigned char)index;
}
resultMap には現在の最高値が格納されます。convrst は畳み込みの結果であり、現在の結果が前の結果よりも大きい場合は、値に加えて、その時点での半径 (r0) と回転 (インデックス) が保存されます。r0 はもともと int であり、インデックスでもあります。i は 0 から imgsize-1 までのカウンターです
{ } 部分に代入がなければ、コード全体は 2 秒程度で終了し、代入には 50 秒かかります (これは、そのコードで同期の問題を回避するためにロックを省略したことを考慮していません)。
そのコードはなぜこんなに遅いのでしょうか? 速く終了させるにはどうすればよいでしょうか?