由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 求GCC高手
相关主题
请问这个C++程序有什么问题吗[合集] a C++ template question (code inside)
请教一个基础C++问题[合集] 6个变态的C语言写的Hello World (ZZ)
C语言的变量都一定要放在stack上吗?C++ question
Valgrind报uninitialized value was created by a heap allocat (转载)tail call strange behavior on cl.exe
在 windows下的C++开发平台是不是 Dev-C++?瓶颈在哪儿?
程序中的各个变量/数组的内存地址是否会混在一起?问一个volatile和memcpy一起用的问题
面试被问到G++和GCC编译器的关系Eclipse JNI问题, 拜谢
Help: Another C++ compilation error on GCCC++ Boost怎么样,好用吗?
相关话题的讨论汇总
话题: o3话题: 初始化话题: o2话题: sse话题: gcc
进入Programming版参与讨论
1 (共1页)
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优化出错的,所以也就不觉得有啥奇怪的了

相关主题
程序中的各个变量/数组的内存地址是否会混在一起?[合集] a C++ template question (code inside)
面试被问到G++和GCC编译器的关系[合集] 6个变态的C语言写的Hello World (ZZ)
Help: Another C++ compilation error on GCCC++ question
进入Programming版参与讨论
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.

相关主题
tail call strange behavior on cl.exeEclipse JNI问题, 拜谢
瓶颈在哪儿?C++ Boost怎么样,好用吗?
问一个volatile和memcpy一起用的问题解释一下吧Re: C语言的前途
进入Programming版参与讨论
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 的大作中提到】
: 谢谢指出。这些个情况一般情况下还真不知道怎么调试出来,
: 除非程序自己抱错。

相关主题
问个字符串的基本问题请教一个基础C++问题
strcat()C语言的变量都一定要放在stack上吗?
请问这个C++程序有什么问题吗Valgrind报uninitialized value was created by a heap allocat (转载)
进入Programming版参与讨论
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

1 (共1页)
进入Programming版参与讨论
相关主题
C++ Boost怎么样,好用吗?在 windows下的C++开发平台是不是 Dev-C++?
解释一下吧Re: C语言的前途程序中的各个变量/数组的内存地址是否会混在一起?
问个字符串的基本问题面试被问到G++和GCC编译器的关系
strcat()Help: Another C++ compilation error on GCC
请问这个C++程序有什么问题吗[合集] a C++ template question (code inside)
请教一个基础C++问题[合集] 6个变态的C语言写的Hello World (ZZ)
C语言的变量都一定要放在stack上吗?C++ question
Valgrind报uninitialized value was created by a heap allocat (转载)tail call strange behavior on cl.exe
相关话题的讨论汇总
话题: o3话题: 初始化话题: o2话题: sse话题: gcc