因此,這是我正在嘗試完成的。在我的C++項目中,必須使用Microsoft Visual Studio 2015或更高版本進行編譯,我需要根據用戶的CPU中可用的最新SIMD指令集,有些代碼具有不同版本,其中包括:SSE
,SSE2
,SSE3
,SSSE3
,SSE4.1
,SSE4.2
,AVX
,AVX2
和AVX512
。在Visual Studio 2015中檢測要與C++宏一起使用的SIMD指令集
由於我在這裏尋找的是編譯時CPU調度,我的第一個猜測是,它可以很容易地使用編譯器宏來完成。但是,令我驚訝的是,在VS2015中找到有關如何使用宏實現這種CPU調度的信息已經相當困難。
例如,前一個問題「Detect the availability of SSE/SSE2 instruction set in Visual Studio」有關於如何檢測x86代碼的SSE和SSE2的信息,但不包括x64代碼的信息。雖然,他們對這個微軟的文檔的參考:http://msdn.microsoft.com/en-us/library/b0084kay.aspx
在那裏,我們只對如何檢測是否SSE,SSE2,AVX和AVX2是在編譯器中啓用信息 - 不正是它們是否會受到CPU支持。另外,對於其他指令集也沒有任何意見,例如SSE3,SSSE3,SSE4.1,SSE4.2和AVX512。
因此,我的問題變成:我如何檢測用戶的CPU是否像其他編譯器那樣通過宏支持那些指令集,但是使用Microsoft Visual Studio 2015?
除非您只打算在您編譯的同一臺機器上運行,否則支持的CPU功能集不是編譯時常量,因此不能是宏。但是,如果你是,只要做任何MSVC等效的gcc的'-march = native',並看看像'#ifdef __AVX__'通常的目標特徵宏'' –
@PeterCordes但這正是問題所在。除'__AVX__'和'__AVX2__'之外沒有宏。我的問題的關鍵在於調查人們如何實現這一目標,因爲Vistual Studio似乎缺乏這樣的宏。 – AndrewSteer
它還應該定義'__SSE2__','__SSSE3__'等等。我不知道MSVC,但使用gcc,您可以使用'-dM'讓預處理器轉儲所有的宏定義。 (例如'echo | gcc -march = haswell -E - -dM | less')。 '__AVX__'意味着所有英特爾SSE擴展,包括'__SSE4_2__'。不過,如果MSVC沒有打算爲它們定義宏,那就太奇怪了。 –