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番目の記事へのコメント

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2007年9月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