要約
というかタイトルのとおりですね。
Tenstorrentのアクセラレータ Blackhole p100a
で開発を行うべく、tt-metaliumというローレベルSDKをビルドしていたのですが、ビルドが通らなくて困りました。
具体的にはg++だったりllvmだったりがセグフォを起こしていました。
コンパイラがセグフォを起こすなんてのはなかなかないですが、変な入力を流し込んで解析用のスタック領域を使い切ったり、今回のように死にかけのメモリ領域のせいでポインタが明後日の方向を向いて無効ページフォルトを発生させたりする場合は起きるようです。
発生
ビルドをしようとしていたTT-metaliumは取り回しを考えてDocker(Podman)コンテナ内でビルドしていたのですが、ある時なんらかの事情でビルドをし直そうとしました。
数週間前にビルドした時はちゃんと通ったのですが、やり直そうとするとninjaによってコンパイラが呼び出されるとそれがSegmentation Faultを起こして死に、ビルド全体がエラーで停止する、という現象が突如発生しました。
厄介なことに前は通っていたので、ハードウェアが原因とは思わず、コンテナとかコンパイラの構成周りだとかに手を付けてみるもコンパイラが死ぬ状態は変わらず。

実はDRAMの故障だった
g++だかNinjaが表示したデバッグメッセージによりどうも表層のソフトウェア的な問題ではないっぽいことに、鈍感な筆者はようやく気づきました。

「このバグは再現できません。これはハードウェアかOSの問題かもしれません。」
OSも疑っていたのでOSの再インストールも考えましたが、ひとまず既存のディスクに影響を加えないmemtest86+を実行することにしました。
結果としては1200件のエラーがありました。これはひどい。
どのアドレス範囲に集中していたかは詳細を見ていないのでわかりませんが、16GB×2 + 32GB×1という変な挿しかたをしていたせいかもしれません。
解決
1枚だけ挿さっていた32GBが怪しそうだったので、このDIMMを引っこ抜きました。
そうしたらTT-metaliumのビルドも今度は何の問題もなく通りました。
ちなみにこれで2日くらい無駄になりましたからちょっと嫌なものです。
メモリエラーは怖いですね。できれば全マシンでECCを使いたいけど...無理ですね