结果[i]+=A[k]*sin(B[k]*C[i]+D[k])是否存在内在指令



在嵌套在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加速器卡。

相关内容

最新更新