我想交换两个变量,并且我想通过使用 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
如何在没有自动锁定和警告标志的情况下告诉编译器这样做(并且仅仅是这样做)?你能推荐一些相关文献/关键字吗?
规格:
-> 目标:支持多站点(超过4个)流水线的现代架构
-> 这与任何特定“问题”无关。只是为了科学研究而已。
当前障碍:
- 如果您知道如何忽略数据风险,请分享。
T tmp = x; x = y; y = tmp;
(或者简单地使用std::swap(x, y)
)。我相信编译器会在架构限制的情况下始终选择最优化的方式。 - Oliver Charlesworth