我需要一些想法如何以某种方式编写一些可并行化问题的 C++ 跨平台实现,以便我可以利用 SIMD(SSE、SPU 等)(如果可用)。以及我希望能够在运行时在 SIMD 和非 SIMD 之间切换。
你会建议我如何解决这个问题? (当然我不想为所有可能的选项多次实施该问题)
我可以看到这对于 C++ 来说可能不是一件容易的事,但我相信我遗漏了一些东西。到目前为止,我的想法看起来像这样......一个类 cStream 将是单个字段的数组。使用多个 cStreams 我可以实现 SoA(数组结构)。然后使用一些 Functor,我可以伪造需要在整个 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 和不使用 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 已启用,则检查一次并且循环围绕主函子。