s****n 发帖数: 700 | 1 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。
-o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个
是什么原因呢。
谢谢 |
c****p 发帖数: 6474 | 2 优化的flag难道不是-O1 -O2和-O3么。。。
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
N***m 发帖数: 4460 | 3 03优化容易出错阿。
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
t****t 发帖数: 6806 | 4 FT, 哪有这种道理. 99%是自己程序写错了.
【在 N***m 的大作中提到】 : 03优化容易出错阿。
|
a****l 发帖数: 8211 | 5 most probably because you used some "clever" tricks.
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
b******n 发帖数: 592 | 6 O3用了一些优化的浮点运算,SSE运算的精度也会不同。你使用的都是双精度还是单精
度的
计算?一般情况下O2就好了,O3很多时候让程序变大,速度其实差不多。如果你很在意
的话,试试profile based optimization
【在 a****l 的大作中提到】 : most probably because you used some "clever" tricks.
|
t****t 发帖数: 6806 | 7 No, -O3 will not do that. -Ofast will do that (which implies -ffast-math).
SSE is different from x87, but whether SSE or x87 does not depend on -O
option.
【在 b******n 的大作中提到】 : O3用了一些优化的浮点运算,SSE运算的精度也会不同。你使用的都是双精度还是单精 : 度的 : 计算?一般情况下O2就好了,O3很多时候让程序变大,速度其实差不多。如果你很在意 : 的话,试试profile based optimization
|
a***y 发帖数: 2803 | 8 都加了哪些library进去?
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
N***m 发帖数: 4460 | 9 我搞数值计算这么多年,很多经验都是前辈们传授的,
自己不会去揪根刨底的。
比如说这个03优化,我被告知就容易出错的。
当然我也遇到过不少次03优化出错的,所以也就不觉得有啥奇怪的了
【在 t****t 的大作中提到】 : FT, 哪有这种道理. 99%是自己程序写错了.
|
t****t 发帖数: 6806 | 10 我不是专业搞数值计算的, 但是O3理论上应该结果跟O2一模一样. 至少gcc是这样. 数
学的sse和x87确实结果会不一样, 但那是-fpmath=sse和-fpmath=x87的结果. -ffast-
math会使用不合标准的数学计算, 但是O3并不会激活这个开关.
至于O3出错, 99%是自己写得不对. 写数值计算的人往往不太注意C/C++的规则, 也很正
常.
【在 N***m 的大作中提到】 : 我搞数值计算这么多年,很多经验都是前辈们传授的, : 自己不会去揪根刨底的。 : 比如说这个03优化,我被告知就容易出错的。 : 当然我也遇到过不少次03优化出错的,所以也就不觉得有啥奇怪的了
|
|
|
N***m 发帖数: 4460 | 11 具体情况不清楚,每次编好调试02 03比较结果,相同的话才用03放到服务器上。
【在 t****t 的大作中提到】 : 我不是专业搞数值计算的, 但是O3理论上应该结果跟O2一模一样. 至少gcc是这样. 数 : 学的sse和x87确实结果会不一样, 但那是-fpmath=sse和-fpmath=x87的结果. -ffast- : math会使用不合标准的数学计算, 但是O3并不会激活这个开关. : 至于O3出错, 99%是自己写得不对. 写数值计算的人往往不太注意C/C++的规则, 也很正 : 常.
|
w***g 发帖数: 5958 | 12 有可能是变量没初始化...
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
b******n 发帖数: 592 | 13 You are very right. -O3 doesn't turn on -ffast-math. In my experience, -O3
doesn't always give the speed improvement you'd expected. In some cases, it
can be
slower than -O2.
【在 t****t 的大作中提到】 : No, -O3 will not do that. -Ofast will do that (which implies -ffast-math). : SSE is different from x87, but whether SSE or x87 does not depend on -O : option.
|
c***r 发帖数: 1570 | 14 o3 means matrix-2-matrix optimazation.
most of time, o2(vector-2-matrix) is sufficient |
c****p 发帖数: 6474 | 15 ms某些情况下O3会过度,导致O2下正确的程序在O3时会和预期不一致
【在 t****t 的大作中提到】 : FT, 哪有这种道理. 99%是自己程序写错了.
|
t****t 发帖数: 6806 | 16 口说无凭, 给个例子来看看.
【在 c****p 的大作中提到】 : ms某些情况下O3会过度,导致O2下正确的程序在O3时会和预期不一致
|
m***x 发帖数: 492 | 17 O3 出错的原因是程序有很微妙的错误。最好弄明白为什么。
【在 N***m 的大作中提到】 : 我搞数值计算这么多年,很多经验都是前辈们传授的, : 自己不会去揪根刨底的。 : 比如说这个03优化,我被告知就容易出错的。 : 当然我也遇到过不少次03优化出错的,所以也就不觉得有啥奇怪的了
|
N***m 发帖数: 4460 | 18 It is very unlikely. because another team used fortran and we use c and
we got same results wihtout 03. that's why I think I can never understand
what's happenning underhood.
【在 m***x 的大作中提到】 : O3 出错的原因是程序有很微妙的错误。最好弄明白为什么。
|
t****t 发帖数: 6806 | 19 hehe, 我敢肯定99.999%是你们自己的错. O2的结果正确完全不能说明任何问题. 我建
议你用valgrind跑一次, 估计有一半机会找到uninitialized error.
【在 N***m 的大作中提到】 : It is very unlikely. because another team used fortran and we use c and : we got same results wihtout 03. that's why I think I can never understand : what's happenning underhood.
|
S*********g 发帖数: 5298 | 20 同意,应该是什么地方没初始化。
这个问题我也自己也碰到过
【在 t****t 的大作中提到】 : hehe, 我敢肯定99.999%是你们自己的错. O2的结果正确完全不能说明任何问题. 我建 : 议你用valgrind跑一次, 估计有一半机会找到uninitialized error.
|
|
|
N***m 发帖数: 4460 | 21 maybe you are right,不过现在没机会了去试了。
初始化为什么对于03那么重要?
【在 t****t 的大作中提到】 : hehe, 我敢肯定99.999%是你们自己的错. O2的结果正确完全不能说明任何问题. 我建 : 议你用valgrind跑一次, 估计有一半机会找到uninitialized error.
|
w***g 发帖数: 5958 | 22 我说的不一定对啊。不过下面这个例子可以帮助你理解为什么优化会导致出错。比如有
两个变量
int a, b;
都在没有初始化的时候就用了。没有经过优化的话a和b用的是不同的内存地址,那么它
们在程序开始运行的时候会被自动初始化为0,程序能正常运行。根据C语言标准,没有
初始化的变量的值是没有定义的,但是有些情况下(如果变量在.bss section)操作系统
会自动用0来初始化这些变量。
如果程序里a的最后一次使用在b的第一次使用之前,那么编译器就会优化变量分配,使
得b和a用同一个地址。这时a和b其实已经是一个变量了。a在第一次使用的时候还是0,
但是b在第一次使用的时候往往就不是0了,于是程序就会出错。
变量没初始化这个错误非常常见,最典型的表现就是-O2下程序运行正确,-O3出错。而
且每次运行的行为都一样,没有随机性。
【在 N***m 的大作中提到】 : maybe you are right,不过现在没机会了去试了。 : 初始化为什么对于03那么重要?
|
t****t 发帖数: 6806 | 23 是这种意思, 但是你的例子不太对. 全局变量绝对不会share地址, 局部变量有可能
share, 也有可能根本没地址, 但是局部变量未初始化在编译时会有警告.
【在 w***g 的大作中提到】 : 我说的不一定对啊。不过下面这个例子可以帮助你理解为什么优化会导致出错。比如有 : 两个变量 : int a, b; : 都在没有初始化的时候就用了。没有经过优化的话a和b用的是不同的内存地址,那么它 : 们在程序开始运行的时候会被自动初始化为0,程序能正常运行。根据C语言标准,没有 : 初始化的变量的值是没有定义的,但是有些情况下(如果变量在.bss section)操作系统 : 会自动用0来初始化这些变量。 : 如果程序里a的最后一次使用在b的第一次使用之前,那么编译器就会优化变量分配,使 : 得b和a用同一个地址。这时a和b其实已经是一个变量了。a在第一次使用的时候还是0, : 但是b在第一次使用的时候往往就不是0了,于是程序就会出错。
|
M**u 发帖数: 10158 | 24 99.99%是程序bug
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
N***m 发帖数: 4460 | 25 不是太确定你的意思。还有其他什么情况?
如果只是局部变量没初始化,那我基本可以肯定不是初始化的问题了,
因为编译要求没警告才算通过。
【在 t****t 的大作中提到】 : 是这种意思, 但是你的例子不太对. 全局变量绝对不会share地址, 局部变量有可能 : share, 也有可能根本没地址, 但是局部变量未初始化在编译时会有警告.
|
t****t 发帖数: 6806 | 26 你加-Wall -pedantic-error 了吗?
还有的情况, 当然就是分配了内存没初始化啊. 一般自动变量问题不太大, 手动就比较
麻烦了.
【在 N***m 的大作中提到】 : 不是太确定你的意思。还有其他什么情况? : 如果只是局部变量没初始化,那我基本可以肯定不是初始化的问题了, : 因为编译要求没警告才算通过。
|
N***m 发帖数: 4460 | 27 只加了-wall, 后面那个什么用处?
【在 t****t 的大作中提到】 : 你加-Wall -pedantic-error 了吗? : 还有的情况, 当然就是分配了内存没初始化啊. 一般自动变量问题不太大, 手动就比较 : 麻烦了.
|
c***a 发帖数: 84 | 28 你这种情况,如果程序有undefined behavior都可能发生。简单的例子除未初始化外,
有访问越界,overflow, 等等。
【在 N***m 的大作中提到】 : 不是太确定你的意思。还有其他什么情况? : 如果只是局部变量没初始化,那我基本可以肯定不是初始化的问题了, : 因为编译要求没警告才算通过。
|
N***m 发帖数: 4460 | 29 谢谢指出。这些个情况一般情况下还真不知道怎么调试出来,
除非程序自己抱错。
【在 c***a 的大作中提到】 : 你这种情况,如果程序有undefined behavior都可能发生。简单的例子除未初始化外, : 有访问越界,overflow, 等等。
|
t****t 发帖数: 6806 | 30 valgrind is your friend.
【在 N***m 的大作中提到】 : 谢谢指出。这些个情况一般情况下还真不知道怎么调试出来, : 除非程序自己抱错。
|
|
|
L***n 发帖数: 6727 | 31 什么样的不规范C++能让O2出正确结果O3不出正确结果?我也很想知道
【在 t****t 的大作中提到】 : 我不是专业搞数值计算的, 但是O3理论上应该结果跟O2一模一样. 至少gcc是这样. 数 : 学的sse和x87确实结果会不一样, 但那是-fpmath=sse和-fpmath=x87的结果. -ffast- : math会使用不合标准的数学计算, 但是O3并不会激活这个开关. : 至于O3出错, 99%是自己写得不对. 写数值计算的人往往不太注意C/C++的规则, 也很正 : 常.
|
L***n 发帖数: 6727 | 32 受教了
【在 w***g 的大作中提到】 : 我说的不一定对啊。不过下面这个例子可以帮助你理解为什么优化会导致出错。比如有 : 两个变量 : int a, b; : 都在没有初始化的时候就用了。没有经过优化的话a和b用的是不同的内存地址,那么它 : 们在程序开始运行的时候会被自动初始化为0,程序能正常运行。根据C语言标准,没有 : 初始化的变量的值是没有定义的,但是有些情况下(如果变量在.bss section)操作系统 : 会自动用0来初始化这些变量。 : 如果程序里a的最后一次使用在b的第一次使用之前,那么编译器就会优化变量分配,使 : 得b和a用同一个地址。这时a和b其实已经是一个变量了。a在第一次使用的时候还是0, : 但是b在第一次使用的时候往往就不是0了,于是程序就会出错。
|
t*****n 发帖数: 4908 | 33 老实说,gcc是个baby。它有很多行为是无法理解。我们不是写编译器的,能用就行了。
不信你试一试ceil()这个标准的数学函数。结果会让你大吃一惊。
http://stackoverflow.com/questions/3323900/passing-double-types
【在 s****n 的大作中提到】 : 我有一个程序, 就是用了一些math function. 我用gcc编译的时候试图优化一下。 : -o 01 和 -o 02的输出结果是一样的, 但是-o 03的结果就完全不一样。 不知道这个 : 是什么原因呢。 : 谢谢
|
t****t 发帖数: 6806 | 34 this has nothing to do with ceil; it's intel's 64bit vs 80bit math. on
modern cpu and 64bit gcc, all math is done in sse and this should not be a
problem.
了。
【在 t*****n 的大作中提到】 : 老实说,gcc是个baby。它有很多行为是无法理解。我们不是写编译器的,能用就行了。 : 不信你试一试ceil()这个标准的数学函数。结果会让你大吃一惊。 : http://stackoverflow.com/questions/3323900/passing-double-types
|
t****t 发帖数: 6806 | 35 and it's controllable. you need to use option -fexcess-precision= and
-ffloat-store
了。
【在 t*****n 的大作中提到】 : 老实说,gcc是个baby。它有很多行为是无法理解。我们不是写编译器的,能用就行了。 : 不信你试一试ceil()这个标准的数学函数。结果会让你大吃一惊。 : http://stackoverflow.com/questions/3323900/passing-double-types
|
a***y 发帖数: 2803 | 36 哈哈,记得原来一个c语言的老师上课跟我们说,好多同学编程序,一上来就初始化一个变
量,有必要吗? 这个变量在2行之后就会被赋值.
这个后面有很深的原因.
不過programming确实就是高中生的玩艺,没啥高深的.有人吹嘘他8岁开始programming,
我也会相信.
【在 S*********g 的大作中提到】 : 同意,应该是什么地方没初始化。 : 这个问题我也自己也碰到过
|
a***y 发帖数: 2803 | 37 compiler也是人写的,人写的程序就会有bug
了。
【在 t*****n 的大作中提到】 : 老实说,gcc是个baby。它有很多行为是无法理解。我们不是写编译器的,能用就行了。 : 不信你试一试ceil()这个标准的数学函数。结果会让你大吃一惊。 : http://stackoverflow.com/questions/3323900/passing-double-types
|
a***y 发帖数: 2803 | 38 用这个程序
#include
using namespace std;
int main() {
int a;
cout << "a is " << a << endl;
}
在visual studio 2008里面,如果debug会出错;但是如果用visual studio 2008的
command prompt,用cl 来编译,会有warning:not initialized.但是会生成一个exe 文
件.运行exe文件,会显示 a is 1
可见visual studio里面对没初始化的变量没有一个统一的处理办法.
【在 t****t 的大作中提到】 : 是这种意思, 但是你的例子不太对. 全局变量绝对不会share地址, 局部变量有可能 : share, 也有可能根本没地址, 但是局部变量未初始化在编译时会有警告.
|
a***y 发帖数: 2803 | 39 compiler的编写者据说在写compiler的时候,考虑到了compiler的容错能力,毕竟如果这
个compiler太苛刻了,用户会选择其他的compiler来用.
这个和browser里面的容错能力一樣,所以有时候html文件里有错,但是browser还是会显
示正常.如果browser太苛刻,用户会考虑用其他的browser.
【在 a***y 的大作中提到】 : 用这个程序 : #include : using namespace std; : int main() { : int a; : cout << "a is " << a << endl; : } : 在visual studio 2008里面,如果debug会出错;但是如果用visual studio 2008的 : command prompt,用cl 来编译,会有warning:not initialized.但是会生成一个exe 文 : 件.运行exe文件,会显示 a is 1
|
p***o 发帖数: 1252 | 40 别逗了,你不会看编译选项不等于vs没考虑。
【在 a***y 的大作中提到】 : 用这个程序 : #include : using namespace std; : int main() { : int a; : cout << "a is " << a << endl; : } : 在visual studio 2008里面,如果debug会出错;但是如果用visual studio 2008的 : command prompt,用cl 来编译,会有warning:not initialized.但是会生成一个exe 文 : 件.运行exe文件,会显示 a is 1
|