【问题标题】:Swapping Variables (C++, processor level)交换变量(C++,处理器级)
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 你是对的 - 可能根本不是完成它的最有效方法 - 但它仍然尊重转化为单个微操作的指令。我还是会努力把它弄进去。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多