9

我想交换两个变量。我想通过管道使用写后读危险来完成它,这对我有利。

管道:

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 个)流水线的现代架构

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

目前的障碍:

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

2 回答 2

3

我建议您阅读英特尔优化手册的第一部分。然后你会意识到一个现代的、无序的、推测性的 CPU 甚至不尊重你的汇编语言。操纵管道对您有利?根据这份文件,我会说——算了吧。

于 2011-12-09T14:45:23.020 回答
0

这取决于您的目标 CPU 和编译器。你也没有指定。

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

一般来说,除非你在一个非常专业的架构上并且你对执行有完整的汇编级控制,否则你将无法带着这个想法去任何地方。

于 2011-12-09T19:10:09.507 回答