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 许可证的条款发布的。