我想交换两个变量。我希望通过管道使用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
如何在不使用自动锁定和警告标志的情况下告诉编译器执行此操作(并且确切地说)?你能推荐任何文学/关键词?
规格:
- > target:支持多站点(超过4个)流水线的现代架构
- >这与任何特定的“问题”无关。只是为了科学。
答案 0 :(得分:3)
我建议您阅读Intel's optimization manual的第一部分。然后你会发现一个现代的,无序的,投机的CPU甚至不尊重你的汇编语言。操纵管道对您有利吗?根据这份文件,我要说 - 忘掉它。
答案 1 :(得分:0)
这取决于您要定位的CPU以及哪个编译器。你没有指定。
一般来说,CPU会竭尽全力假装所有内容都按顺序执行,即使实际上它在幕后超标。试图利用危险的代码不会中断,但它会执行得更慢,因为CPU会在继续之前等待危险清除。否则,随着超标量行为的增加,几乎所有代码都会在后续的CPU上失败。
一般情况下,除非你是一个非常专业的架构,并且你有完整的程序集级别的执行控制,否则你将无法随心所欲。