我在for循环中有一个简单的代码行(64个字节,8个双精度形式 - 正好one i7 cache line),它嵌套在k循环中:
result[i] += A[k] * sin(B[k] * C[i] + D[k])
我环顾intell intrinsics manual但似乎丢失了:如何查询这样的功能?
答案 0 :(得分:1)
等一下,内圈是i
还是k
?假设k
对于所有i
都是常量,则将A[k]
广播到整个向量中,_mm256_set1_pd(A[k])
,并且其他数组[k]操作数相同。
正如雷蒙德所说,这是复合单指令的方法。即使sin()
也没有在硬件中实现(除了x87版本的标量)。英特尔的内在指南列出了一些只有Intel's SVML provides的英特尔库函数,而不是gcc / clang <immintrin.h>
的一部分。
将an FMA (_mm256_fmadd_pd
)用于B[k] * C[i] + D[k]
,并将结果传递给矢量化sin()
函数,如果可以找到的话。
将结果输入result[i] += A[k] * ...
的其他FMA。
这当然需要带有AVX的两个32B向量。
AVX512可以使用64B矢量,但目前仅在Xeon Phi加速卡中可用。