私はこの方法を持っています:
void A::overlapOut(int pos)
{
for(unsigned int j = 0; j < size; ++j)
{
out[pos+j] += local_arr[j] / scalingFactor;
}
}
std::transform
主にコードの一貫性のために、のようなSTLアルゴリズムを使用してリファクタリングしたいと思います。テーマのバリエーションである他の約5つのメソッドがあり、std::transform
orを使用してリファクタリングできましたstd::copy
。次のように:
void A::nonOverlapOut(int pos)
{
auto normalize = [&] (double x) { return x / otherScalingFactor; };
std::transform(local_arr, local_arr + size, out + pos, normalize);
}
ただし、ここでの主な違いは+=
. 私の他のすべての関数は重複せず、以前の値を使用しないため、data[i]
並列呼び出しを行うことができますが、これはdata[i] += stuff
の代わりにを実行する必要がありdata[i] = stuff
、data[i]
も実行する他のスレッドによってアクセスされる可能性があります+=
。
それで、これを行うための最良のC++ 11-icの方法は何でしょうか? std::atomic<double>
配列の代わりに使用することを考えdouble
ましたが、アトミックアクセスを必要としない場所での計算が遅くなりますか?