【问题标题】:Is there an Intrinsic instruction for result[i] += A[k] * sin(B[k] * C[i] + D[k])?是否有 result[i] += A[k] * sin(B[k] * C[i] + D[k]) 的内在指令?
【发布时间】:2016-05-18 04:49:24
【问题描述】:

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

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

我环顾intell intrinsics manual,但似乎迷失了:如何查询这样的功能?

【问题讨论】:

  • 四参数操作a * sin(b * c + d) 的内在可能性极小。这不是 CPU 可能拥有专用指令的基本操作。

标签: cpu intel intrinsics instructions


【解决方案1】:

等一下,ik 在内部循环中吗?假设k 对所有i 都是常量,然后将A[k] 广播到一个完整的向量中,并使用_mm256_set1_pd(A[k]),其他array[k] 操作数也一样。


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

【讨论】:

  • 非常感谢!顺便说一句,您可以链接 result[i] += A[k] * ... 内在函数(至少对于 32B)吗?
  • @DuckQueen:packed-double FMA 只有一个内在函数,因此没有其他可链接的内容。 C 编译器负责在 VFMADD132PD / VFMADD231PD 之间进行选择。还有一个fmsub_pd 内在函数和_mm256_fnmadd_pd 来否定乘积(例如d - b*c)。由于您的所有操作都是相加,因此您只需要在 sin() 内部和外部使用相同的 FMA。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2023-03-18
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多