C.W.K.
Stream
Lesson 05 of 05 · published

matrix_ops CLI — 일곱 personality

~12 min · matrices, cli, benchmark, tooling

Level 0Beginner
0 XP0/38 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

실행파일 하나, 모든 행렬 맛 — lab bench

이제 단일 command-line 도구 만들어서 어떤 행렬 맛이든 어떤 사이즈든 벤치마크할 수 있을 만큼 커널이 충분해. 이름 matrix_ops. Subcommand:

SubcommandArgs실행
add / sub / mul / div<ROWS> <COLS>2-D 인덱싱하는 element-wise op (Track 5)
gemv<ROWS> <COLS>BLAS-2: y = A·x
gemm-naive<M> <N> <K>출력 원소당 thread 하나 (Lesson 4)
gemm<M> <N> <K>Tiled, shared memory + register blocking

왜 만드냐? Vendor BLAS (Track 7)랑 자기 비교는 신뢰할 수 있는 안정된 test rig 필요해서. CLI가 dimension 받으니까 재컴파일 없이 size 스윕 가능.

RTX 4090 실제 숫자 (FP32):

OpSizeBW or Perf
add4096×4096167 GB/s
gemv8192×8192216 GB/s
gemm-naive512³0.41 TF/s
gemm-tiled2048³3.8 TF/s

Naive→tiled 9× 점프는 정확히 우리가 예측한 거: 16 KB shared-memory tile 각각이 다음 DRAM hit 전에 128× 더 많은 FMA 먹임.

Code

matrix_ops main() — argv dispatch·cuda
// matrix_ops.cu — 우리 커널 아무거나 돌리는 단일 실행파일
#include <cstdio>
#include <cstdlib>
#include <string>
// (커널 구현 생략; gemm_naive, gemm_tiled 등 가정)

int main(int argc, char** argv) {
    if (argc < 2) {
        fprintf(stderr,
            "Usage: matrix_ops <op> [args...]\n"
            "  add|sub|mul|div  <rows> <cols>\n"
            "  gemv             <rows> <cols>\n"
            "  gemm-naive       <M> <N> <K>\n"
            "  gemm             <M> <N> <K>\n");
        return 1;
    }
    std::string op = argv[1];
    if      (op == "add")        return run_add(argc, argv);
    else if (op == "gemm")       return run_gemm_tiled(argc, argv);
    else if (op == "gemm-naive") return run_gemm_naive(argc, argv);
    else if (op == "gemv")       return run_gemv(argc, argv);
    // ...
    fprintf(stderr, "Unknown op: %s\n", op.c_str());
    return 1;
}
Shell에서 사이즈 스윕 — 자기 roofline 생성·bash
# gemm 사이즈 스윕 + timing → CSV로 plot
echo 'M,N,K,tflops' > sweep.csv
for n in 256 512 1024 2048 4096; do
    out=$(./matrix_ops gemm $n $n $n)
    tflops=$(echo "$out" | awk '/TFLOP/ {print $NF}')
    echo "$n,$n,$n,$tflops" >> sweep.csv
done
cat sweep.csv
# Python에서 plot: pd.read_csv('sweep.csv').plot(x='M', y='tflops', ...)

External links

Exercise

쓸 수 있는 GPU에서 적어도 subcommand 셋 (add, gemm-naive, gemm) 가진 minimal matrix_ops 빌드. gemm subcommand에 size 256, 512, 1024, 2048, 4096 스윕. TFLOP/s vs size plot. naive 버전 곡선이 일찍 plateau (size 무관 bandwidth-bound), tiled 곡선은 Tensor Core 영역 (Track 8 다룸) 닿을 때까지 계속 올라가야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.