gpumode · 강의 아카이브
《GPU Mode》 L027 2024 · JUL · 13 High priority transcript · available

gpu.cpp — Portable GPU compute using WebGPU

CUDA 없이도 GPU 위에서 일할 수 있는가 — Austin Huang 이 Answer.AI 에서 만든 gpu.cpp 는 WebGPU 표준 위에 얇은 C++ 헤더 한 장을 얹어 웹 브라우저, 데스크탑, AR/로보틱스 같은 새 form factor 까지 같은 코드로 GPU compute 를 띄운다는 약속을 깐 라이브러리. 그 약속을 가능하게 하는 WebGPU 의 layer 와, gpu.cpp 가 그 위에 올린 작은 추상의 학습 노트.

WebGPU WGSL gpu.cpp portable compute native + browser Dawn / wgpu hot-reload no Tensor Core Answer.AI
A
Speaker
Austin Huang
Answer.AI · gpu.cpp 저자 · 전 Google AI
강의 번호
L027
스피커
Austin Huang
학습 우선순위
High · 정독
다시 볼 때
WGSL 셰이더 직접 짜본다
§ 01강의가 풀려는 문제· why portable GPU compute

“CUDA 없이 GPU 코드를 한 번 짜면 어디서나 도는가” 의 새로운 답

CUDA 가 ML 의 표준이지만, CUDA 가 없는 자리가 많다 — 학생의 MacBook, AR 안경, 로봇 SoC, 웹 브라우저, 일반 사용자의 데스크탑. Austin 의 출발은 그 자리들 위에서 GPU compute 를 어떻게 띄울지의 질문이다.

강의가 답하려는 두 줄 —

  1. NVIDIA · AMD · Intel · Apple · Qualcomm 어디든 같은 GPU 코드 한 벌로 도달할 수 있는 spec 이 있는가 — 이 자리에 WebGPU 가 들어온다.
  2. 그 spec 을 직접 써보면 보일러플레이트가 살인적인데, 그걸 어떻게 줄일 것인가 — 이 자리에 gpu.cpp 가 들어온다.

강의의 인지적 frame 은 명시적이다. “CUDA 와 같은 자리에 ‘WebGPU + gpu.cpp’ 가 서면 어떤가” — 단, 같은 정점의 perf 를 노리는 게 아니라 접근성과 portability 의 다른 축에 가치를 둔다. 100% 의 perf 의 80% 를 따 내면서 100 배 더 많은 환경에서 돈다는 거래.

강의의 frame

“GPU compute 의 표준 진입점은 그동안 CUDA 였다. 그런데 CUDA 없이 GPU 위에서 의미 있는 일을 하는 길이 — 처음으로 — production-grade 로 깔리고 있다. WebGPU 가 그 길의 표준이고, gpu.cpp 가 그 길을 직접 코드 한 줄로 줄인다.”

“AR 안경, 로봇, 미래의 form factor 들 — 그들은 high-bandwidth video signal 을 실시간 처리해야 합니다. 그 자리에서 CUDA 는 없습니다. 그래도 GPU 가 거기 있죠.”Austin Huang · 03:14

그래서 강의 끝에 손에 잡혀야 할 것은 — WebGPU 의 4 추상(adapter, device, buffer, pipeline), WGSL 의 핵심 syntax(@compute, @workgroup_size), gpu.cpp 의 3 함수(createTensor, createKernel, dispatchKernel), 그리고 이 stack 의 한계가 어디서 시작되는지(Tensor Core 미접근, FP16 분기) 다.

§ 02WebGPU 가 여는 portability· spec · adapter · device

WebGPU 는 단순한 “브라우저용 OpenGL 후속” 이 아니라 일반 GPU 추상 spec

WebGPU 라는 이름이 “브라우저 그래픽” 만 떠올리게 하지만, Austin 이 명시적으로 정정한다. WebGPU 는 GPU 자체의 일반 추상 spec이고, 브라우저는 그 한 사용자다. 데스크탑 native 에서도 같은 spec 이 동일하게 돈다.

WebGPU 의 layer 위치를 명시적으로 잡으면 —

  • spec = W3C / Khronos 가 정의한 GPU API 추상. 함수와 객체 모양이 박혀 있다.
  • impl = vendor 가 spec 을 구현. 두 메이저 — Google 의 Dawn(C++) 과 Mozilla 의 wgpu(Rust). Chrome / Edge / Safari / Firefox 가 이들을 임베드.
  • backend = impl 이 그 아래의 native API 를 부른다. Windows: D3D12 / Vulkan, Linux: Vulkan, macOS: Metal, Android: Vulkan.

