- 单击此处访问此问题的聊天室
我想交换两个变量。我想通过管道使用"写后读取"危害来完成这项工作。
管道:
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个以上(流水线的现代体系结构
->这与任何特定的"问题"无关。只是为了科学。
当前障碍:
- 如果你知道如何忽略数据危害,请分享
我建议您阅读英特尔优化手册的前几部分。然后你会意识到,一个现代的、无序的、推测性的CPU甚至不尊重你的汇编语言。操纵管道对您有利?基于这个文档,我想说——算了吧。
这取决于目标CPU和编译器。你也没有具体说明。
一般来说,CPU会不遗余力地假装一切都按顺序执行,即使事实上它在幕后是超标量的。试图利用危险的代码不会中断,而是执行得更慢,因为CPU会等待危险清除后再继续。否则,随着超标量行为的增加,几乎所有的代码都会在未来几代CPU上失败。
一般来说,除非您使用的是一个非常专业的体系结构,并且您对执行有完全的汇编级控制,否则您将无法实现这种想法。