SSE和/或3D吧!有矢量指令,但他们在实践中优化了什么?例如,8位字符是4乘4还是1乘1?某些算术运算是否有优化?字大小是否有效(16位,32位,64位)?
所有编译器在可用时是否使用它们?
是否真的必须了解汇编才能使用SSE指令?了解电子和门逻辑是否有助于理解这一点?
答案 0 :(得分:4)
背景:SSE有向量和标量指令。支持3DNow!已经死了。
如果没有程序员的帮助,任何编译器都无法从矢量化中获取有意义的好处。通过编程工作和实验,人们通常可以接近纯装配的速度,而无需实际提及任何特定的矢量指令。有关详细信息,请参阅编译器的矢量编程指南。
涉及几个可移植性权衡。如果您编写GCC的矢量化器代码,您可以使用非英特尔架构,如PowerPC和ARM,但不能使用其他编译器。如果您使用英特尔内在函数来使您的C代码更像汇编,那么您可以使用其他编译器,但不能使用其他架构。
电子知识对你没有帮助。学习可用的说明将会。
答案 1 :(得分:3)
在一般情况下,您不能依赖编译器在所有上使用矢量化指令。有些人(英特尔的C ++编译器在许多简单的情况下做了合理的工作,GCC也尝试这样做,并取得了不同的成功)
但这个想法只是将相同的操作应用于4个32位字(或某些情况下为2个64位值)。
因此,除了传统的“add”指令(将2个不同的32位宽寄存器的值加在一起)之外,您可以使用矢量化的add,它使用包含 four 32位值,并将它们作为单个操作一起添加。
答案 2 :(得分:1)
其他问题重复: Using SSE instructions
简而言之,SSE是Streaming SIMD Extensions的缩写,其中SIMD =单指令,多数据。这对于同时对多个值执行单个数学或逻辑运算非常有用,这通常用于矩阵或向量数学运算。
编译器可以将此指令集作为其优化的一部分(研究您的/ O选项),但是您通常必须重新构建代码并手动编写SSE代码,或使用像Intel Performance Primitives这样的库来真正利用它它的。
答案 3 :(得分:0)
如果您知道自己在做什么,可能会获得巨大的性能提升。参见例如here,其中这个人改进了他的算法的性能6次。