한 vendor 의 GPU 가 직접 노출되는 게 아니라, native API(D3D12/Vulkan/Metal) 위에 한 층이 더 얹힌다. 이 한 층이 portability 의 출발점이다.

FIG · WebGPU layer cakespec → impl → backend → driver
L4 · USER
JS / C++ / Rust / Python — gpu.cpp 가 여기
L3 · WebGPU spec
adapter · device · buffer · pipeline · queue
L2 · IMPL
Dawn (Chrome) · wgpu (Firefox/Rust)
L1 · BACKEND
D3D12 · Vulkan · Metal
L0 · DRIVER
vendor driver — NVIDIA · AMD · Intel · Apple · Qualcomm
SHADER LANG
WGSL → SPIR-V / DXIL / MSL
PORTABILITY
한 코드 → 5 vendor × 4 OS × 2 (web/native)
한계
NVIDIA mma, FP8, TMA 같은 vendor specific 명령은 직접 노출 안 됨
WebGPU 의 4 객체 — 항상 만난다

GPUAdapter(physical 카드 핸들) → GPUDevice(논리 device) → GPUBuffer(메모리) → GPUComputePipeline(컴파일된 shader). 한 device 위에 여러 buffer / pipeline. queue 가 dispatch 를 받는다. CUDA 의 (driver / context / cudaMalloc / kernel) 의 대응.

WebGPU 의 약속을 한 줄로 — “같은 코드가 NVIDIA · AMD · Intel · Apple · Qualcomm 위에서 모두 동작한다”. 단, 각 vendor 의 native API(CUDA, Metal Performance Shaders) 와 같은 정점의 perf 는 아니다. 그 갭의 이유가 § 07 의 본론.

§ 03WGSL 이라는 셰이더 언어· @compute · workgroup_size

CUDA 의 __global__ 자리에 들어가는 새 syntax

WebGPU 의 셰이더 언어는 WGSL (WebGPU Shading Language) 이다. Rust 에 영향받은 syntax. CUDA · GLSL · HLSL · Metal 의 디자인 결정을 종합한 결과물.

// WGSL — vector add compute shader
@group(0) @binding(0) var<storage, read>       a: array<f32>;
@group(0) @binding(1) var<storage, read>       b: array<f32>;
@group(0) @binding(2) var<storage, read_write> c: array<f32>;

@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
    let i = gid.x;
    if (i < arrayLength(&a)) {
        c[i] = a[i] + b[i];
    }
}

CUDA 와 비교 —

  • __global__@compute
  • blockDim.x = 256@workgroup_size(256)
  • threadIdx.x + blockIdx.x*blockDim.xgid.x (global_invocation_id)
  • __shared__var<workgroup>
  • __syncthreads()workgroupBarrier()
FIG · WGSL → backend shader 코드의 lowering한 셰이더, 세 native API
L0
WGSL
사용자가 짜는 코드
L1
Tint / Naga
WGSL 컴파일러
L2
SPIR-V
Vulkan backend
L2
DXIL
D3D12 backend
L2
MSL
Metal backend
한 WGSL 소스가 backend 별 IR 로 자동 transpile. Tint(Dawn) 또는 Naga(wgpu)가 그 일을 한다. SYCL 의 SPIR-V 와 같은 자리지만, WebGPU 의 IR 분기는 backend 별로 더 다양하다.
왜 WGSL 이 새로 등장했는가

WebGPU 가 SPIR-V 를 바로 받으면 보안 검증이 어렵다(브라우저 환경). 그래서 browser-friendly 한 high-level 텍스트 셰이더 언어가 새로 정의됐다. SPIR-V 는 backend로만 쓰임.

§ 04gpu.cpp 의 추상· createTensor · dispatchKernel

WebGPU 의 boilerplate 를 8 줄로 압축한 C++ 헤더 한 장

WebGPU 를 raw C API 로 직접 부르면 — Austin 의 표현 그대로 — “Vulkan 보다 작지만 여전히 수백 줄 보일러플레이트가 박힌다”. gpu.cpp 는 single-header C++ 라이브러리로 그 보일러플레이트를 3개의 함수로 줄인다.

