【问题标题】:Where can I find a reference for the AMD FMA 4 intrinsics?我在哪里可以找到 AMD FMA 4 内在函数的参考资料?
【发布时间】:2012-04-19 11:39:34
【问题描述】:

我正在尝试修改一段使用 SSE(128 位)调用的代码,以使用 Bulldozer Opteron 上的 256 位 FMA 功能。我似乎无法找到这些调用的内在函数。

本论坛上的一些问题使用了这些内在函数(例如:How to find the horizontal maximum in a 256-bit AVX vector)

我发现了这个: http://msdn.microsoft.com/en-us/library/gg445140.aspx
和http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/index.htm#intref_cls/common/intref_avx_fmadd_ps.htm

但我似乎无法在 AMD 开发人员文档中找到任何内容。

【问题讨论】:

  • 其他问题没有参考FMA指令,只参考了AVX指令集。 Intel 的 AVX 指令集不支持 FMA。
  • 是的,我明白了。我只是举一个我能找到的例子。

标签: sse simd avx amd-processor fma


【解决方案1】:

您可以在文件 fma4intrin.h 中找到内在函数。这是该文件中的 256 位指令,一些函数属性被剥离。 __buitin* 函数发出 FMA 指令,这是它们名称的一部分。所以如果你想找到一个内在函数名,你需要在返回后查找正确的__builtin_instructionname,并使用周围的函数包装器。

/* 256b Floating point multiply/add type instructions.  */
_mm256_macc_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddps256 ((__v8sf)__A, (__v8sf)__B, (__v8sf)__C);
}

_mm256_macc_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddpd256 ((__v4df)__A, (__v4df)__B, (__v4df)__C);
}

_mm256_msub_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddps256 ((__v8sf)__A, (__v8sf)__B, -(__v8sf)__C);
}

_mm256_msub_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddpd256 ((__v4df)__A, (__v4df)__B, -(__v4df)__C);
}

_mm256_nmacc_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddps256 (-(__v8sf)__A, (__v8sf)__B, (__v8sf)__C);
}

_mm256_nmacc_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddpd256 (-(__v4df)__A, (__v4df)__B, (__v4df)__C);
}

_mm256_nmsub_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddps256 (-(__v8sf)__A, (__v8sf)__B, -(__v8sf)__C);
}

_mm256_nmsub_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddpd256 (-(__v4df)__A, (__v4df)__B, -(__v4df)__C);
}

_mm256_maddsub_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddsubps256 ((__v8sf)__A, (__v8sf)__B, (__v8sf)__C);
}

_mm256_maddsub_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddsubpd256 ((__v4df)__A, (__v4df)__B, (__v4df)__C);
}

_mm256_msubadd_ps (__m256 __A, __m256 __B, __m256 __C)
{
  return (__m256) __builtin_ia32_vfmaddsubps256 ((__v8sf)__A, (__v8sf)__B, -(__v8sf)__C);
}

_mm256_msubadd_pd (__m256d __A, __m256d __B, __m256d __C)
{
  return (__m256d) __builtin_ia32_vfmaddsubpd256 ((__v4df)__A, (__v4df)__B, -(__v4df)__C);
}

【讨论】:

  • 是的,我已经找到了头文件并且一直在使用它以及我在上面提供的 MSDN 链接以供参考。但我似乎找不到这些内在函数的任何 GCC(或 AMD)文档。我还找到了“AMD64 架构程序员手册第 4 卷:128 位和 256 位媒体指令”,但这与我的问题无关。
【解决方案2】:

您可能需要此文档http://support.amd.com/TechDocs/43479.pdf。它包含所有 XOP 和 FMA4 内在函数

【讨论】:

  • 它描述了说明,但我看不到内在函数的文档。
【解决方案3】:

仅用于完成 - 对于上述标题的 Microsoft 版本,请使用:

#include <immintrin.h>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多