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