2012-04-05 8 views
4

불도저 옵테론에서 256 비트 FMA 기능을 사용하기 위해 SSE (128 비트) 호출을 사용하는 코드를 수정하려고합니다. 나는이 호출을위한 내장 함수를 찾는 것 같다. 나는이 발견AMD FMA 4 내장 함수에 대한 참조는 어디에서 찾을 수 있습니까?

:이 포럼에

몇 가지 질문이 내장 함수 (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 개발자 문서에 아무것도 찾을 수가 기운 다.

+0

다른 문제는 FMA 명령어를 참조하지 않았다, 단지 AVX 명령어 세트. 인텔의 AVX 명령어 세트는 FMA를 지원하지 않습니다. –

+0

예, 이해합니다. 나는 내가 찾을 수있는 것을 보여주는 예일 뿐이었다. – powerrox

답변

2

파일의 내용은 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); 
} 
+0

예, 이미 헤더 파일을 찾았으며이를 위 참조로 제공 한 MSDN 링크를 사용하고 있습니다. 하지만 이러한 내장 함수에 대한 GCC (또는 AMD) 설명서를 찾을 수없는 것 같습니다. 필자도 "AMD64 아키텍처 프로그래머 매뉴얼 볼륨 4 : 128 비트 및 256 비트 미디어 명령어"를 발견했지만 내 질문과 관련이 없습니다. – powerrox

0

FMA4의 내장 포함 - 사용, 위의 헤더의 마이크로 소프트 버전을 :

#include <immintrin.h>