我正在尋找用於處理速度改進的並行處理算法。 我想測試Agner Fog's vector class library, VCL。用於處理速度的矢量類庫
我在想如何選擇不同的矢量類,例如Vec16c
(SSE2指令集)和Vec32c
(AVX指令集)。
我使用Intel®Atom™x5-Z8350處理器,並根據規格支持SSE4.2指令集。
如何在硬件支持方面有效地選擇矢量類? 對我的處理器說,我可以使用AVC指令集推薦的Vec32c嗎?
我正在尋找用於處理速度改進的並行處理算法。 我想測試Agner Fog's vector class library, VCL。用於處理速度的矢量類庫
我在想如何選擇不同的矢量類,例如Vec16c
(SSE2指令集)和Vec32c
(AVX指令集)。
我使用Intel®Atom™x5-Z8350處理器,並根據規格支持SSE4.2指令集。
如何在硬件支持方面有效地選擇矢量類? 對我的處理器說,我可以使用AVC指令集推薦的Vec32c嗎?
您可以使用編譯器定義的宏來檢測一下指令集,你正在編譯目標被啓用,如:
// Assume SSE2 as a baseline
#include <vectori128.h>
#if defined(__AVX2__)
#include <vectori256.h>
using vector_type = Vec32c;
#else
// Vec16c uses whatever is enabled, so you don't have to check for SSE4 yourself
using vector_type = Vec16c;
#endif
這並不做運行時的檢測,所以只能啓用AVX2如果你想製作一個二進制文件,只能在帶有AVX2的CPU上運行。
如果您希望自己的代碼可以在非x86平臺上工作,或者在沒有SSE2的情況下可以在不支持VCL的x86上工作,您還需要使用#if
來保護#include <vectori128.h>
。
對於32字節的向量,AVX是必需的。 (AVX2適用於像Vec32c
這樣的32B整數向量)。由於您的Atom沒有AVX,請不要包含Agner的vectorclassi256.h
或vectorclassf256.h
,只包含128
標題。
編譯-march=native
使編譯器啓用您的主機CPU支持的所有指令集。
Vec16c
函數的實現在啓用時會自動使用SSE4.2內部函數,因爲Vectorclass會檢查宏以查看啓用的內容。所以只需使用Vec16c
,您將自動獲得目標支持的每個函數的最佳實現。
(因爲你在做編譯時的CPU /目標選項這是真的。如果你想要做的運行時調度自己,那就更難了。)
你預期的要如果使用Vec32c '__AVX2__'被定義了,否則總是使用'Vec16c'(並且讓vectorclass頭文件在使用SSE4.1/4.2/SSSE3的時候會考慮到它的用處)。在你自己的代碼中,你想用宏來做的唯一的事情是檢查AVX512並使用'Vec64c'。矢量類庫的主要目標之一是根據不同目標選項的可用性抽象選擇不同的內在函數。 –
這個編輯完成之前,我花了一個很大的編輯,但我相當確信它現在是正確的。我實際上使用了VCL(和[貢獻的變化](https://github.com/pcordes/vectorclass)(AFAIK尚未集成,我應該研究一下,以便Agner可以包含它們。)) –