回答(15)
2 years ago
SSE指令是特定于处理器的 . 您可以在维基百科上查找哪个处理器支持哪个SSE版本 .
如果SSE代码更快或更快取决于许多因素:第一个当然是问题是内存限制还是CPU限制 . 如果内存总线是瓶颈,SSE将无济于事 . 尝试简化整数计算,如果这使代码更快,它可能受CPU限制,并且你很有可能加快它的速度 .
请注意,编写SIMD代码要比编写C代码困难得多,并且生成的代码更难以更改 . 始终保持C代码为最新,您需要将其作为注释并检查汇编代码的正确性 .
考虑使用类似IPP的库,它实现了针对各种处理器优化的常见低级SIMD操作 .
2 years ago
以SSE为例的SIMD允许您对多个数据块执行相同的操作 . 因此,使用SSE作为整数运算的直接替换,您将无法获得任何优势,只有在您可以同时对多个数据项执行操作时才会获得优势 . 这涉及加载一些在内存中连续的数据值,执行所需的处理,然后单步执行数组中的下一组值 .
问题:
1如果代码路径依赖于正在处理的数据,则SIMD变得更难实现 . 例如:
a = array [index];
a &= mask;
a >>= shift;
if (a < somevalue)
{
a += 2;
array [index] = a;
}
++index;
像SIMD一样不容易做到:
a1 = array [index] a2 = array [index+1] a3 = array [index+2] a4 = array [index+3]
a1 &= mask a2 &= mask a3 &= mask a4 &= mask
a1 >>= shift a2 >>= shift a3 >>= shift a4 >>= shift
if (a1
// help! can't conditionally perform this on each column, all columns must do the same thing</