如何解决SSE指令在实践中有哪些优化?编译器如何启用和使用它们?
| 现在开始SSE和/或3D!有矢量指令,但实际上它们有哪些优化?例如,是否将8位字符用4比4而不是1比1对待?是否对某些算术运算进行了优化?字长是否有任何影响(16位,32位,64位)? 所有编译器在可用时都使用它们吗? 使用SSE指令真的需要了解汇编吗?了解电子学和门逻辑是否有助于理解这一点?解决方法
背景:SSE同时具有矢量和标量指令。 3天!死了
任何编译器在没有程序员帮助的情况下从向量化中获得有意义的好处的情况很少见。通过编程和实验,人们通常可以达到纯汇编的速度,而无需实际提及任何特定的矢量指令。有关详细信息,请参见编译器的矢量编程指南。
有一些可移植性的折衷。如果您为GCC的矢量化器编码,则可以使用非Intel架构(例如PowerPC和ARM),但不能使用其他编译器。如果使用Intel内部函数使C代码更像汇编语言,则可以使用其他编译器,但不能使用其他体系结构。
电子知识不会帮助您。将学习可用的说明。
,在一般情况下,您完全不能依靠编译器使用向量化指令。可以做到这一点(在许多简单情况下,英特尔的C ++编译器都可以做到这一点,而GCC也尝试这样做,但取得了不同的成功)
但是,想法只是将相同的操作应用于4个32位字(在某些情况下为2个64位值)。
因此,可以使用向量化加法代替传统的“加法”指令将两个不同的32位宽寄存器的值加在一起,而使用矢量化加法,它使用包含四个32位值的特殊128位宽寄存器,并将它们加在一起作为一次操作。
,其他问题重复:
使用SSE说明
简而言之,SSE是流式SIMD扩展的缩写,其中SIMD =单指令,多数据。这对于一次对多个值执行单个数学或逻辑运算很有用,就像通常对矩阵或矢量数学运算所做的那样。
编译器可以将此指令集作为优化的一部分(研究/ O选项),但是您通常必须重组代码并手动编码SSE,或者使用像Intel Performance Primitives这样的库来真正利用它。
,如果您知道自己在做什么,则可能会获得巨大的性能提升。例如,请参见此处,此人将该算法的性能提高了6倍。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。