多くの開発者がAriane 5のバグを聞いたことがあるでしょう。航空宇宙工学の歴史における最も悪名高いソフトウェア障害の1つです。1996年6月4日、地球の磁気圏を研究するために4つのCluster衛星を軌道に打ち上げる予定だったAriane 5ロケットの初飛行中に発生しました。
バグ自体は、ロケットの誘導システムに関連するソフトウェアの問題でした。誘導システムで使用するために64ビット浮動小数点値を16ビット符号付き整数に変換するソフトウェアコンポーネントが、オーバーフローエラーによる未処理の例外を引き起こしました。最終的に、たった1行のコードが数百万ドルの損失をもたらす障害に寄与し、Ariane 5の打ち上げは歴史上最も高額なソフトウェア障害の1つとなりました。
しかし、数百万ドルの価値があったかもしれないコード行をご存知ですか?
それはこの有名なC++の1行でした: i = 0x5f3759df - (i >> 1);
この行は、逆平方根の計算を最適化するために、Quakeのコードに初めて登場しました。
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
逆平方根の最適化がなぜそれほど重要なのか?
逆平方根はビデオゲームのグラフィックス、特に3Dゲームエンジンで広く使われています。経路探索、ライティング、反射など、ゲームプログラミングの多くの側面がベクトルの正規化に大きく依存しており、それには逆平方根の演算が必要です。しかし、浮動小数点除算を伴う逆平方根の実行は、プロセッサにとって計算コストが高くつく可能性があります。Quake III Arenaのような高速で視覚的に没入感のあるゲームでは、これらの計算が毎秒数百万回発生します。そのため、これらの計算のわずかなパフォーマンス向上でも、グラフィックス処理を大幅に高速化し、ゲームのフレームレートを改善できました。逆平方根関数の計算コストを回避するため、id Tech 3エンジンのプログラマーたちは、非常に高速かつ正確な近似法を考案しました。

この巧妙な最適化がなければ、Quakeはゲーム業界のベンチマークとして同じ地位を達成できなかったかもしれません。
この革新的なソリューションの背後にいた才能ある人物は誰か?
AMD RTGの欧州ゲームエンジニアリングチームのシニアマネージャー、Rys Sommerfeldtは、2004年にこの関数の起源に関する 調査 を開始しました。調査は最終的にGreg Walshを作者として指し示しました。Greg Walshはコンピューティング界の巨匠です。Xerox PARCで最初のWYSIWYG(「what you see is what you get」)ワープロの開発に貢献し、Ardent Computerの共同設立にも携わりました。GregはArdent在籍中、Matlabの作者であるCleve Molerと緊密に協力しており、Gregが高速逆平方根関数のインスピレーションを得たのはCleveからだと語っています。
この話の教訓
一部の問題では、時間をかけて既成概念にとらわれずに考える価値があります。既成概念にとらわれずに考えるとは、従来の考え方から脱却し、問題に対する型破りで革新的かつ創造的なソリューションを探ることです。問題が解決しにくいときは、さまざまな角度から探る時間を取ってみてください。期待を超えるソリューションが見つかるかもしれません。
