C++-如何在C++中进行单指令多数据流计算?
我们x86体系的CPU指令集大多都是SIMD指令,在汇编中可以直接操作寄存器进行单指令多数据流的编程,我想知道在C++如何不依赖寄存器实现?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我们x86体系的CPU指令集大多都是SIMD指令,在汇编中可以直接操作寄存器进行单指令多数据流的编程,我想知道在C++如何不依赖寄存器实现?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
基本方法是这样的,你可以不用汇编的方式而用C的方式调用这些指令,VC++提供了一些内置的inline函数,叫做Compiler Intrinsics,直接用高级语言使用这些指令。可参考http://msdn.microsoft.com/zh-cn/library/bb892950.aspx
一般的代码: (当然,输出数组也可以是另外一个数组,下同)
view plain
uint8 a[10000];
for (int i=0;i<10000;++i)
a[i]=a[i]>>1;
使用SIMD思路的代码(4路数据流同时计算):
view plain
uint8 a[10000];
uint32* a32=(uint32*)a; //实际代码可能需要考虑内存访问对齐和边界处理问题,下同
for (int i=0;i<2500;++i){
uint32 c=a32[i]&0xFEFEFEFE;
a32[i]=c>>1;
}
这种是更高效的处理方式。