C ++包装器用于SIMD内在的
SIMD(单个指令,多个数据)是微处理器的一个功能,已有多年了。 SIMD指令一次对一批值执行单个操作,因此提供了一种显着加速代码执行的方法。但是,这些指令在微处理器供应商和编译器之间有所不同。
xsimd提供了用于图书馆作者使用这些功能的统一手段。也就是说,它可以操纵与单个值相同的算术运算符的数字批次。它还提供了在批处理上运行的常见数学功能的加速实现。
除Xtensor之外,Xsimd已被主要的开源项目采用,例如Mozilla Firefox,Apache Arrow,Pythran和Krita。
XSIMD项目始于约翰·马比尔(Johan Mabille)的一系列博客文章,介绍了如何实施Simd Intinstics包装纸。博客的档案可以在这里找到:C ++科学家。文章中描述的设计一直接近XSIMD的实际体系结构,直到版本8.0。
数学功能是最初在现在不弃用的boost.simd项目中实现的算法的轻量级实现。
xsimd需要C ++ 11兼容的编译器。支持以下C ++编译器:
| 编译器 | 版本 |
|---|---|
| Microsoft Visual Studio | MSVC 2015更新2及以上 |
| G ++ | 4.9及以上 |
| 铛 | 4.0及以上 |
支持以下SIMD指令集扩展名:
| 建筑学 | 指令集扩展 |
|---|---|
| x86 | SSE2,SSE3,SSE3,SSE4.1,SSE4.2,AVX,AVX2,FMA3+SSE,FMA3+AVX,FMA3+AVX2 |
| x86 | AVX512BW,AVX512CD,AVX512DQ,AVX512F(GCC7及更高) |
| x86 amd | FMA4 |
| 手臂 | Neon,Neon64,SVE128/256/512(固定矢量大小) |
| WebAssembly | WASM |
| RISC-V | RISC-V128/256/512(固定向量大小) |
XSIMD的软件包可在Mamba(或Conda)软件包管理器上找到。
mamba install -c conda-forge xsimdSPACK软件包管理器上可用XSIMD的软件包。
spack install xsimd
spack load xsimd您可以使用CMAKE直接从源中安装它:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install要开始使用xsimd ,请查看完整的文档
http://xsimd.readthedocs.io/
xsimd对XTL库有可选的依赖性:
xsimd | xtl (可选) |
|---|---|
| 掌握 | ^0.7.0 |
| 12.x | ^0.7.0 |
| 11.x | ^0.7.0 |
| 10.x | ^0.7.0 |
| 9.x | ^0.7.0 |
| 8.x | ^0.7.0 |
如果要支持xtl::xcomplex的矢量化,则需要对xtl的依赖性。在这种情况下,您必须使用启用C ++ 14支持的项目构建项目。
该库的版本8是一个完整的重写,与7.x版本有一些微小的区别。迁移指南将很快提供。同时,以下示例显示了如何使用库的两个版本7和8?
这是一个示例,该示例计算两个双浮点值的两组的平均值,假设支持AVX扩展名:
# include < iostream >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
int main ( int argc, char * argv[])
{
xs::batch< double , xs::avx2> a = { 1.5 , 2.5 , 3.5 , 4.5 };
xs::batch< double , xs::avx2> b = { 2.5 , 3.5 , 4.5 , 5.5 };
auto mean = (a + b) / 2 ;
std::cout << mean << std::endl;
return 0 ;
}在构建示例时,不要忘记启用AVX扩展。使用GCC或Clang,这是通过-mavx标志完成的,在MSVC上,您必须通过/arch:AVX选项。
此示例输出:
( 2.0 , 3.0 , 4.0 , 5.0 )相同的计算在向量上运行,并使用最性能的指令集:
# include < cstddef >
# include < vector >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
using vector_type = std::vector< double , xsimd::aligned_allocator< double >>;
void mean ( const vector_type& a, const vector_type& b, vector_type& res)
{
std:: size_t size = a. size ();
constexpr std:: size_t simd_size = xsimd::simd_type< double >::size;
std:: size_t vec_size = size - size % simd_size;
for (std:: size_t i = 0 ; i < vec_size; i += simd_size)
{
auto ba = xs::load_aligned (&a[i]);
auto bb = xs::load_aligned (&b[i]);
auto bres = (ba + bb) / 2 .;
bres. store_aligned (&res[i]);
}
for (std:: size_t i = vec_size; i < size; ++i)
{
res[i] = (a[i] + b[i]) / 2 .;
}
}构建测试需要CMAKE。
cmake可作为大多数Linux发行版的软件包可用。此外,它们也可以与conda软件包管理器(即使在Windows上)安装:
conda install -c conda-forge cmake安装了cmake后,您可以构建并运行测试:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest在与Travis CI连续集成的背景下,在conda环境中进行测试,可以用它激活
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestXSIMD的文档是用三个工具构建的
虽然必须单独安装doxygen,但您可以通过打字来安装呼吸
pip install breathe呼吸也可以与conda一起安装
conda install -c conda-forge breathe最后,用
make html从docs子目录。
我们使用共享的版权模型,使所有贡献者能够维护其贡献的版权。
该软件是根据BSD-3-CAREASE许可证获得许可的。有关详细信息,请参见许可证文件。