// gpu.cpp — vector add 전체
#include "gpu.h"
using namespace gpu;

int main(){
  Context ctx       = createContext();      // adapter + device

  Tensor a = createTensor(ctx, {N}, kf32, dataA);
  Tensor b = createTensor(ctx, {N}, kf32, dataB);
  Tensor c = createTensor(ctx, {N}, kf32);

  Kernel k = createKernel(ctx, kAddShader,
                          Bindings{a, b, c},
                          /*workgroups=*/{N/256, 1, 1});

  std::promise<void> p;
  dispatchKernel(ctx, k, p);                 // async
  wait(ctx, p.get_future());

  toCPU(ctx, c, host_out, sizeof(host_out));
}

같은 일을 raw WebGPU C API 로 짜면 — instance request → adapter request → device request → buffer descriptor 4 개 → bind group layout → bind group → shader module → pipeline layout → pipeline → command encoder → compute pass → dispatch → submit → map → callback. 250+ 줄이 일반적.

gpu.cpp 의 핵심 디자인 결정 4 가지 —

  • Tensor 는 그냥 GPU buffer 의 wrapper — shape · dtype · 핸들. PyTorch 의 tensor 와 같은 마음.
  • Kernel 은 WGSL 소스 + binding 의 묶음 — workgroup 수까지 한 번에 박는다.
  • dispatchKernel 은 비동기 + future — 사용자가 promise 로 받아서 wait. CUDA 의 stream + event 패턴과 같은 마음.
  • 모든 게 single-header — 빌드 cost 가 최소. gpu.h 한 줄 include.
FIG · 같은 작업을 세 layer 로 — Vulkan vs raw WebGPU vs gpu.cppline count comparison
Vulkan compute
~800 줄
raw WebGPU C API
~250 줄
gpu.cpp
~15 줄
CUDA + cudart
~20 줄
강의에서 Austin 이 보여준 비교표 재구성. gpu.cpp 가 잡으려는 자리는 “CUDA 처럼 짧게 시작할 수 있는 GPU compute” 지만 portability 가 따라온다는 약속.
“Vulkan 으로 가장 작은 토이 커널 하나 띄우려고 800 줄을 짭니다. 보일러플레이트가 도구를 죽이는 거죠. WebGPU 가 그걸 줄였고, gpu.cpp 가 또 한 번 줄입니다.”Austin Huang · 12:48
§ 05Vulkan vs WebGPU 의 보일러플레이트· 800 lines vs 8 lines

CUDA 가 “쉽다” 고 느껴지는 진짜 이유 — 그리고 그게 WebGPU 에서도 가능해진 이유

Austin 이 강의에서 깐 작은 역사 — Vulkan 은 explicit 의 끝까지 갔다. 모든 메모리, 모든 동기화, 모든 pipeline 상태를 사용자가 박는다. 그게 driver 의 부담을 줄였지만 사용자의 부담을 폭발시켰다. WebGPU 는 그 사이의 절충 — explicit 의 핵심은 유지하되 default 를 박는다.

Vulkan compute
memory allocator사용자
descriptor pool사용자
image layout 전이사용자
queue family사용자
fence / semaphore사용자
shader compileSPIR-V (외부)
최소 토이 line count~800
WebGPU
memory allocatorimpl 자동
descriptor (bind group)한 줄
image layoutspec 추상화
queuedevice 당 1
syncspec 안 자동 + 명시 barrier
shader compileWGSL 소스 직접
최소 토이 line count~250 (raw)
CUDA
memory allocatorcudaMalloc
descriptor없음 (kernel arg)
layout해당 사항 없음
streamdefault + 사용자
synccudaDeviceSync · event
shader compilenvcc / NVRTC
최소 토이 line count~20

강의의 인사이트 — WebGPU 의 디자인 목표 자체가 “CUDA 의 ergonomics + portability”다. spec 위원회가 “Vulkan 의 explicit 은 너무 멀리 갔다” 는 합의에서 출발했다. 그래서 default value 가 풍부하고 (sampler, alignment, layout 등 자동), 동시에 vendor-extension 을 표준 안에 박지 않는다.

§ 06browser 와 native 의 같은 코드· Emscripten · Dawn

같은 main.cpp 가 데스크탑 binary 로도, 웹 브라우저 안 wasm 으로도 빌드된다

