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

时间:2011-12-08 12:53:15

标签: c++ swap processor pipelining

我想交换两个变量。我希望通过管道使用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个)流水线的现代架构

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

目前的障碍:

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

2 个答案:

答案 0 :(得分:3)

我建议您阅读Intel's optimization manual的第一部分。然后你会发现一个现代的,无序的,投机的CPU甚至不尊重你的汇编语言。操纵管道对您有利吗?根据这份文件,我要说 - 忘掉它。

答案 1 :(得分:0)

这取决于您要定位的CPU以及哪个编译器。你没有指定。

一般来说,CPU会竭尽全力假装所有内容都按顺序执行,即使实际上它在幕后超标。试图利用危险的代码不会中断,但它会执行得更慢,因为CPU会在继续之前等待危险清除。否则,随着超标量行为的增加,几乎所有代码都会在后续的CPU上失败。

一般情况下,除非你是一个非常专业的架构,并且你有完整的程序集级别的执行控制,否则你将无法随心所欲。

相关问题