为什么我的散点代码的性能比Vc SIMD更好
why the performance of my scatter code better than Vc SIMD?
我是SIMD程序的新手
unsigned int Hash(unsigned int f);
uint_v Hash(uint_v vec);
int main()
{
std::random_device rd;
unsigned* mem1=new unsigned [_size]();
for(int i=0;i<_size;++i)
mem1[i]=rd();
time_t t1=clock();
uint_v mem;
for(int i=0;i<_size;i+=uint_v::size())
{
mem.load(mem1+i,Vc::Unaligned);
uint_v temp=Hash(mem);
}
t1=clock()-t1;
std::cout<<"simd time:"<<(1.0*t1)/CLOCKS_PER_SEC<<"n";
time_t t2=clock();
for(int i=0;i<_size;++i)
unsigned int temp=Hash(mem1[i]);
t2=clock()-t2;
std::cout<<"normal time:"<<(1.0*t2)/CLOCKS_PER_SEC<<"n";
return 0;
}
unsigned int Hash(unsigned int f)
{
return (f>>7)^(f>>13)^(f>>21)^f;
}
uint_v Hash(uint_v vec)
{
uint_v mem=vec.apply([](unsigned f) ->unsigned{return (f>>7)^(f>>13)^(f>>21)^f;});
return mem;
}
我的代码如上所述,时间结果是:
simd时间:0.127762正常时间:0.034841
结果和比较mem1和mem2中的日期(Vc-uint_v矢量(
您没有测量您想要测量的内容。编译器将对您计算但从未使用过的所有内容进行死代码消除(好吧,编译器100%未使用过的内容(。编译器本应在两个循环上都执行DCE,但显然在Vc情况下未能执行。
想法:
- 将结果存储到全局变量
- 使用内联asm伪造对结果的使用
相关文章:
- 为什么constexpr的性能比正常表达式差
- 在现代C++中,侵入式容器是否仍然比非侵入式容器具有性能优势?
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- 每个编译器的C++性能,比C#慢200倍
- C++多线程性能比单线程代码慢
- 多线程功能性能比单线螺纹差
- 为什么使用openMP的VC++矩阵时间矢量比异步更快
- localtime() 比 Linux 上的 gmtime() 性能问题多 24 倍
- 为什么这个普通的数组实现比STD ::向量实现性能慢
- C:pthread的性能,比单线程低
- 全局对象是否提供比多个本地实例更好的性能
- 为什么 std::make_shared<>() 的性能比 boost::make_shared() 好得多?
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- 性能权衡-MATLAB何时比C/C++更好/更慢
- 为什么预分配的函数指针的性能比分支差
- 放炮的性能比先放炮后复核的性能差
- 为什么我的散点代码的性能比Vc SIMD更好
- 为什么 C++ fseek/fread 的性能比 C# FileStream 的 Seek/Read 高几倍
- 使用Eigen的性能比使用我自己的类更差
- OpenMP C++并行性能比八核集群更好的双核笔记本电脑