可能な場合はSIMD(SSE、SPUなど)を利用できるように、いくつかの並列化可能な問題のC++クロスプラットフォーム実装を作成する方法についてのアイデアが必要です。また、実行時にSIMDではなくSIMDを切り替えられるようにしたいと考えています。
この問題に取り組むことをどのように提案しますか? (もちろん、考えられるすべてのオプションについて、問題を複数回実装したくありません)
これはC++では非常に簡単な作業ではないかもしれませんが、何かが足りないと思います。これまでのところ、私の考えは次のようになります...クラスcStreamは単一フィールドの配列になります。複数のcStreamを使用して、SoA(Structure of Arrays)を実現できます。次に、いくつかのファンクターを使用して、cStream全体で実行する必要のあるLambda関数を偽造できます。
// just for example I'm not expecting this code to compile
cStream a; // something like float[1024]
cStream b;
cStream c;
void Foo()
{
for_each(
AssignSIMD(c, MulSIMD(AddSIMD(a, b), a)));
}
for_eachは、ストリームの現在のポインターをインクリメントするだけでなく、SIMDを使用する場合と使用しない場合でファンクターの本体をインライン化する役割を果たします。
そのようなもの:
// just for example I'm not expecting this code to compile
for_each(functor<T> f)
{
#ifdef USE_SIMD
if (simdEnabled)
real_for_each(f<true>()); // true means use SIMD
else
#endif
real_for_each(f<false>());
}
SIMDが有効になっている場合は、一度チェックすると、ループがメインファンクターの周りにあることに注意してください。