4

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

这个论坛上的一些问题使用了这些内在函数(例如: 如何在 256 位 AVX 向量中找到水平最大值

我发现了这个: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 开发人员文档中找到任何内容。

4

3 回答 3

3

您可以在文件中找到内在函数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);
}
于 2012-04-19T11:52:25.080 回答
1

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

于 2012-08-08T11:40:01.977 回答
0

只是为了完成 - 对于上述标题的 Microsoft 版本,请使用:

#include <immintrin.h>
于 2014-10-24T09:38:35.927 回答