【发布时间】:2011-01-08 12:25:30
【问题描述】:
我需要了解如何编写一些可并行化问题的 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 已启用,则检查一次并且循环围绕主函子。
【问题讨论】:
-
查看 libsimdpp 库 - 它几乎可以满足您的要求。您只需要编写一次算法:可以使用不同的编译器选项(命名空间负责 ODR)多次编译相同的源代码,链接到相同的可执行文件,并且库将自动为目标处理器选择最佳实现。 (免责声明:我是作者)
标签: c++ metaprogramming functor simd