2007年9月16日の日記の3番目の記事へのコメント
■gogo
久しぶりにMP3エンコードしようと思ったら午後のこ〜だが動かんし.
NoSuKe@hakurei% gogo test.wav encode test.wav to test.mp3 GOGO-no-coda ver. 3.13 ( May. 20 2004 ) is a mp3 encoder based on lame 3.88, which is distributed under LGPL on http://www.mp3dev.org/mp3/ . See http://member.nifty.ne.jp/~pen/ , http://homepage1.nifty.com/herumi/gogo_e.html . [2] 28160 floating point exception gogo test.wav
あー,まさにこれだ.gcc4系で最適化云々で問題発生してるのかな? ビルドしなおしてログ見てみたら↓なのがちらほらと.
engine/quantize.c: In function 'amp_scalefac_bands': engine/quantize.c:290: 警告: dereferencing type-punned pointer will break strict-aliasing rules
あー,これはとソースを眺めてみたところ,やっぱ↓みたいなことしてますな.多分 floatをunsigned int とかにビット列として突っ込んで,IEEE 754の指数部とか仮数部とかゴリゴリいじったりするやつ.これって最近のgccで最適化かけまくるとはまったような・・・.
int imax; ・・・ imax = 0; ・・・ trigger = *(float *) &imax;
ここは↓みたいに共用体にしちゃうと,平和に上手くいったりする気がします.というわけで,一通りこんな風に書き換え.
typedef union { float f; int i; unsigned int u; } fint_u; ・・・ fint_u imax; ・・・ imax.i = 0; ・・・ trigger = imax.f;
・・・あれ,ダメだなぁ.うーん.
Makefileを見ると,デフォルトで「-O3 -fomit-frame-pointer -ffast-math -funroll-loops」とかつく模様.すごいな・・・.そしてとりあえず -ffast-mathが怪しいですねー.-ffast-mathを外してみたら,その他のオプションはそのままで問題なしでした.うーん.
-ffast-math をさらに分解してやったところ,どうも-funsafe-math-optimizationsがまずいっぽいです.というわけで,CFLAGSに-fno-unsafe-math-optimizationsを足したら落ちなくなりました. 不本意ながら,とりあえず今はこれで済ませることに.そのうちリベンジしてやるぜ.
configure.inを見ると,gccのバージョン見て最適化オプション変えてて,2.96とか3系は,みんな -O になってんですが,その他は上記デフォルトのオプションになっちゃうのね.本当は2.95系用のオプションってことか?
2007年9月16日の日記の3番目の記事へのコメント
[コメントを書く]