그래서 여기에 내가 달성하고자하는 것이있다. 내 컴퓨터에서 은 Microsoft Visual Studio 2015 또는 이상으로 컴파일해야하는데, 사용자의 CPU에서 사용할 수있는 최신 SIMD instrunction에 따라 일부 코드에 다른 버전이 있어야합니다. , SSE3
, SSSE3
, SSE4.1
, SSE4.2
, AVX
, AVX2
및 AVX512
.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를 통해 어떻게 감지 할 수 있습니까?
컴파일하는 컴퓨터에서 실행하지 않는 한 지원되는 CPU 기능 세트는 컴파일 타임 상수가 아니므로 매크로 일 수 없습니다. 하지만 MSVC에 해당하는 gcc의 -march = native가 무엇이든 상관없이'#ifdef __AVX__'와 같은 일반적인 target-feature 매크로를 보자. –
@PeterCordes하지만 정확히 그게 문제 다. '__AVX__' 및'__AVX2__' 외의 매크로는 없습니다. 내 질문의 요점은 * Vistual Studio가 그러한 매크로가 부족하기 때문에 사람들이 어떻게 달성했는지를 정확하게 조사하는 것입니다. – AndrewSteer
'__SSE2__','__SSSE3__' 등을 정의해야합니다. MSVC는 모르지만 gcc를 사용하면'-dM'을 사용하여 전 처리기에서 모든 매크로 정의를 덤프 할 수 있습니다. (예 :'echo | gcc -march = haswell -E -dM | less'). '__AVX__'는'__SSE4_2__ '를 포함한 모든 Intel SSE 확장을 의미합니다. 그래도 MSVC가 여전히 매크로를 정의 할 필요가 없다면 이상 할 것입니다. –