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

C++ 交换变量(C+;+;,处理器级),c++,swap,processor,pipelining,C++,Swap,Processor,Pipelining,我想交换两个变量。我想通过管道使用读后写危害来实现这一点,这对我有利 管道: OPERXXXXXX FetchXXXXX DecodeXXXX ExecuteXXX WriteBkXXX STORE X, Y ---------- ---------- ---------- ---------- STORE Y, X STORE X, Y ---------- ---------- ---------- ---------- STORE Y, X STORE X, Y ---------- --

我想交换两个变量。我想通过管道使用读后写危害来实现这一点,这对我有利

管道:

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甚至不尊重您的汇编语言。操纵管道对你有利吗?基于此文档,我想说——算了。

      这取决于您针对的是哪个CPU和哪个编译器。您也没有指定

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


      一般来说,除非你在一个非常专业的体系结构中,并且你有完整的执行级的控制,否则你将无法去任何地方。这个问题是由CPU处理的,而不是编译器…C++抽象机没有指令流水线。您试图解决的实际问题是什么?@CLASSIFIED-在这种情况下,您最好用汇编语言为您感兴趣的体系结构编写整个内容。C++几乎不提供对底层硬件的访问(虽然编译器经常扩展语言以给你稍微多的控制)。+ 1对于一个有趣的问题,我不知道答案。@分类:如果你在移植之后,我建议写代码> T TMP= X;x=y;y=tmp(或者干脆
      std::swap(x,y)
      )。考虑到体系结构的局限性,我希望编译器总是能做最优化的事情。你是对的——可能根本不是完成它的最有效方式——但是它仍然尊重转换为单个微操作的指令。我还是要试着把它放进去。