VectorWare, Rust의 portable SIMD를 GPU 워프 위에서 그대로 실행하는 데 성공
- VectorWare가 Rust의
core::simd(portable SIMD)를 소스 코드 변경 없이 GPU에서 그대로 컴파일해 실행하는 데 성공했다고 발표함 - 기존에는 std::thread를 GPU 워프(warp)에 매핑해 스레드 단위 병렬성만 활용했는데, 이번에는 워프 내부의 32개 레인까지 SIMD로 활용함
Simd<i16, 32>같은 벡터 덧셈이 CPU에서는vpaddw명령어로, GPU에서는add.s16PTX 명령어로 각각 컴파일되어 동일한 Rust 코드가 두 플랫폼 모두에서 동작함- NVIDIA의 SIMT 모델(워프 하나가 명령어 하나를 32개 레인에 동시 실행)이 본질적으로 SIMD와 같다는 점을 이용해 워프를 하나의 넓은 벡터 유닛으로 취급함
- portable SIMD는
std가 아닌core에 있어서 VectorWare가 별도로 GPU에 포팅한 std 지원조차 필요 없이 동작함
Hacker News opinions
Rust-GPU 쪽에서 이런 좋은 작업 나오는 거 축하함, 계속 잘 되길
IR을 어떤 걸 타겟하는지 글에서 좀 애매하던데, SIMD-ized IR 예시랑 PTX로 매핑되는 과정 좀 보여줄 수 있어?
컴파일러 포크해서 쓰는 것 같은데 이거 만지고 싶은데 컴파일러 공개돼 있어?
벡터웨어 비즈니스 모델이 뭐야? 컨설팅 파는 거야 아니면 라이선스 파는 거야?
LLM 때문에 GPU 수요가 엄청난데, GPU를 더 잘 쓰면 경제적으로 이득 보는 작업이 뭐라고 생각해?
SIMD 관련 crate들에 대해선 어떻게 생각해?
이거 언젠가 CPU를 대체하려는 의도야?
relu를 배열 프로그래밍 DSL로 짜야 한다면 그냥 torch나 jax 쓰지 왜 이걸 써? MLIR 타겟팅하는 기존 솔루션들이 15년 전부터 이미 이 문제 풀고 있었는데 이게 뭘 새로 가져다주는지 모르겠음
나는 SIMD가 CPU 전용인 줄 알았는데 GPU에도 있다니 놀랐음
SIMD는 GPU가 효율적으로 동작하는 핵심 요소임, 그래서 branchless 프로그래밍이 이 분야에서 중요한 거임
GPU 코어라는 게 사실 CPU 입장에서 보면 SIMD 레인이랑 같음, CUDA 코어 1024개짜리 GPU는 사실 64와이드 SIMD 유닛 16개로 보면 됨
GPU는 진짜 SIMD가 아니라 SIMT임, AMD ISA 문서 보면 __mm256 같은 레지스터가 없고 스레드마다 스칼라 값만 다루는데 하드웨어가 32~64개씩 묶어서 같은 프로그램을 돌리는 거임, SIMD가 암묵적이라 프로그래밍 모델이 다름, Intel ISPC가 이걸 CPU에서 비슷하게 흉내낸 사례임
portable SIMD가 nightly에서만 되는 게 문제라서 나는 FFT crate에서 fearless_simd로 바꿨음
Rust는 원래 nightly에서 오래 묵혀두는 게 흔한 일이라 나쁘게 안 봄
GPU에서 러스트로 경쟁력 있는 복잡한 알고리즘 돌리는 예시 있어? radix sort 같은 거로 시작하면 좋을듯
portable SIMD라면서 SIMD 폭을 상수로 고정하니 결국 포터블이 아니잖아, 성능 포터블이라고 해야 맞을 듯
Go의 SIMD 구현은 벡터 크기 독립적이더라
SIMD가 원래 플랫폼별로 다른 게 당연한데 왜 포터블이어야 한다고 생각해?
각 SIMD ISA 간 교집합이 너무 적어서 진짜 포터블은 트리비얼한 경우 말고는 불가능함, 성능 신경쓰는 사람은 아키텍처별로 다른 자료구조와 알고리즘을 쓰게 됨
highway 같은 성숙도와 범위를 가진 오픈소스 러스트 SIMD 라이브러리가 있으면 좋겠음
그게 바로 fearless_simd가 목표하는 거임, 다만 그 정도 성숙도까진 시간이 걸릴 거임
최근 HN 프론트페이지에 SIMD 글이 유독 많던데 이유가 있나?
AI 때문에 SIMD 인트린식이 훨씬 접근하기 쉬워져서 이제 사람들이 추상화 작업을 많이 하는 것 같음
SIMD는 여전히 저평가돼 있음, 많은 경우에 공짜로 4배 얻을 수 있는데 프로그래머들이 항상 신경 써야 함