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

組み込み関数は file にあります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

You probably need this document http://support.amd.com/TechDocs/43479.pdf. It contains all XOP and FMA4 intrinsics

于 2012-08-08T11:40:01.977 に答える
0

補足として、上記のヘッダーの Microsoft バージョンの場合は、次を使用します。

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