2016-09-14 2 views
1

다음은 지원되는 명령어 세트를 보여주는 클래스의 예입니다. https://msdn.microsoft.com/en-us/library/hskdteyh.aspxMSVC/arch : [명령어 세트] - SSE3, AVX, AVX2

각각 다른 명령어 세트를 사용하는 단일 함수의 3 가지 구현을 작성하고자합니다. 그러나 플래그/ARCH : AVX2로 인해이 응용 프로그램은 인텔 프로세서의 4 세대 이상에서 실행되지 않으므로 전체 검사 지점이 무의미합니다.

그래서, 질문 : 무엇 정확히이 플래그는 무엇입니까? 지원을으로 설정하거나 제공된 명령어 세트을 사용하여 컴파일러 최적화를 사용 하시겠습니까?

즉,이 플래그를 완전히 제거하고 immintrin.h, emmintrin.h 등의 함수를 계속 사용할 수 있습니까?

+0

MSVC에는 SSE3 옵션이 없습니다. 64 비트 모드에서 유일한 옵션은'AVX'와'AVX2'입니다. 'AVX'의 요점은 MSVC에 vex 인코딩 된 명령어를 사용하도록 지시하는 것입니다. 나는 'AVX2'의 요지를 정말로 모른다. FMA3에서 최적화하는 것이 대부분이라고 생각합니다. –

답변

1

/ARCH : AVX2 옵션을 사용하면 CPU의 YMM 레지스터 및 AVX2 명령어를 사용하는 것이 가장 좋습니다. 그러나 CPU가 이러한 명령을 지원하지 않으면 프로그램이 중단됩니다. AVX2 명령어와 컴파일러 플래그/ARCH : SSE2를 사용하면 성능이 저하됩니다 (약 2 배).

따라서 모든 구현 기능이 해당 컴파일러 옵션 (/ ARCH : AVX2,/ARCH : SSE2 등)으로 컴파일 될 때 최상의 구현입니다. 가장 쉬운 방법 - 구현 (스칼라, SSE, AVX)을 다른 파일에 저장하고 특정 컴파일러 옵션을 사용하여 각 파일을 컴파일하십시오.

또한 CPU 기능을 확인하고 해당 기능을 호출 할 수있는 별도의 파일을 만드는 것이 좋습니다.

구현 된 기능 중 하나 인 CPU checkingcalling이있는 library의 예가 있습니다.

+0

그래서, 기본적으로 내 요구 사항은 다음과 같다 : 자신의 구현 (및 해당 ARCH 플래그)을 가진 3 개의 라이브러리를 만들고, 프로세서 기능을 확인한 다음 한 번에 모두 연결할 수 있다는 것을 이해했다. –

+0

예. 3 개의 라이브러리를 만들 수 있습니다 (각각 고유 한 컴파일러 옵션이 있습니다). 또한 한 라이브러리 안의 모든 파일에 대해 개별 컴파일러 옵션을 설정할 수도 있습니다 (Visual Studio에서는이 작업을 수행 할 수 있습니다). – ErmIg

+0

감사합니다. 충고에 따르면 조금 리팩토링되었지만 이제는 작동합니다! –

관련 문제