Music TO GO!

2011年04月27日

コンパイラで音は変わるか?

MacのプレーヤーソフトであるAudirvanaのプログラマDamienさんがおもしろい試みをしています。
それは異なるコンパイラで作成された3つのバージョンをユーザーがブラインドで聞き比べて投票し、次の開発に反映するというものです。
USBケーブルで音が変わるか?なんていうのはもう当たり前、ミュージックプレーヤーソフトで音が変わるか?というのもいまどきなにをという感じで、ついにコンパイラで音が変わるのかという段階に突入したわけです。
Damienさんはこれを実証するために3通りの異なるビルドを作成して、ブラインドで投票を開始しました。これが一週間くらい前です。

http://www.audirvana.com/Site_2/Compiler_test.html

コンパイラというのは簡単に言うと人の書いたプログラムから機械が分かる実行コードを生成するソフトウエアのことです。OSのアップデートなどでビルドという言葉を聞いたことがあると思いますが、簡単に言うとそのビルドするためのソフトといってもよいでしょう。
以前XMOSでコンピューターオーディオのハード的な開発環境について書きましたが、今回はソフトウエアの開発環境とオーディオの音質の関係というわけです。ケーブルとかインシュレーターと違ってユーザーがなにか関与できるものではないのですが、ユーザーにアンケートをとって開発に役立てたというところが面白いところです。

具体的にいうと上のページでA、B、CはそれぞれGCC、LLVM、その混合です。
gccは良く知られているGNUのCコンパイラで、これは私も使ったことがあります。最近はプログラミングからは離れているのでLLVM(Low Level Virtual Machine)というのは知りませんでしたが、使い込まれて古いGCCに比べると新しい視点で設計されたのがLLVMということになると思います。下記記事によるとGCCより3割高速に実行できて、最適化においても5-10%品質が高いということです。
http://journal.mycom.co.jp/articles/2008/06/03/bsdcan6/index.html
アップル自体もLLVMに移行しているということです。ちなみにMacOSXネイティブの開発環境Cocoaの標準開発言語はObjective-Cで、これはNeXTから引き継いだものですね。


その投票結果は昨日発表されました。結果は下記のようになったようです。
http://www.computeraudiophile.com/content/New-OSX-Opensource-audiophile-player-Audirvana#comment-79478

A:30.3% (LLVM)
B:24.2% (GCC)
C:45.5% (LLVM+GCC)

そう大きな差はないんですが、興味深いのは別のコンパイラをまぜて使ったほうが評価が高かったということですね。
実際にAudirvanaの0.8.2はgccで作成されましたが、0.8.3はgcc+LLVMで作成されたようです。この割合は低レベルのルーチン(主にオーディオ出力)はgccで生成し、UIとかプレイリストはLLVMで生成するということです。以前はLLVMのみだったようですが、ためしに作った0.8.2の音質評価が良かったのでこうしたテストになったのでしょう。Audirvanaはかなりきわどい処理をしているようなので枯れたgccのほうが良いということもあるかもしれません。

なんでコンパイラで音が変わるかというと、そのポイントになるのは上で書いた最適化の品質が高くなるということだと思います。実際に同じコンパイラでも最適化スイッチをいじると音は異なってくるということです。
ここでコンパイラと最適化の関係についてちょっと考えてみます。たとえばX=A+B; Y=C+D; Z=E+F; ...のような計算をするときは普通に考えると頭から一ステップずつ計算して行くように思えますが、それは人間の頭が同時にひとつしか実行できないからです。プロセッサがいくつも平行に処理できるのであれば、A+Bの計算をしているときに少し先のE+Fを同時にやって結果を出していれば全体的には高速に実行できます。
しかし、途中に条件分岐があったり、後の計算が先の計算に影響を受けていたりするとそう簡単ではありません。現代のCPUでは予測分岐という手法で本来はその時点でないとどちらに分岐するか分からないのに、あらかじめ分岐を仮定して計算してしまうということも行われます。
もうこうなってくると人間の頭ではとうていついていけませんが、こうしてプロセッサの特性を生かした最適化をするような実行コードを生成するということをしないと現代のプロセッサはまったく性能を発揮することができません。
つまりは最終的にCPUが実行するコードの並びを決定するのは実際は人が書いたプログラムではなくコンパイラですから、同じソースコードでもコンパイラ次第で実行の効率というのは左右されるということです。ですからコンパイラを変えるというのはちょっとサービス止めたりするよりも大きくソフトウエアの実行に影響してもおかしくはありません。

それを考えると最新のLLVMで低レベルを処理したほうが良いようにも思えますが、そうならないのもまたオーディオかな、というところでしょうか。まさにコンピューターらしい理由で音質を追及するわけですが、最後の調整は人の耳というのも面白いところかもしれません。
posted by ささき at 23:23 | TrackBack(0) | __→ PCオーディオ・ソフト編 | このブログの読者になる | 更新情報をチェックする

この記事へのトラックバック