gpu.cpp 의 portability 의 한 차원이 다른 vendor(WebGPU 이 줌)이라면, 다른 한 차원은 browser ↔ native다. 같은 코드가 두 form factor 위에서 돈다.

FIG · 같은 gpu.cpp 코드의 두 빌드 경로native vs browser
NATIVE
main.cpp
clang++
link Dawn
D3D12/Vk/Metal
vendor driver
GPU 위 실행
BROWSER
main.cpp
emcc (Emscripten)
wasm
browser WebGPU
browser GPU proc
GPU 위 실행
두 경로의 중간 차이는 link 단계의 backend 만. 사용자 코드는 같다. 데모에서 Austin 이 같은 매트릭스 곱 코드를 데스크탑 터미널과 브라우저 탭에서 동시에 띄웠다.

이 portability 가 의미하는 시나리오들 —

  • 교육 / 데모 — GitHub Pages 같은 정적 호스팅에 WebGPU 데모를 올리면, 사용자가 자기 GPU 위에서 즉시 돈다. Triton / CUDA tutorial 이 직면한 “설치가 안 되는” 문제가 사라진다.
  • shader hot-reload — 데모 중 Austin 이 보여준 — 같은 process 가 도는 동안 WGSL 셰이더만 바꿔서 dispatch. GPU 위 buffer state 는 유지된다 (animation 의 “transition” 이 자연스럽게 잡힌다).
  • AR/로보틱스 SoC — 자체 native API 가 없어도 OpenGL ES / Vulkan 만 있으면 wgpu 가 동작.
  • LLM inference 데모 — Austin 이 직접 만든 Llama 1B inference 데모가 브라우저 탭에서 도는 사례.
# 같은 코드의 두 빌드 — gpu.cpp 의 CMake
# 1. Native — Dawn 정적 링크
cmake -B build -DGPUCPP_BACKEND=native
cmake --build build
./build/main                    # 데스크탑 GPU 위에서 실행

# 2. Browser — Emscripten
emcmake cmake -B build_web
cmake --build build_web
python -m http.server -d build_web 8000
# 브라우저로 localhost:8000 — 같은 코드 같은 GPU

이 두 빌드가 같은 셰이더와 같은 logic을 공유한다는 점이 강의의 데모 메시지다. Austin 의 한 세션은 shader-toy 스타일 그림이 같은 코드로 데스크탑 터미널과 브라우저 안에서 동시에 돌고 있었다.

§ 07한계 — Tensor Core 미접근· spec 의 보수성

“CUDA 의 80% 까지 닿는다” 가 사실인 자리와 거짓인 자리

Austin 이 강의에서 정직하게 깐 갭 — WebGPU 는 vendor-portable spec 이다 보니, NVIDIA mma / Tensor Core, FP8/INT4 같은 vendor specific 명령에 직접 닿지 않는다. GEMM perf 의 절반 이상이 이 명령에서 오는 모던 GPU 에서 결정적인 한계.

FIG · GEMM perf 의 진화 단계 — gpu.cpp 가 닿을 수 있는 자리Simon Boehm GEMM 시리즈 기준
naive (no shared)
~285 GF
+ shared mem tile
~700 GF
+ register tile
~1500 GF
+ vectorize / coalesce
~2700 GF
+ Tensor Core (mma)
~14 TF
FP32 RTX 4090 기준. gpu.cpp 가 직접 도달하는 한계는 4 번째 줄. mma 까지의 한 자리수 도약은 vendor specific 명령에 의존한다 — WebGPU spec 의 보수성이 거기서 정지한다.

강의에서 Austin 이 명시한 “닿지 않는 자리” —

  • Tensor Core (NVIDIA mma · WMMA) — WebGPU spec 에 직접 노출 안 됨. proposal 이 진행 중인 cooperative_matrix extension 이 이 자리.
  • FP16 / BF16 — “shader-f16” extension 으로 일부 backend 에서 지원. 항상 가능하진 않다.
  • FP8 / INT4 / INT8 dot — 표준에 없음. 양자화 inference 의 핵심인데 그렇다.
  • warp/subgroup primitivessubgroups extension 이 추가되는 중. shuffle / vote 같은 패턴이 그 안에 들어온다.
  • asynchronous copy (cp.async, TMA) — Hopper 의 핵심 명령. 표준에 없다.
strategic 갭

