C++ MMX v/s SSE2性能比较

C++ MMX v/s SSE2性能比较,c++,performance,sse,simd,mmx,C++,Performance,Sse,Simd,Mmx,问题: 我将MMX转换为相应的SSE2代码。我预计会有1.5倍到2倍的加速。但两者的时间完全相同。为什么 场景: 我正在学习SIMD指令集及其性能比较。我执行了一个数组操作,这样,Z=X^2+Y^2其中X和Y是大型一维数组,类型为“char”。X和Y的值被限制在小于10,因此Z始终哈罗德的评论是绝对正确的。您正在处理的数组不适合您计算机上的缓存,因此您的计算完全受负载存储限制 我计算了当前一代i7上不同缓冲区长度的计算吞吐量,以及同一例程的吞吐量,除去加载和存储之外的所有内容: 我们在这里观察

问题:

我将MMX转换为相应的SSE2代码。我预计会有1.5倍到2倍的加速。但两者的时间完全相同。为什么

场景:


我正在学习SIMD指令集及其性能比较。我执行了一个数组操作,这样,
Z=X^2+Y^2
其中X和Y是大型一维数组,类型为“char”。X和Y的值被限制在小于10,因此Z始终哈罗德的评论是绝对正确的。您正在处理的数组不适合您计算机上的缓存,因此您的计算完全受负载存储限制

我计算了当前一代i7上不同缓冲区长度的计算吞吐量,以及同一例程的吞吐量,除去加载和存储之外的所有内容:

我们在这里观察到的是,一旦缓冲区变大,超出了三级缓存,您的计算吞吐量就会与实现的加载/存储带宽完全匹配。这告诉我们,处理数据的方式基本上没有什么区别(除非你让它慢了很多);计算速度受到处理器将数据移入/移出内存的能力的限制


如果您在较小的阵列上进行计时,您将看到两种实现之间的差异。

SSE代码中有一个
emms
,但这不应该导致这种情况。你的数组有多长?@harold:数组很大,大小=100000000字节。我把时间看得很重要。否则它会在0时间内发生,但这是个问题。这比缓存要大得多,所以瓶颈是主存吞吐量。你能再解释一下吗?阵列甚至都不适合缓存,所以它必须来自主存。那太慢了。显然比你正在做的计算要慢,这并不奇怪。我建议您更改阵列,使它们至少都适合L3,然后在必要时在同一阵列上运行几次基准测试。是的,您是对的。我将阵列更改为1MB大小,现在有了区别。但还有一个问题,现在我的SSE2代码比MMX快
3-5x
。可能吗?我想应该差不多是2倍。(我在同一个文件中调用C++、MMX和SSE,一个接一个。所以它会导致任何缓存效应吗?)还有一个问题,在你的图中,对于非常高的数据,算术运算就等于加载/存储操作。为什么?很好的图表,你用什么工具制作的?@Cameron:OSX上的数字,没什么特别的。