gpt4 book ai didi

c++ - 为什么我的散点码性能比Vc SIMD好?

转载 作者:行者123 更新时间:2023-11-28 05:33:50 31 4
gpt4 key购买 nike

我是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 vector)

最佳答案

您没有衡量您打算衡量的内容。编译器将对您计算但从未使用过的所有内容进行死代码消除(好吧,编译器 100% 从未使用过的所有内容)。编译器应该在两个循环上都完成 DCE,但对于 Vc 情况显然没有这样做。

想法:

  • 将结果存储到一个全局变量
  • 使用内联汇编伪造结果

关于c++ - 为什么我的散点码性能比Vc SIMD好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38801358/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com