交换变量(C ++,处理器级别)

9

我想交换两个变量,并且我想通过使用 Read After Write 风险来利用管道来完成。

管道:

OPERXXXXXX FetchXXXXX DecodeXXXX ExecuteXXX WriteBkXXX
STORE X, Y ---------- ---------- ---------- ----------
STORE Y, X STORE X, Y ---------- ---------- ----------
---------- STORE Y, X STORE X, Y ---------- ----------
---------- ---------- STORE Y, X STORE X, Y ----------
---------- ---------- ---------- STORE Y, X STORE X, Y
---------- ---------- ---------- ---------- STORE Y, X

如何在没有自动锁定和警告标志的情况下告诉编译器这样做(并且仅仅是这样做)?你能推荐一些相关文献/关键字吗?

规格:

  • -> 目标:支持多站点(超过4个)流水线的现代架构

  • -> 这与任何特定“问题”无关。只是为了科学研究而已。

当前障碍:

  • 如果您知道如何忽略数据风险,请分享。

6
处理流水线危险的是CPU而不是编译器。 - Oliver Charlesworth
3
C++ 的抽象机器没有指令流水线。你想解决的实际问题是什么? - Mankarse
2
@保密 - 在这种情况下,你最好使用你感兴趣的架构的汇编语言来编写整个程序。C++几乎没有访问底层硬件的权限(尽管编译器通常会扩展语言以提供稍微更多的控制权)。 - Mankarse
4
对于这个有趣的问题,我不知道答案,但我给它点个赞。 - John Dibling
6
如果你想要更高的可移植性,我建议写成 T tmp = x; x = y; y = tmp;(或者简单地使用 std::swap(x, y))。我相信编译器会在架构限制的情况下始终选择最优化的方式。 - Oliver Charlesworth
显示剩余19条评论
2个回答

3

我建议您阅读英特尔优化手册的前几部分。然后您就会意识到,现代的乱序、预测CPU甚至不尊重您的汇编语言。想要利用流水线来获得优势?根据这份文件,我会说——别想了。


你说得对 - 这可能不是最有效的完成方式 - 但它仍然遵循将转化为单个微操作的指令。我仍然会尝试把它放进去。 - CLASSIFIED

0

这取决于你针对的是哪个 CPU 和哪个编译器,你没有明确指定。

一般来说,CPU 会尽力假装所有事情都是按顺序执行的,即使实际上在幕后它是超标量执行的。试图利用风险的代码不会出错,但它会更慢地执行,因为 CPU 会等待风险消失后再继续执行。否则,几乎所有的代码都将在未来的 CPU 世代中失败,因为超标量行为正在增加。

一般来说,除非你使用的是非常专业的架构,并且你可以完全控制执行过程,否则你将无法实现这个想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接