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 编写的应用程序可以编译为:
- AVX 和 AVX2
- SSE2 至 SSE4.2 或 SSE4a
- 标量
AVX-512(Vc 2开发)霓虹灯(开发中)NVIDIA GPU / CUDA(研究)
在 Intel 在 ICC 18 中放弃 MIC 支持后,Vc 1.4 也删除了对其的支持。
- 模拟示例
- 总动量和时间步长
std::vector<Particle>
- 矩阵示例:这使用垂直矢量化,不会缩放到不同的矢量大小。但是,该示例对于将其与其他语言或库的类似解决方案进行比较具有指导意义。
- N 涡旋求解器显示了
simdize
多次 d 迭代std::vector<float>
。请注意,与普通的 相比,该-march
-mavx2 -mfma
标志有多重要。
让我们从使用内置浮点数计算 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 编译器:
- 海湾合作委员会 >= 4.8.1
- 铿锵> = 3.4
- 国际商会 >= 18.0.5
- Visual Studio 2019(64 位目标)
- 克隆Vc并初始化Vc的git子模块:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
- 创建构建目录:
$ mkdir build
$ cd build
- 使用cmake进行配置并添加相关选项:
$ 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 上,您还可以Vc.sln
在 Visual Studio 中打开并从 IDE 构建/安装。
该文档是通过doxygen生成的。您可以通过在子目录doxygen
中运行来构建文档doc
。或者,您可以在以下位置找到文档的夜间版本:
- M. Kretz,“通过 SIMD 矢量类型扩展 C++ 进行显式数据并行编程”,法兰克福歌德大学,论文,2015 年。
- M. Kretz 和 V. Lindenstruth,“Vc:用于显式矢量化的 C++ 库”,软件:实践和经验,2011 年。
- M. Kretz,“通过矢量化和多线程有效利用多核和众核系统”,海德堡大学,2009 年。
Vc 是根据3 条款 BSD 许可证的条款发布的。