gpt4 book ai didi

c++ - MMX 与 SSE2 性能比较

转载 作者:太空狗 更新时间:2023-10-29 21:02:19 26 4
gpt4 key购买 nike

问题:

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

场景:

我正在学习 SIMD 指令集及其性能比较。我进行了一个数组操作, Z = X^2 + Y^2 其中 X 和 Y 是 “char” 类型的大型一维数组。 X 和 Y 的值被限制为小于 10,因此 Z 始终为 <255(1 字节)。 (不用担心任何溢出)。

我先写了它的C++代码,检查了它的时间。然后编写相应的 ASSEMBLY 代码(~3 倍加速)。然后我写了它的 MMX 代码(~12x v/s C++)。然后我将 MMX 转换为 SSE2 代码,它的速度与 MMX 代码完全相同。理论上,与 MMX 相比,我预计在 SSE2 中的加速约为 2 倍。

对于从 MMX 到 SSE2 的转换,我将所有 mmx reg 转换为 xmm reg。然后更改了一些运动指令等。

我的 MMX 和 SSE 代码粘贴在这里: https://gist.github.com/abidrahmank/5281486 (我不想把它们都贴在这里)

稍后从 main.cpp 文件调用这些函数,其中数组作为参数传递。

我做了什么:

1 - 我查阅了 Intel 和其他网站的一些优化手册。 SSE2 代码的主要问题是16 _memory 对齐。当我手动检查地址时,发现它们都是 16 _memory 对齐的。但是我同时使用了 MOVDQUMOVDQA,但两者都给出了相同的结果,并且与 MMX 相比没有加速。

2 - 我进入 Debug模式并检查每个寄存器值并执行指令。它们的执行方式与我想象的完全相同,即占用 16 个字节并输出 16 个字节。

资源:

我在 Windows 7 和 Visual C++ 2010 上使用 Intel Core i5 处理器。

问题:

那么最后一个问题是,为什么 SSE2 代码与 MMX 代码相比没有性能提升?我在 SSE 代码中做错了什么吗?或者还有其他解释吗?

最佳答案

Harold 的评论绝对正确。您正在处理的数组不适合您机器上的缓存,因此您的计算完全受加载存储限制。

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

throughput

我们在这里观察到的是,一旦缓冲区变得太大以至于超出了 L3 缓存,您的计算吞吐量将与实现的加载/存储带宽完全匹配。这告诉我们,您处理数据的方式基本上没有区别(除非您使其速度明显变慢);计算速度受到处理器将数据移入/移出内存的能力的限制。

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

关于c++ - MMX 与 SSE2 性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com