この記事は理情 Advent Calendar 2024 20日目の記事として書かれました。 前日の記事とともRhoがお送りします。
これは何?
CPU実験の説明は省略します。ググればたくさん体験記が出てくるので
CPU実験には様々なバグが付き物です。折角プログラムをコンパイルできたと思ったのに何かがおかしい、だとかシミュレーター上の実行命令が明後日の方向に飛んでいく、というのは日常茶飯事です(;;) 実験中盤以降ではレイトレのプログラムをコンパイルし動かすことが多いと思われます。その過程で集まった正しくない画像を紹介し、将来レイトレをデバッグする24+n erの一助となれば幸いです。
レイトレ画像デバッグは過去に記事があるので、この記事は(多分)第2弾です。過去のものは上をご参照ください。
正しい画像

まごうことなき正解の画像です。1024*1024と無駄に高画質です。 最適化をほとんどかけていない時期に出力させたので2093億命令、シミュレーターで5時間ほどかかりました。シミュ高速化がんばります......*1
正しくない画像
無編

最も自明なレイトレ その1

最も自明なレイトレ その2
何も出て来ないときは大体コンパイラが間違っているイメージがあります。2番目の方はグローバル変数の初期化ミスらしいです。

根本的に間違っているときはコンパイラが壊れていることが多いです。これは最適化の途中で誕生した何か

寂しい...... シミュレーター上でのnotの挙動がバグっており、オブジェクトに対する判定が正しく行われていなかったのが原因でした。
有編


この2つはシミュレーターのバグ、主に浮動小数点演算のバグです。 要求精度を満たすように適度にサボった浮動小数点演算をシミュレートするときにバグがあるとこうなります。 FPU係のSystem Verilogを他言語に移植しようとするときにバグを埋め込むイメージがあります。以下に注意すべき点をいくつか列挙します。
- C/C++ではbit幅を超えたシフト演算は未定義
1ll<<100 みたいなものは0を返してほしい気持ちになりますが、残念ながら未定義動作です。観測範囲で少なくとも3つの班がこのバグを踏んでいました。ftoi(0)が0以外を返すときはこれを検証しましょう。
- unsigned int に対する単項マイナス演算子
C++だと定義はされているっぽい?謎の線が走っているバグはこれが原因だったらしいです
- finv,fsqrtのテーブル
IntelもFDIVのテーブル間違えるし仕方ない。FPU係さんにちゃんと確認とりましょう。

よく見るとタイヤの輝きが少し失われています。最適化の途中で共通部分式削除の判定が間違っており、Arrayが更新されなくなってしまった結果とのことです。

逆に正しさの欠片が見られるのすごい
おわりに
新たなバグが発生したら少しずつ追加するかもしれません。
画像を提供してくださった24er 1班, 4班, 5班, 6班の皆様ありがとうございました。
*1:これを出力したのは筆者のシミュレーター