C++ 約5分

AIボットは「i = 0x5f3759df - (i >> 1);」のようなC++の1行を生成できるか?

Share this article
AIボットは「i = 0x5f3759df - (i >> 1);」のようなC++の1行を生成できるか?

数百万ドルの価値があるC++のコード行をご存知ですか?

それは、この魔法のような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からだと語っています。

このコード行は暗号的で、巧妙で、ソフトウェア史上最も象徴的なコメントの1つが付いています。しかし、AI駆動開発の時代において、ますます関連性の高い問いを投げかけます:

AIはこれを書けただろうか?書くべきだったのか?もし書けないなら、なぜか?

短い答え: 正確には書けません。でも……ある意味では書けます。

GitHub Copilot、ChatGPT、Google GeminiなどのAIコード生成ツールは、十分なコンテキストを与えられれば、この行を確実に 「再現」 できます。

しかし、ここで重要なのは 「再現」であって、 「発明」と指示されない限り、これを出力する可能性は低いでしょう。

なぜ書けないのか?詳しく見てみましょう。

1. この行は「発見」されたのではなく、作り出された

定数 0x5f3759df は、試行錯誤と浮動小数点フォーマット(IEEE 754)の深い理解から導かれたマジックナンバーです。それには以下への洞察が必要でした:

  • 浮動小数点数のビットレベル表現
  • バイナリ近似テクニック
  • ゲームエンジンのパフォーマンスボトルネック

AIは これらのことを人間のように「理解する必要」はなく 、まさにこのトリックを示す学習データがなければ、ゼロから合成できる可能性は低いでしょう。

2. AIはパターンの合成には優れるが、発明はしない

LLM(大規模言語モデル)は人間が書いたコードから学習します。例を横断して一般化できますが、 数学的な意味で本質的に創造的ではありません。LLMがすることは:

  • 既知の概念を組み合わせる
  • 既知の構造を最適化する
  • 確率的に次のトークンを予測する

学習セットにこの行の ようなもの が含まれていない限り、新しい状況で自然に現れることは考えにくいのです。

3. この行は現代のコーディングではアンチパターン

ソフトウェアエンジニアリングの観点から、この行は:

  • 移植性がない
  • 安全でない(型パunningのため)
  • 読みにくく保守しにくい

現代のAIツール(特に「安全」や「クリーン」なコードの理念に沿ったもの)は、明示的に 「fast inverse square root hack」と指示されない限り、これを出力する可能性は低いでしょう。

AIがこれを 再現 できる場合

ChatGPTに次のように尋ねた場合:

「Quake IIIの高速逆平方根関数をCで書いて」

おそらくこう返ってきます:

float Q_rsqrt(float number) {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                  
    i  = 0x5f3759df - ( i >> 1 );          
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );
    return y;
}

GitHubやStackOverflowのコードで学習したAIツールは これを見たことがあるため、尋ねられれば喜んで共有するでしょう。

しかし、AIが 自発的に発明する ことはありません。最適化としてこの行を 1.0f / sqrt(x) 学習セットにそのハックが含まれているか、非常に具体的に促されない限り、ゼロから生み出すことはないのです。

人間とAIの創造性の違いがわかること

この行と、それに続く素晴らしいコメントは、人間の開発者がもたらすものを思い出させてくれます:

  • 洞察力:コストがどこにあるか、どんなトリックで直せるかを知る
  • リスクテイク:うまくいくから「邪悪な」ことをあえてやる
  • 探求心:実際に 仕事をこなす

今日のAIは支援、翻訳、最適化ができますが、このような行は 好奇心直感から生まれます。これは私たちがまだ機械に教えようとしている最中のものです。

最後に

さて、 AIはこの行をゼロから書けただろうか i = 0x5f3759df - (i >> 1);

まだできません。

AIが 真に 浮動小数点の内部構造、パフォーマンスハック、安全でないメモリ操作を探求し 第一原理から行えるようになるまでは、このような行を書き続けるのは人間であり続けるでしょう。

Share this article