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