이 갭은 디자인 결정 — “표준은 vendor 평균에 맞춘다”는 합의에서 온다. Apple/Qualcomm 의 GPU 도 같은 spec 안에 살아야 하니까. 그래서 NVIDIA 의 최신 명령은 extension 으로만 들어올 수 있다. “가장 빠른 코드를 짜고 싶다면 여전히 vendor-native API” 라는 강의의 정직한 메시지가 여기서 나온다.

“gpu.cpp 의 약속은 ‘CUDA 의 100% 를 따라잡는다’ 가 아닙니다. 그건 vendor-native 의 자리예요. 우리가 잡으려는 건 — 훨씬 더 많은 자리에서 GPU compute 가 돌게 하는 것입니다.”Austin Huang · 47:30
§ 08사용 사례· shader-toy · LLM inference · AR

이미 만들어진 것 — 그리고 가능해 보이는 것

강의의 데모 시퀀스에서 Austin 이 직접 보여준 사례들과, gpu.cpp 가 가능하게 하는 새 form factor 들의 시나리오.

DEMO 1 · ShaderToy 스타일
x · y · t 를 입력으로 받아 intensity 를 출력하는 컴퓨트 셰이더. 한 process 가 도는 동안 WGSL 만 바꿔서 dispatch — GPU buffer state 가 유지되어 transition 이 자연스럽게 일어남.
DEMO 2 · GEMM 단계 시리즈
Simon Boehm 의 CUDA matmul worklog 를 그대로 WGSL 로 옮긴 시퀀스. naive → shared → register tile → vectorize. 각 단계의 코드를 직접 비교 가능한 학습 자료.
DEMO 3 · LLM inference
Llama-class 1B 모델을 WebGPU 위에서 inference. 브라우저 탭에서 도는 토큰 스트림. 양자화 weight 로 메모리 절약.
SCENARIO · AR / 로보틱스
CUDA 가 없는 SoC 에서 video signal 처리. Snapdragon · Mali · PowerVR · Apple Silicon 에서 같은 binary.

shader hot-reload 의 의미. 강의에서 Austin 이 보여준 인상적 데모 중 하나 — process 를 죽이지 않고 WGSL 셰이더만 교체해 dispatch. GPU buffer state 는 유지되니까 시뮬레이션의 “상태”가 그대로 다음 셰이더에 흘러간다. “GPU compute 의 livecoding” 이라는 새로운 작업 형태가 가능하다는 시연.

LLM inference 데모의 의미. 같은 모델 weight 가 — 데스크탑 native 에서는 WebGPU/Dawn 으로, 브라우저에서는 wasm + WebGPU 로, 각 vendor GPU 위에서 도는 길. 양자화로 weight 를 줄이면 1B 정도까지 브라우저 안에서도 의미 있게 돈다. “CUDA 가 필요 없는 LLM 추론” 의 한 길.

제일 흥미로운 시나리오 — Austin 의 시각

“Visual computing 과 ML 이 다시 만나는 자리” — AR 안경의 hand tracking, 로봇의 visual servoing, 라이브 비디오의 model inference. CUDA 가 가지 못하는 form factor 들에서 WebGPU 가 사실상 표준으로 굳어가는 중. gpu.cpp 같은 라이브러리가 거기서 진입 비용을 다시 한 번 줄인다.

§ 09발전 방향· subgroups · ML extension

spec 의 다음 단계 — 이 한계가 어디까지 풀리는가

강의 끝 Q&A 에서 다룬 다음 단계들. WebGPU 는 정적 spec 이 아니라 — Khronos / W3C 가 활발히 extension 을 추가하는 중.

subgroups
warp/subgroup level shuffle, vote, broadcast. 2024 후반 stable. Triton 의 tl.atomic_xor 같은 패턴이 가능해진다.
cooperative_matrix
Tensor Core / Matrix Core 의 portable 추상. proposal 진행 중. NVIDIA mma · Apple AMX · Intel XMX 를 한 입구로.
shader-f16
FP16 native. 일부 backend 에서 이미 지원. ML 워크로드의 메모리 절감.
push constants
매우 작은 uniform 데이터를 buffer 없이 dispatch 마다 박는 길. 토큰 generation 의 KV cache step 같은 패턴에 유용.
timestamp queries
GPU 위 정확한 timing. NCU 에 비할 정도의 깊이는 아니지만, 커널별 ms 측정의 표준 입구.
indirect dispatch
GPU 가 dispatch 인자를 결정. dynamic batching 의 입구.
“cooperative_matrix 가 spec 에 들어오는 그 시점이 — gpu.cpp 가 LLM inference 에서 vendor-native 와 진짜로 비교 가능해지는 자리입니다. 지금은 그 한 단계 직전이에요.”Austin Huang · 1:02:11
§ 10기억할 메모와 코드· key takeaways

