是否有 result[i] += A[k] * sin(B[k] * C[i] + D[k]) 的 Intrinsic 指令?

Is there an Intrinsic instruction for result[i] += A[k] * sin(B[k] * C[i] + D[k])?

我在嵌套在 for k 循环中的 for i 循环中有一个简单的代码行(64 字节,8 个双精度形式 - 恰好 one i7 cache line):

 result[i] += A[k] * sin(B[k] * C[i] + D[k])

环顾四周intell intrinsics manual好像迷路了:如何查询这样的功能?

等一下,内循环是i还是k?假设 k 对于所有 i 都是常量,然后将 A[k] 广播到一个完整的向量中,使用 _mm256_set1_pd(A[k]),对于其他数组 [k] 个操作数也是如此。


正如 Raymond 所说,这对于单个指令来说太复杂了。甚至 sin() 也没有在硬件中实现(x87 版本的标量除外)。 Intel 的内在指南列出了一些仅 Intel's SVML provides 的 Intel 库函数,而不是 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 加速器卡。