c – 数组上的迭代方向

假设我们有两个基本类型的数组a和b(比如浮点数),我们需要为每个有效索引i计算[i] b [i],并存储结果.迭代数组以最大化缓存命中的最佳方法是什么?它是从前到后,从前到后还是别的什么? 最佳答案 对于这种操作,您应该使用编译器的自动矢量化.迭代小我到大我.此外,答案取决于“存储结果”的含义以及您要迭代的项目数n.

如果你的意思是c [i] = a [i] b [i]并且n不是太小,那么你的编译器的自动矢量化器将优化这个,而不需要任何更改.甚至MSVC也会得到正确的(至少对于SSE而言).你的编译器必须对n进行一些调整,而不是4的倍数(或者AVX为8)和对齐,但是这个成本将在n中分摊,除了小n之外,这个开销将产生微不足道的影响.如果n很小,那么您可能需要考虑对齐.有多小是必须确定的,但我猜它远远小于100.

如果你的意思是sum = a [i] b [i],减少,那么你需要考虑这个.这有一个依赖链,所以你需要展开循环3-10 times.此外,你需要使用自floating point arithmetic is not associative and the auto-vectorization won’t kick in without it以来的宽松浮点模型,所以将-ffast-math添加到GCC(/ fp:快到MSVC).如果您展开循环并使用宽松的浮点模型,那么GCC,ICC,Clang和MSVC应该有效地自动向量化您的缩减.

点赞