다시 열었을 때 5분 안에 손에 잡혀야 할 것

WebGPU 의 위치
spec(W3C/Khronos) → impl(Dawn/wgpu) → backend(D3D12/Vulkan/Metal) → vendor driver. 단순한 “브라우저 OpenGL” 아님.
WebGPU 4 객체
adapter → device → buffer → pipeline. CUDA (driver/context/cudaMalloc/kernel) 의 대응.
WGSL syntax
@compute @workgroup_size(N), @builtin(global_invocation_id), var<storage,read_write>, workgroupBarrier().
gpu.cpp 3 함수
createTensor, createKernel, dispatchKernel. single-header. ~15 줄에 vector add 가 끝난다.
native ↔ browser 동일 코드
native 빌드는 Dawn 정적 링크, browser 빌드는 emscripten + wasm. 셰이더와 logic 은 동일.
한계의 자리
Tensor Core/mma 직접 노출 안 됨. FP8/INT4 없음. cp.async/TMA 없음. cooperative_matrix extension 이 그 길.
Vulkan vs WebGPU
Vulkan = explicit 의 끝. WebGPU = explicit + sane defaults. CUDA 의 ergonomics 를 portable 환경에 옮긴 시도.
사용 시나리오
학습/데모, browser LLM inference, AR/로봇 SoC, livecoding GPU compute. CUDA 가 없는 form factor 들.

손에 새기기 — 실습 시퀀스

  1. gpu.cpp 클론 + 첫 빌드git clone github.com/AnswerDotAI/gpu.cpp && cmake. native binary 가 자기 GPU 위에서 vector add 를 도는 것을 확인.
  2. 같은 코드를 브라우저 빌드 — emscripten 으로. localhost:8000 에서 같은 셰이더가 도는 것을 확인. 동시에 두 빌드를 띄워두면 portability 의 의미가 손에 잡힌다.
  3. WGSL 의 첫 셰이더@compute @workgroup_size(256) 으로 elementwise pow 를 짠다. global_invocation_id 의 의미를 직접 출력해서 본다.
  4. gpu.cpp 의 GEMM 단계 — repo 안 examples/matmul 시리즈. naive → shared → register tile 을 한 단계씩 따라간다. 같은 코드의 CUDA 버전이 있다면 PTX 와 WGSL → MSL/SPIR-V transpile 결과를 diff.
  5. WebGPU raw 와 gpu.cpp 의 비교 — 같은 vector add 를 raw WGPUDevice API 로 짜본다. 보일러플레이트의 양을 직접 손에 박는다.
  6. shader hot-reload 데모 재현 — 한 process 가 도는 동안 WGSL 파일을 watch + reload. animation 의 transition 이 자연스럽게 흐르는지 확인.
  7. LLM inference 데모 띄우기 — gpu.cpp 의 examples 에 Llama 1B 데모. 브라우저 탭에서 토큰이 나오는 것을 본 후, profiler 로 어떤 단계가 가장 오래 걸리는지 확인.
  8. cooperative_matrix proposal 읽기 — W3C 의 proposal 문서. 같은 추상이 NVIDIA mma · Apple AMX · Intel XMX 를 어떻게 한 입구로 묶으려 하는지 본다.
§ 11다른 강의로 이어지는 길· connections

이 강의의 도구가 다른 강의에 어떻게 다시 등장하는지

§ 12열린 질문· open questions

다음에 다시 들었을 때 직접 검증해야 할 것들

검증 메모

이 노트의 line count 비교(800 / 250 / 15 / 20)와 GEMM perf 단계 수치는 강의에서 Austin 이 보여준 슬라이드의 재구성. 자기 GPU 위에서 직접 측정해야 vendor 별 변동이 실제로 어떻게 분포하는지 손에 잡힌다.

← Lecture 026 SYCL Mode — Intel GPU 의 portable C++ stack Lecture 028 → Liger Kernel — Byron Hsu 의 Triton 으로 짠 LLM 학습 커널