Slide 1

Slide 1 text

Go × SIMDで高速化するベクトル検索 ルーフラインモデルでSIMDが効く境界を探れ! Hiromu Nakamura (@po3rin)

Slide 2

Slide 2 text

Hiromu Nakamura Hiromu Nakamura AI-UX/MLOps TechLead AI/MLOps Engineer. Interested in Information Retrieval Nagoya Univ ~ Graduate School of Science M3, Inc. AI・ML Team MLOps & Data Engineering po3rin LayerX Inc. AI-UX/MLOps TechLead

Slide 3

Slide 3 text

1 Accelerating Vector Search with Go and SIMD ワークショップ用Repository https://github.com/po3rin/gocon2026-simd-search GitHub CodeSpaces だけ先に起動させておきましょう (立ち上げに少し時間がかかるため)。

Slide 4

Slide 4 text

Accelerating Vector Search with Go and SIMD 1. Introduction

Slide 5

Slide 5 text

2 Accelerating Vector Search with Go and SIMD Go × SIMD ワークショップへようこそ!!!

Slide 6

Slide 6 text

3 Accelerating Vector Search with Go and SIMD お題: 10万件のベクトル検索を高速化してください

Slide 7

Slide 7 text

4 Accelerating Vector Search with Go and SIMD ベクトル検索 (1)

Slide 8

Slide 8 text

5 Accelerating Vector Search with Go and SIMD ベクトル検索 (2)

Slide 9

Slide 9 text

6 Accelerating Vector Search with Go and SIMD これをGoに入ったSIMDで高速化するぞ!!

Slide 10

Slide 10 text

Accelerating Vector Search with Go and SIMD 2. What is SIMD ?

Slide 11

Slide 11 text

Accelerating Vector Search with Go and SIMD 7 SIMDって何? (1) 内積を普通に書くとこうなります。 fl 1命令で oat32 を1個。これをスカラ処理と呼びます。

Slide 12

Slide 12 text

8 Accelerating Vector Search with Go and SIMD SIMDって何? (2) SIMD(Single Instruction, Multiple Data)は、 1 命令で複数のデータを まとめて処理する CPU の機能。 fl 256bit のレジスタには oat32 が 8 個入ります。

Slide 13

Slide 13 text

9 Accelerating Vector Search with Go and SIMD Go 1.27 の SIMD パッケージ (1) GOEXPERIMENT=simd を付けると simd/archsimd が使えます(実験的機能)。 アセンブリも cgo も書かず、メソッド呼び出しがほぼそのまま 1 つの CPU 命令になりま す。FMA(Fused Multiply-Add)1 命令で 8 要素ぶんが片付きます。

Slide 14

Slide 14 text

Accelerating Vector Search with Go and SIMD archsimd で覚えることは 3 つ ① 型がデータの形 Float32x8 = oat32 を 8 レーン = 256bit。型を選ぶことが、使う命令幅 とレーン数を選ぶことになる ② メソッド = 1 命令 MulAdd → VFMADD、DotProductPairs → VPMADDWD ③ 実行時にガード 未対応 CPU で呼ぶと SIGILL で落ちる。archsimd.X86.AVX2() などのガー ドで確認してから使う (左が Go のメソッド名、右はコンパイルされて出てくる x86 の機械語の命令名) 対応は amd64、arm64、WebAssembly。 fl 10

Slide 15

Slide 15 text

11 Accelerating Vector Search with Go and SIMD ポータブルな simd パッケージ 1.27 で入った simd パッケージは型名からレーン数が消えます (Float32x8 -> Float32s) レーン数は実行時に CPU が決めます。

Slide 16

Slide 16 text

Accelerating Vector Search with Go and SIMD 3. Accelerating Vector Search with Go and SIMD

Slide 17

Slide 17 text

12 Accelerating Vector Search with Go and SIMD SIMD を使えば速くなるとは限らない 😭

Slide 18

Slide 18 text

13 Accelerating Vector Search with Go and SIMD 例えば、、、メモリ帯域の上限

Slide 19

Slide 19 text

14 Accelerating Vector Search with Go and SIMD やみくもに SIMD を足しても、効かないことのほうが多い。 何で詰まっているかを測ることが重要 そのための道具がルーフラインモデル🚗

Slide 20

Slide 20 text

15 Accelerating Vector Search with Go and SIMD ルーフラインモデル (1) ルーフ(上の線)がマシンが出せる速度の限界。左がメモリ帯域で決まる斜線、右が演算ピークで決まる水平線。 ルーフはマシンによって決まる。ルーフの計算方法はワークショップに記載。

Slide 21

Slide 21 text

Accelerating Vector Search with Go and SIMD 16 内積のスカラ全探索はルーフラインモデルでどこか? ベースライン 2.15 GFLOP/s は、メモリ帯域から決まる上限(約 10)にすら届いていない。 算術強度 … メモリから 1 バイト運ぶごとに何回計算するか * 計算:掛け算 1 回 + 足し算 1 回 = 2 op * 運ぶ量:DRAM から運ぶ要素は oat32 なので 4 byte fl fl fl fl 算術強度 = 2 op ÷ 4 byte = 0.5 op/byte

Slide 22

Slide 22 text

17 Accelerating Vector Search with Go and SIMD SIMDにしてもメモリ律速で止まる!! 全探索は 35.7 ms → 7.9 ms(4.5x)。速くなったがまだ上があるぞ。

Slide 23

Slide 23 text

18 Accelerating Vector Search with Go and SIMD 演算律速のエリアへ動かす ワークショップでは右上を目指していく!!

Slide 24

Slide 24 text

Accelerating Vector Search with Go and SIMD 4. Workshop

Slide 25

Slide 25 text

19 Accelerating Vector Search with Go and SIMD SIMDを動かしてみよう!ルーフラインモデルで高速化してみよう docs/workshop/setup.md の手順で Codespaces を起動して 教材を動かしてみましょう!!

Slide 26

Slide 26 text

Accelerating Vector Search with Go and SIMD 4. まとめ

Slide 27

Slide 27 text

20 Accelerating Vector Search with Go and SIMD 今日学んだこと * Go + SIMD の使い方。 * ルーフラインモデルの使い方 * (検索の世界の入り口)

Slide 28

Slide 28 text

21 Accelerating Vector Search with Go and SIMD 「SIMD ってやつを使ってるのに速くならない😭」と諦めず、 計測してボトルネックを突破していく、 そうやって SIMD と仲良くしていきましょう。

Slide 29

Slide 29 text

Go × SIMDで高速化するベクトル検索 ルーフラインモデルでSIMDが効く境界を探れ! Hiromu Nakamura (@po3rin)