在嵌套在for k循环中的for I循环中,我有一个简单的代码行(64字节,形式为8个双字节-正好是一个i7缓存行):
result[i] += A[k] * sin(B[k] * C[i] + D[k])
我查阅了intell的内部手册,但似乎迷路了:如何查询这样的函数?
等一下,i
还是k
在内部循环中?假设k
对于所有i
都是常数,则将A[k]
广播到具有_mm256_set1_pd(A[k])
的整个向量中,并且对于其他数组[k]操作数也是如此。
正如Raymond所说,对于一个指令来说,这是一种复杂的方式。即使是sin()
也没有在硬件中实现(标量x87版本除外)。英特尔的内部指南列出了一些只有英特尔的SVML提供的英特尔库函数,而不是gcc/clang的<immintrin.h>
的一部分。
对B[k] * C[i] + D[k]
使用FMA(_mm256_fmadd_pd
),并将结果传递给矢量化的sin()
函数(如果可以找到的话)。
将该结果输入result[i] += A[k] * ...
的另一个FMA。
这当然需要两个具有AVX的32B矢量。
AVX512支持64B矢量,但目前仅适用于Xeon Phi加速器卡。