1
|
joshuatvernon imotov · 技术社区 · 9 年前 |
![]() |
1
3
考虑使用 OpenMP4.x版 #pragma omp-simd约简 用于最里面的循环。请记住,omp降低不适用于 C++ 数组,因此必须使用如下所示的临时缩减变量。
对于x86平台,OpenMP4.x当前受全新的GCC(4.9+)和英特尔编译器支持。一些LLVM和PGI编译器也可能支持它。 附笔。 汽车 -矢量化(“auto”是指编译器在没有任何杂注的情况下进行矢量化,即没有开发人员的明确指示)可以 有时 适用于某些编译器变体(尽管由于数组元素是reduction变量,所以不太可能)。然而,严格来说,自动矢量化此代码是不正确的。您必须使用显式SIMD pragma来“解决”缩减依赖关系,并消除指针的歧义(作为一个好的副作用)(以防通过指针访问数组)。 |
![]() |
2
2
首先,EOF是正确的,您应该看看gcc/clang/icc在自动矢量化标量代码方面做得有多好。我不能帮你检查,因为你只发布了代码片段,没有我能提供的任何东西 http://gcc.godbolt.org/ .
你绝对不需要分配任何东西。请注意,您的intrinsic版本在
(有关矩阵不同数据安排的建议,请参见底部)
计算每个
因此,您的内部循环将有5个读取流(P[]和4个不同的行
积累8到12可能更好
FMA吞吐量和延迟使得您需要10个矢量累加器来保持10个FMA处于飞行状态,以使哈斯韦尔上的FMA单元饱和。Skylake将延迟降低到4c,因此您只需要8个矢量累加器就可以在SKL上饱和它。(请参见
x86
标签维基)。即使您的内存瓶颈,而不是执行端口吞吐量瓶颈,您也需要多个累加器,但它们可能都是相同的
然而,累积多个
所以你应该这样做
你可能会写
我早先错过了问题的这一部分。首先,很明显
理想情况下,矩阵将被“分条”以匹配矢量宽度
。矩阵中的每个加载都会得到一个向量
|