2016-11-23 7 views
1

그래서 여기에 내가 달성하고자하는 것이있다. 내 컴퓨터에서 은 Microsoft Visual Studio 2015 또는 이상으로 컴파일해야하는데, 사용자의 CPU에서 사용할 수있는 최신 SIMD instrunction에 따라 일부 코드에 다른 버전이 있어야합니다. , SSE3 , SSSE3, SSE4.1, SSE4.2, AVX, AVX2AVX512.Visual Studio에서 C++ 매크로와 함께 사용되는 SIMD 명령어 세트 감지 2015

이 시점에서 제가 바라는 점은 컴파일 시간이 인 컴파일 타임 CPU이기 때문에 컴파일러 매크로를 사용하여 쉽게 수행 할 수 있다고 생각했습니다. 그러나 놀랍게도 VS2015에서 매크로를 사용하여 이러한 CPU 디스패치를 ​​수행하는 방법에 대한 정보를 찾는 것이 매우 어려웠습니다.

예를 들어 이전 질문 인 "Detect the availability of SSE/SSE2 instruction set in Visual Studio"에는 x86 코드의 SSE 및 SSE2를 검색하는 방법에 대한 정보가 있지만 x64 코드에는 해당되지 않습니다. 하지만, 그들은이 마이크로 소프트의 문서에 대한 참조를 만들 : 우리는 SSE, SSE2, AVX 및 AVX2 컴파일러에을 활성화 여부를 감지하는 방법에 대한 정보를 가지고있다 http://msdn.microsoft.com/en-us/library/b0084kay.aspx

를 - 그들은 CPU에서 지원하는 정확하지 여부 . 또한 SSE3, SSSE3, SSE4.1, SSE4.2 및 AVX512와 같은 다른 도구 세트에 대해서는 전혀 없습니다.

그럼, 내 질문은 어떻게됩니까 : 사용자의 CPU가 다른 컴파일러와 마찬가지로 매크로를 통해 이러한 instrunction 세트를 지원하는지 Microsoft Visual Studio 2015를 통해 어떻게 감지 할 수 있습니까?

+1

컴파일하는 컴퓨터에서 실행하지 않는 한 지원되는 CPU 기능 세트는 컴파일 타임 상수가 아니므로 매크로 일 수 없습니다. 하지만 MSVC에 해당하는 gcc의 -march = native가 무엇이든 상관없이'#ifdef __AVX__'와 같은 일반적인 target-feature 매크로를 보자. –

+0

@PeterCordes하지만 정확히 그게 문제 다. '__AVX__' 및'__AVX2__' 외의 매크로는 없습니다. 내 질문의 요점은 * Vistual Studio가 그러한 매크로가 부족하기 때문에 사람들이 어떻게 달성했는지를 정확하게 조사하는 것입니다. – AndrewSteer

+0

'__SSE2__','__SSSE3__' 등을 정의해야합니다. MSVC는 모르지만 gcc를 사용하면'-dM'을 사용하여 전 처리기에서 모든 매크로 정의를 덤프 할 수 있습니다. (예 :'echo | gcc -march = haswell -E -dM | less'). '__AVX__'는'__SSE4_2__ '를 포함한 모든 Intel SSE 확장을 의미합니다. 그래도 MSVC가 여전히 매크로를 정의 할 필요가 없다면 이상 할 것입니다. –

답변

2

당신이 직면 한 문제는 Visual Studio가 역사적으로 소프트웨어 용으로 의도 된 것입니다. 공급 업체. 자신의 소프트웨어를 단순히 컴파일한다는 생각은 Microsoft의 DNA가 아닙니다.

실제 결과는 Microsoft가 빌드 시스템의 프로세서에 대해 거의 신경 쓰지 않는다는 것입니다. 소프트웨어를 실행하는 데 사용되는 프로세서는 거의 없습니다.

위의 경우, 이는 또한 빌드 시스템 라이브러리가 대상 컴퓨터에 있다고 가정하는 다년생의 Linux 문제로 고통받지 않는다는 것을 의미합니다. Windows 7 용 Windows 10을 사용하면됩니다.

또한 컴파일러에서는 SSE4.1까지 사용하도록 설정할 수 없습니다. /arch:avx 만 사용할 수 있습니다. 또한 그 옵션은 __AVX__만을 정의하고, AVC에 의해 암시 된 이전 명령 세트에 대한 타겟 지원을 나타 내기 위해 gcc/clang/icc가 정의하는 __SSSE3__과 같은 일반적인 매크로는 정의하지 않습니다.

+0

MSVC가 [__AVX__를 정의하지만 예를 들어 '__SSSE3__]이 아닌 OP의 주장을 이해할 수 있습니까? (http://stackoverflow.com/questions/40757107/detecting-simd-instruction-sets-to-be- visual-studio-2015/40759182 # comment68739878_40757107)와 함께 사용되는 c 매크로가 있습니까? 동일한 정보가 다르게 명명 된 매크로에 존재하지 않는 한 매우 드물 것 같습니다. 또한,이 질문에 대해 묻고 있는지, 또는 실제로'gcc -march = native' (Visual Studio가 지원하지 않는다고 말하는 것으로 응답하는)와 동등한 작업을 수행하는 방법이 있는지 확실하지 않습니다. –

+0

@PeterCordes : 아니요, 맞습니다. '__AVX__' 매크로는 있지만'__SSSE3__' 매크로는 없습니다. 논리적입니다 : 전자는'/ arch : AVX' 명령 행 옵션과 일치하지만'/ arch : SSSE3' 옵션은 없습니다. (/ arch : SSE2 옵션이 있지만 x64에는 해당되지 않습니다.) – MSalters

+0

그래, Agner Fog의 vectorclass 라이브러리가 자체 [INSTRSET] (https://github.com/pcordes/vectorclass/blob/master/instrset)을 사용하는 이유를 설명합니다. h # L28) 매크로; 나는 MSVC에 대한 언급을 보지 않았다. 나는'__SSE3__'과 같은 매크로가 이식 가능하길 바랬습니다.:(또한, 나는 SSSE3까지 자동 벡터 라이 제이션을 할 수있는 방법이 없다는 사실에 놀랐다. 예를 들어, 컴파일러가 intrinsics를 사용하지 못하게하는 것은 아닐 것이다. (gcc/clang do와 같이) 사용 가능하게 할 수있는 방법이 없다면, 사용 가능하게 할 수 없습니다. –