Optimization 零件优化的宏观或技术?

Optimization 零件优化的宏观或技术?,optimization,gcc,compilation,Optimization,Gcc,Compilation,我正在使用g++编译器研究无锁结构。似乎使用-o1开关,g++将更改代码的执行顺序。我怎样才能禁止g++对代码的某些部分进行优化,同时保持对其他部分的优化?我知道我可以将它拆分为两个文件并链接它们,但它看起来很难看。您可以使用函数属性“\uu attribute\uuuu((优化0))”为单个函数设置优化,或者为代码块设置“\pragma GCC optimize”。不过,我认为这些仅适用于GCC4.4,请查看您的GCC手册。如果它们不受支持,分离源代码是您唯一的选择 不过,我还想说,如果您的代

我正在使用g++编译器研究无锁结构。似乎使用-o1开关,g++将更改代码的执行顺序。我怎样才能禁止g++对代码的某些部分进行优化,同时保持对其他部分的优化?我知道我可以将它拆分为两个文件并链接它们,但它看起来很难看。

您可以使用函数属性“\uu attribute\uuuu((优化0))”为单个函数设置优化,或者为代码块设置“\pragma GCC optimize”。不过,我认为这些仅适用于GCC4.4,请查看您的GCC手册。如果它们不受支持,分离源代码是您唯一的选择


不过,我还想说,如果您的代码在启用优化的情况下失败,那么很可能您的代码就是错误的,特别是当您试图做一些基本上非常困难的事情时。处理器可能会对您的代码执行重新排序(在顺序一致性的限制范围内),因此您使用GCC获得的任何重新排序都可能发生。

您可以使用函数属性“\uuu attribute”\uuu((优化0))”来设置单个函数的优化,或“\pragma GCC optimize”对于一段代码。不过,我认为这些仅适用于GCC4.4,请查看您的GCC手册。如果它们不受支持,分离源代码是您唯一的选择


不过,我还想说,如果您的代码在启用优化的情况下失败,那么很可能您的代码就是错误的,特别是当您试图做一些基本上非常困难的事情时。处理器将潜在地对代码进行重新排序(在顺序一致性的限制内),所以无论如何,GCC中的任何重新排序都有可能发生。

< P>如果发现GCC改变了代码中的执行顺序,则应该考虑使用内存屏障。只是不要假设易变变量会保护您免受该问题的影响。他们将只确保在单个线程中,行为是语言保证的,并且将始终从其内存位置读取变量,以说明对执行代码“不可见”的更改。(例如,信号处理程序对变量进行的更改)

GCC从4.2版开始支持OpenMP。您可以使用它创建一个带有特殊
#pragma
指令的内存屏障


一个非常好的关于无锁定代码的见解,这是萨特和Andrei Alexandrescu的PDF:

< P>如果你发现GCC改变了代码中的执行顺序,你应该考虑使用内存障碍。只是不要假设易变变量会保护您免受该问题的影响。他们将只确保在单个线程中,行为是语言保证的,并且将始终从其内存位置读取变量,以说明对执行代码“不可见”的更改。(例如,信号处理程序对变量进行的更改)

GCC从4.2版开始支持OpenMP。您可以使用它创建一个带有特殊
#pragma
指令的内存屏障


Herb Sutter和Andrei Alexandrescu的这篇PDF是关于自由锁定代码的一个很好的见解:

你能显示订单更改的代码部分吗?你能显示订单更改的代码部分吗?很好的链接,我真的很喜欢那篇文章。根据问题的具体情况,可变变量可以解决问题。它们将保证彼此之间的有序访问,但不考虑非易失性数据。内存障碍是答案,但是在GCC中是否有独立于平台的方法来创建内存障碍?我认为gcc将在clobber列表中指定为“m”的内联汇编块视为完全障碍,但除此之外,我不知道。对,我的答案很模糊。相对于同一线程中的其他易失性读/写,它不会对易失性读/写进行重新排序。不跨越线程边界。我将编辑为ClearRGCC有内置的功能,我相信它可以创建用于此目的的围栏。我将阅读并添加它们。感谢您的更新,尽管这是一个古老的URL,但我认为这是正确的URL:但仍有一些粗略之处。C++0x将解决所有问题。。。。我希望如此!很好的链接,我真的很喜欢那篇文章。根据问题的具体情况,可变变量可以解决问题。它们将保证彼此之间的有序访问,但不考虑非易失性数据。内存障碍是答案,但是在GCC中是否有独立于平台的方法来创建内存障碍?我认为gcc将在clobber列表中指定为“m”的内联汇编块视为完全障碍,但除此之外,我不知道。对,我的答案很模糊。相对于同一线程中的其他易失性读/写,它不会对易失性读/写进行重新排序。不跨越线程边界。我将编辑为ClearRGCC有内置的功能,我相信它可以创建用于此目的的围栏。我将阅读并添加它们。感谢您的更新,尽管这是一个古老的URL,但我认为这是正确的URL:但仍有一些粗略之处。C++0x将解决所有问题。。。。我希望如此!