VC 現在處於維護模式,不再積極開發。但是,我們將繼續審查來自社區的錯誤修復的拉取請求。
您可能有興趣切換到 std-simd。 GCC 11 包含一個實驗版本的std::simd
作為 libstdc++ 的一部分,它也可以與 clang 一起使用。 Vc 1.4 中存在但std-simd中不存在的功能最終將變成 Vc 2.0,然後取決於std-simd 。
最近幾代 CPU,尤其是 GPU,需要資料並行程式碼才能充分發揮效率。資料並行性要求相同的操作序列應用於不同的輸入資料。因此,CPU 和 GPU 可以減少指令解碼和調度所需的硬件,有利於更多的算術和邏輯單元,同步執行相同的指令。在 CPU 架構上,這是透過 SIMD 暫存器和指令來實現的。單一 SIMD 暫存器可以儲存 N 個值,並且單一 SIMD 指令可以對這些值執行 N 個操作。在 GPU 架構上,N 個執行緒完美同步運行,由單一指令解碼器/調度器提供。每個線程都有本地記憶體和給定索引來計算載入和儲存在記憶體中的偏移量。
目前的 C++ 編譯器可以自動將標量程式碼轉換為 SIMD 指令(自動向量化)。然而,編譯器必須重建演算法的內在屬性,而當開發人員用 C++ 編寫純標量實作時,該屬性就遺失了。因此,C++ 編譯器無法將任何給定程式碼向量化為其最有效的資料並行變體。特別是較大的資料並行循環,跨越多個函數甚至翻譯單元,通常不會轉換為高效的 SIMD 程式碼。
Vc 函式庫提供了缺少的連結。它的類型允許明確地聲明對多個值的資料並行操作。因此,並行性是透過類型系統添加的。競爭方法透過新的控制結構以及這些控制結構體內的新語意來聲明並行性。
Vc 是一個免費軟體庫,可簡化 C++ 程式碼的明確向量化。它具有直覺的 API,並提供不同編譯器和編譯器版本之間的可移植性以及不同向量指令集之間的可移植性。因此,用 Vc 編寫的應用程式可以編譯為:
在 Intel 在 ICC 18 中放棄 MIC 支持後,Vc 1.4 也刪除了對其的支持。
std::vector<Particle>
的總動量和時間步長std::vector<float>
simdize
迭代。請注意,與普通的-mavx2 -mfma
相比, -march
標誌有多重要。讓我們從使用內建浮點數計算 3D 標量積的程式碼開始:
using Vec3D = std::array< float , 3 >;
float scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
使用 Vc,我們可以輕鬆地使用float_v
類型對程式碼進行矢量化:
using Vc::float_v
using Vec3D = std::array<float_v, 3 >;
float_v scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
以上將擴展到並行計算的 1、4、8、16 等標量積,取決於目標硬體的功能。
為了進行比較,使用英特爾 SSE 內在函數的相同向量化更加冗長,並且使用前綴表示法(即函數呼叫):
using Vec3D = std::array<__m128, 3 >;
__m128 scalar_product (Vec3D a, Vec3D b) {
return _mm_add_ps ( _mm_add_ps ( _mm_mul_ps (a[ 0 ], b[ 0 ]), _mm_mul_ps (a[ 1 ], b[ 1 ])),
_mm_mul_ps (a[ 2 ], b[ 2 ]));
}
上述內容既無法擴展到 AVX、AVX-512 等,也不能移植到其他 SIMD ISA。
cmake >= 3.0
C++11 編譯器:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
(可選)指定安裝目錄:
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
(可選)包括建置單元測試:
$ cmake -DBUILD_TESTING=ON ..
在 Windows 上,如果安裝了多個版本的 Visual Studio,則可以選擇一個:
$ cmake -G " Visual Studio 16 2019 " ..
請參閱cmake --help
以取得可能的生成器清單。
$ cmake --build . -j 16
$ cmake --install . # may require permissions
在 Windows 上,您也可以在 Visual Studio 中開啟Vc.sln
並從 IDE 建置/安裝。
該文件是透過 doxygen 產生的。您可以透過在doc
子目錄中執行doxygen
來建置文件。或者,您可以在以下位置找到文件的夜間版本:
致力於將 Vc 的功能整合到 C++ 標準庫中。
Vc 是根據 3 條款 BSD 授權的條款發布的。