【发布时间】:2012-01-15 21:45:41
【问题描述】:
我想交换两个变量。我想通过管道使用写后读危险来完成它。
管道:
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 处理,而不是编译器...
-
C++ 抽象机没有指令流水线。您要解决的实际问题是什么?
-
@CLASSIFIED - 在这种情况下,您最好用汇编语言为您感兴趣的架构编写整个内容。C++ 几乎不提供对底层硬件的访问(尽管编译器经常扩展让您有更多控制权的语言)。
-
+1 回答一个我不知道答案的有趣问题。
-
@CLASSIFIED:如果您追求可移植性,那么我建议您写
T tmp = x; x = y; y = tmp;(或者干脆std::swap(x,y))。考虑到架构的限制,我希望编译器总是做最优化的事情。
标签: c++ swap processor pipelining