Mojo 0.26.2 で SIMD は本当に LLVM Vector に Lowering されるのか検証した
背景
Mojo には SIMD 型が存在する。
では実際にそれは LLVM IR 上で <8 x i32> のような vector 型に lowering され、AVX 命令へと変換されるのだろうか?
今回はその点を、LLVM IR レベルで直接検証した。
目的はシンプル:
Mojo の
SIMD[DType.int32, 8]は本当に LLVM vector 型に変換されるのか?
推測や期待ではなく、IR を見て判断する。
検証環境
- Mojo:
0.26.2.0.dev2026022305 - WSL2 Ubuntu
- AVX2 対応 CPU
最小検証コード
余計な要素を排除し、最小構成で検証する。
from builtin.simd import SIMD
comptime Vec8i = SIMD[DType.int32, 8]
fn main():
var x: Int32 = 3
var a = Vec8i(x)
var b = Vec8i(x + 1)
var c = a * b
print(c[0])
ここでやりたいのは:
SIMD[DType.int32, 8]- ベクトル同士の乗算
これが LLVM IR 上で <8 x i32> になるかを確認する。
LLVM IR の生成
Mojo から LLVM IR を出力:
mojo build test.mojo --emit llvm -o test.ll
次に vector 型を検索:
grep "<8 x i32>" test.ll
結果
検索結果:
(何も出ない)
IR 内に <8 x i32> は存在しなかった。
何が起きているのか
LLVM が AVX 命令を生成する条件は明確:
- IR に
<N x T>の vector 型が存在すること
例:
<8 x i32>
<4 x float>
これが存在して初めて LLVM backend が
- ymm レジスタ
- vpmulld
- vpaddd
などの SIMD 命令を生成する。
しかし今回の IR には:
i32
しか存在しなかった。
つまり:
このバージョンの Mojo では
SIMDが LLVM vector 型に lowering されていない。
結論
Mojo 0.26.2 nightly において:
-
SIMD型は存在する - 型チェックは通る
- コードはコンパイルできる
- しかし LLVM IR には vector 型が生成されない
したがって:
現時点では AVX 命令は生成されない。
これは CPU の問題ではない。
最適化レベルの問題でもない。
lowering pipeline の問題である。
実務的な示唆
もし目的が:
1️⃣ Mojo の言語設計や内部実装の研究
→ MLIR/LLVM lowering pipeline を追う価値がある。
2️⃣ 高性能 SIMD 実装(例:Bloom Filter)
→ 現段階では C++ + AVX2 intrinsics でベースラインを作る方が合理的。
Mojo SIMD はまだ IR レベルで vector へ到達していない。
まとめ
検証手順はシンプル:
- 最小 SIMD コードを書く
- LLVM IR を出力する
-
<N x T>を grep する
今回の結果:
<8 x i32>は存在しなかった。
推測ではなく、IR を見れば事実がわかる。
言語機能の成熟度を評価するには、
最終的に LLVM IR を見るのが最も確実な方法である。
今後は MLIR vector dialect への lowering がどう実装されるかを追跡すると面白い。。。