我需要一些想法来编写一个C++跨平台实现的可并行化问题,以便在可能的情况下利用SIMD(SSE、SPU等),并且还希望能够在运行时切换使用SIMD和不使用SIMD。
你会建议我如何解决这个问题? (当然,我不想为所有可能的选项多次实现该问题)
我可以看到这可能不是很容易的任务,但我相信我还缺少了一些东西。到目前为止,我的想法是这样的...... 一个类cStream将成为单个字段的数组。使用多个cStream,我可以实现SoA(结构体数组)。然后使用几个Functors,我可以模拟我需要在整个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,则只需检查一次,并且循环围绕主函子。