xsimd简介
xsimd是C++的一个开源simd库,实现了对常见simd指令的封装,从而使得simd的操作更为简单。接下来先从两个简单的例子来入门xsimd。
void average(const std::vector& v1, const std::vector& v2, std::vector& v) {
int n = v.size(服务器托管网);
int size = xsimd::batch::size;
int loop = n - n % size;
for (int i = 0; i ::load_unaligned(&v1[i]);
auto b = xsimd::batch::load_unaligned(&v2[i]);
auto res = a + b;
res.store_unaligned(&v[i]);
}
for (int i = loop; i
上述demo实现了两个向量相加的操作,由于每次都能从vector当中加载size个数据,因此对剩余的不能进行vectorize的数据进行了分别处理。比如说,有一百个数据,每次处理8个数据,到最后剩下4个数不能凑到8,所以用朴素的迭代方式进行求和。这个demo是非对齐内存的处理方式。
using vector_type = std::vector&g服务器托管网t;;
std::vector v1(1000000), v2(1000000), v(1000000);
vector_type s1(1000000), s2(1000000), s(1000000);
void average_aligned(const vector_type& s1, const vector_type& s2, vector_type& s) {
int n = s.size();
int size = xsimd::batch::size;
int loop = n - n % size;
for (int i = 0; i ::load_aligned(&s1[i]);
auto b = xsimd::batch::load_aligned(&s2[i]);
auto res = a + b;
res.store_aligned(&s[i]);
}
for (int i = loop; i
要实现对齐内存的操作方式,我们必须对vector指定特定的分配器,不然最后运行出来的代码会出现segment fault。
总之,要记住常用的api,load_aligned, store_aligned, load_unaligned, store_unaligned,它们分别对应了内存对齐与否的处理方式。接下来我们再讲解另外一个demo,并且提供与openmp的性能对比。
auto sum(const std::vector&v) {
int n = v.size();
int size = xsimd::batch::size;
int loop = n - n % size;
double res{};
for (int i = 0; i ::load_unaligned(&v[i]);
res += xsimd::hadd(tmp);
}
for (int i = loop; i >& v) {
int n = v.size();
int size = xsimd::batch::size;
int loop = n - n % size;
double res{};
for (int i = 0; i ::load_aligned(&v[i]);
res += xsimd::hadd(tmp);
}
for (int i = loop; i
这个例子实现了对向量求和的功能。总体与前面基本一样,这里hadd是一个对向量求和的函数。
对于openmp的向量化实现,则较为简单,只需要在for循环上面加上特定指令即可。不过需要注意的是,openmp支持C语法,有一些C++的新特性可能并不支持,而且需要把花括号放到下一行,我们来看具体操作。
auto parallel_sum(const std::vector& v) {
double res{};
int n = v.size();
#pragma omp simd
for (int i = 0; i
不要忘记加上编译选项-fopenmp和-march=native,为了性能测试,我开启了O2优化,以下是简单的测试结果,数据规模是一千万。
一般情况下进行了内存对齐都会比没有对齐的要快一些,同时可以看到openmp与xsimd也差了一个量级。当然不同平台的结果可能会有差异,需要用更专业的工具进行测量比较。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 【SpringBoot】SpringBoot 优雅地校验参数
1、为什么要校验参数? 在日常的开发中,为了防止非法参数对业务造成影响,需要对接口的参数进行校验,以便正确性地入库。 例如:登录时,就需要判断用户名、密码等信息是否为空。虽然前端也有校验,但为了接口的安全性,后端接口还是有必要进行参数校验的。 同时,为了校验参…