x86アーキテクチャにおけるスタックの並び


 Pentiumやそれに続くx86のプロセッサーでは、倍精度の変数が8-byte並びになっていないと、かなりのパフォーマンスの損失があります。(2つ以上の因数というのは普通ではありません?? 原文 a factor of two or more is not unusual)
残念なことに、スタック(ローカル変数や、サブルーチンの引数が格納される場所)はIntel ABIでは8-byte並びになっていることは保証されていません。

 最近のgcc(Intel、Metrowerks、Microsoftなどの大多数のその他のコンパイラも同様)では、スタックを8-byte並びにすることができ、gccはこれをデフォルトでやってくれます(gccドキュメントの-mpreferred-stack-boundaryを参照)。もし、あなたのコンパイラがデフォルトでスタック並びを保証してくれるかどうか、定かでなければ確認するのがよいでしょう。

 残念なことに、gccはスタック並びを保つだけなので、結果としてスタックの始めの場所が、ちょうど良くないと、その後のデータはずっとちょうど良くない場所にあり続けるわけで、悲惨なほど性能が低下します(倍精度の場合)。これを防ぐためには、FFTWは並びを良くするために、必要であればスタックに刻みをもうけ、並びがきちんとしていないスタックをプログラムから読んでしまってもうまく動くようにしています。現在のところ、この刻みはgccとIntel Cコンパイラのみをサポートしています。その他のコンパイラをご利用の場合は、自分で解決してください。
 最近のgligc(GNU/Linux)は、スタックの始まりの適切に並べる機能を提供していていますが、古いバージョンや、他のOSについてはよく知りません。この問題が、時がたつにつれ、大した問題ではなくなることを望みます。
最終更新:2008年10月06日 10:29