1P by GN⁺ | ★ favorite | 댓글 1개
  • AMD CDNA 3는 CDNA 2가 FP64 슈퍼컴퓨팅에서는 성과를 냈지만 H100 대비 AI 성능과 통합 GPU 규모에서 밀렸던 지점을 보완하려는 컴퓨트 GPU 아키텍처임
  • MI300X는 8개 XCD에 총 304개 Compute Unit을 단일 GPU처럼 노출해, MI250X처럼 두 GPU와 별도 메모리 풀에 작업을 나눠야 했던 부담을 줄임
  • 메모리 계층은 256MB Infinity Cache, XCD당 4MB L2, CU 근처의 32KB L1로 재구성됐고, 이론상 17.2TB/s 캐시 대역폭을 제공하지만 통합 메모리 구성에서는 die-to-die 링크가 병목이 될 수 있음
  • 실행 유닛은 FP32 활용을 높이기 위해 듀얼 이슈에 가까운 구조와 SIMD당 추적 가능한 스레드 수 증가를 도입했고, 행렬 연산 처리량도 이전 CDNA 세대 대비 CU당 2배로 늘어남
  • CDNA 3의 핵심 변화는 메모리 계층과 패키징이며, MI300X는 대폭 늘어난 Infinity Fabric 대역폭으로 여러 칩렛을 하나의 대형 가속기처럼 보이게 설계됨

CDNA 3가 겨냥한 격차

  • AMD는 GPU 컴퓨트 시장에서 Nvidia를 따라잡기 위해 Terascale 3, GCN, CDNA/RDNA 분리를 거치며 아키텍처를 발전시켜 옴
  • CDNA 2 기반 MI250X와 MI210은 ORNL의 Frontier를 포함한 여러 슈퍼컴퓨터 계약을 따냈고, Frontier는 2023년 11월 TOP500 1위를 차지함
  • CDNA 2는 FP64 컴퓨트에서 견고하고 비용 효율적인 성능을 냈지만, H100은 AI 성능이 더 좋고 더 큰 통합 GPU를 제공함
  • CDNA 3는 AMD의 고급 패키징, Infinity Fabric, RDNA 계열 Infinity Cache, 개선된 Compute Unit을 결합해 이 격차를 줄이는 방향으로 설계됨

MI300X의 GPU 레이아웃

  • MI300X는 컴퓨트를 Accelerator Complex Die(XCD) 로 분리한 칩렛 구조를 사용함
    • XCD는 CDNA 2/RDNA 3의 Graphics Compute Die(GCD), Ryzen의 Core Complex Die(CCD)와 비슷한 역할을 함
    • CDNA 제품에는 RDNA 계열 전용 그래픽 하드웨어가 없기 때문에 AMD가 명칭을 바꾼 것으로 보임
  • 각 XCD에는 물리적으로 40개 CDNA 3 Compute Unit이 있으며, MI300X에서는 XCD당 38개가 활성화됨
    • XCD 하나에는 4MB L2 캐시가 있고 해당 다이의 모든 CU가 사용함
    • MI300X는 8개 XCD로 총 304개 Compute Unit을 제공함
  • MI250X의 220개 CU보다 크게 늘었고, MI300X는 이 CU들을 단일 GPU로 노출할 수 있음
    • MI250X에서는 각 GPU가 별도 메모리 풀을 가져 프로그래머가 두 GPU에 작업을 직접 나눠야 했음
  • Nvidia H100은 132개 Streaming Multiprocessor(SM)를 하나의 통합 GPU로 노출하지만, 대형 단일 다이에 컴퓨트를 구현하는 전통적 방식을 사용함
    • H100은 L2를 두 인스턴스로 나누며, 단일 SM은 50MB L2 전체를 사용할 수 있지만 25MB를 넘는 접근에는 성능 페널티가 있음
    • MI300X의 XCD는 다른 XCD의 L2 용량을 캐싱에 사용하지 않아, 캐시 용량 활용 면에서는 Nvidia 방식이 더 효율적임

Ponte Vecchio와의 구조 비교

  • Intel Ponte Vecchio(PVC) 는 Compute Tile을 기본 컴퓨트 블록으로 사용하며, 이는 CDNA 3의 XCD와 대략 대응됨
  • PVC의 Base Tile은 CDNA 3의 IO 다이와 비슷하게 큰 마지막 단계 캐시와 HBM 메모리 컨트롤러를 포함함
  • PVC 카드도 MI300X처럼 단일 GPU와 통합 메모리 풀로 노출될 수 있음
  • 두 구조의 차이는 칩렛 크기, 캐시 배치, 다이 간 링크에서 드러남
    • PVC의 Compute Tile은 8개 Xe Core로 구성되어, 38개 CU를 가진 CDNA 3 XCD보다 작음
    • Intel은 Compute Tile 전체 캐시 대신 더 큰 L1 캐시로 cross-die 트래픽 요구를 줄임
    • 2스택 Ponte Vecchio를 통합 GPU로 쓰면 EMIB 브리지가 230GB/s만 제공해, 모든 메모리 컨트롤러에 접근을 스트라이핑할 때 HBM 대역폭을 완전히 활용하기 어려움
    • Intel은 GPU를 NUMA 구성으로 다룰 수 있는 API를 제공함
  • 물리 구성에서는 CDNA 3가 IO 다이 간 높은 대역폭을 필요로 하고, PVC는 낮은 대역폭 EMIB 링크로 버티지만 네 가지 다이 타입과 서로 다른 공정·파운드리 때문에 설계가 복잡함
  • MI300X는 두 가지 다이 타입만 쓰며, 6nm와 5nm 모두 TSMC 공정임

Infinity Cache와 메모리 병목

  • 컴퓨트 성능은 수십 년 동안 메모리보다 빠르게 증가했고, GPU도 CPU처럼 더 정교한 캐시 전략으로 대응해 옴
  • CDNA 2는 8MB L2와 HBM2e에 의존하는 전통적 2단계 캐시 계층을 사용했지만, MI250X는 Nvidia H100보다 대역폭 부족이 더 컸음
  • CDNA 3는 RDNA 2에서 가져온 Infinity Cache를 추가함
    • MI300의 Infinity Cache는 기술 문서에서 Memory Attached Last Level(MALL)로 부르는 메모리 측 캐시임
    • L1·L2보다 Compute Unit에서 멀리 떨어져 있으며, 메모리 컨트롤러에 붙어 있음
    • 모든 메모리 트래픽이 Infinity Cache를 통과하고, IO 트래픽과 peer GPU 통신도 Infinity Cache 대역폭의 이점을 받을 수 있음
    • DRAM 내용의 최신 상태를 항상 보므로 snoop 같은 캐시 유지 작업을 처리할 필요가 없음
  • 메모리 측 캐시는 일반적으로 지연 시간이 더 높아, AMD는 CDNA 3와 RDNA 2 모두에서 다중 MB급 L2 캐시로 Compute Unit을 보호함

Infinity Cache 용량과 이론 대역폭

  • CDNA 3의 Infinity Cache는 RDNA 2처럼 16-way set associative 구조임
  • CDNA 3 구현은 용량보다 대역폭에 더 최적화되어 있음
    • 128개 slice로 구성됨
    • slice당 용량은 2MB, 읽기 대역폭은 사이클당 64바이트임
    • 전체 slice는 사이클당 8192바이트를 제공하며, 2.1GHz에서 17.2TB/s에 해당함
  • RDNA 2의 128MB Infinity Cache는 전체 slice 기준 사이클당 1024바이트, 2.5GHz에서 이론상 2.5TB/s를 제공함
    • die shots 기준 RDNA 2의 Infinity Cache slice는 4MB 용량과 사이클당 32바이트를 제공하는 것으로 보임
  • MI300X는 낮은 compute density를 가진 워크로드도 Infinity Cache hit를 충분히 얻으면 괜찮은 성능을 낼 수 있음
  • Infinity Cache 이론 대역폭으로 roofline 모델을 구성하면, MI300X는 로드된 바이트당 4.75 FLOPs로 전체 FP64 처리량에 도달할 수 있음
    • DRAM만 사용할 때는 로드된 바이트당 14.6~15 FLOPs가 필요함

Cross-die 대역폭의 제약

  • MI300X의 Infinity Fabric은 4개 IO 다이에 걸쳐 있고, 각 IO 다이는 2개 HBM stack과 관련 캐시 파티션에 연결됨
  • MI300X가 통합 메모리 풀을 가진 단일 논리 GPU로 동작할 때, die-to-die 연결 대역폭이 Infinity Cache의 전체 이론 대역폭 달성을 제한할 수 있음
  • 단일 IO 다이 파티션 기준 병목은 대역폭 계산에서 드러남
    • 인접 IO 다이와 맞닿은 두 edge에서 2.7TB/s ingress 대역폭을 가짐
    • 해당 IO 다이에 연결된 2개 XCD는 4.2TB/s Infinity Cache 대역폭을 얻을 수 있음
    • L2 miss 요청이 다이 전체에 균등 스트라이핑되면 3/4인 3.15TB/s가 peer die에서 와야 함
    • 3.15TB/s는 2.7TB/s보다 크므로 cross-die 대역폭이 캐시 대역폭을 제한함
  • 모든 다이가 통합 구성에서 최대 Infinity Cache 대역폭을 요구하면, 반대편 모서리 다이 간 전송이 2-hop을 필요로 해 ingress 대역폭을 추가로 소비함
  • MI300X를 여러 NUMA domain으로 나누면 합산 Infinity Cache 대역폭이 더 높아질 수 있음
  • 높은 L2 hit rate는 병목 가능성을 줄이고, Infinity Cache hit rate가 낮은 경우에는 MI300X의 die-to-die 링크가 HBM 트래픽을 처리하기에 충분한 대역폭을 제공함

XCD 간 일관성과 L2 동작

  • Infinity Cache는 일관성을 걱정할 필요가 없지만, L2 캐시는 별도 처리가 필요함
  • 일반 GPU 메모리 접근은 relaxed coherency model을 따르지만, 프로그래머는 atomics로 스레드 간 ordering을 강제할 수 있음
  • AMD GPU의 메모리 접근은 GLC(Global Level Coherent) bit로 표시될 수 있음
  • 이전 AMD GPU에서는 atomics와 coherent access가 L2에서 처리됨
    • GLC bit가 설정된 load는 L1을 우회하고 L2에서 최신 데이터를 가져옴
    • MI300X에서는 최신 cacheline이 다른 XCD의 L2에 있을 수 있어 이 방식만으로는 부족함
  • CDNA 3는 Ryzen의 Infinity Fabric처럼 XCD와 IO 다이 연결부에 Coherent Master(CM) 를 두고, 각 메모리 컨트롤러 옆에 Infinity Cache slice와 함께 Coherent Slave(CS)를 둠
    • Ryzen 문서를 통해 Coherent Slave에는 probe filter와 atomic transaction 처리를 위한 하드웨어가 있음을 알 수 있음
    • MI300X도 비슷한 CS 구현을 가진 것으로 보임
  • coherent write가 CS에 도착하면, GPU 어디에서 실행되는 스레드든 coherent read에서 해당 write를 관측할 수 있어야 함
    • 단순 구현이라면 CS가 모든 XCD의 L2를 probe해야 함
    • probe filter는 어떤 XCD가 해당 line을 캐시했는지 추적해 불필요한 probe traffic을 피함
    • CDNA 3 whitepaper는 snoop filter가 여러 XCD L2 캐시를 커버할 만큼 크다고 밝힘
  • 다만 XCD 내부의 CDNA 3는 기존 GPU와 비슷하게 동작함
    • 일반 메모리 write가 CPU처럼 peer cache의 line을 자동 invalidate하지 않음
    • 코드는 dirty L2 cache line을 writeback하고 peer L2 cache의 non-local L2 line을 invalidate하도록 명시해야 함
    • 관련 LLVM 문서는 GFX942 target에서 buffer_wbl2 sc1buffer_inv sc0 sc1 사용을 설명함

L2와 L1 캐시 개선

  • 각 MI300X XCD는 Compute Unit 가까이에 4MB L2 캐시를 가짐
    • L2는 16개 slice로 구성됨
    • 각 256KB slice는 사이클당 128바이트 대역폭을 제공함
    • 2.1GHz 기준 XCD당 4.3TB/s임
  • MI300X는 H100과 MI250X보다 L2 bandwidth-to-compute 비율이 높음
    • XCD마다 L2가 있어 CDNA 3 제품이 XCD를 늘릴수록 L2 대역폭도 자연스럽게 증가함
    • 하나의 큰 캐시에 많은 Compute Unit을 연결하면서 대역폭을 유지해야 하는 문제를 피함
  • PVC는 Compute Tile이 늘어날수록 Base Tile의 공유 L2에 더 많은 대역폭 요구가 걸림
    • PVC 구조는 L2가 일관성의 단일 지점이자 L1 miss의 backstop 역할을 하므로 캐시 설계 측면에서는 단순함
    • MI300X L2만큼 높은 대역폭은 제공하지 못함
  • CDNA 3의 L1도 대역폭 중심으로 개선됨
    • L1 throughput이 사이클당 64바이트에서 128바이트로 증가함
    • L1 용량도 16KB에서 32KB로 늘어남
    • 더 큰 캐시는 hit rate를 높여 평균 메모리 접근 지연 시간을 낮추고 실행 유닛 활용을 개선할 수 있음
    • L2 이상에서 데이터를 가져오는 비용이 전력을 쓰기 때문에 hit rate 증가는 전력 효율에도 도움이 될 수 있음
  • Ponte Vecchio는 L1 측면에서 여전히 강함
    • 각 Xe Core는 사이클당 512바이트를 제공함
    • L1 용량은 512KB임
    • L1에 맞는 memory-bound kernel은 Intel 구조에서 잘 동작할 수 있음
    • 다만 Compute Tile 수준의 mid-level cache가 없어 데이터가 L1을 넘으면 급격한 성능 하락을 겪을 수 있음

스케줄링과 실행 유닛

  • CDNA 3는 MI300X를 단일 GPU로 보이게 하는 칩렛·캐시 구조 외에도 Compute Unit 아키텍처를 반복 개선해 CDNA 2의 FP32 활용 문제를 다룸
  • CDNA 2는 FP64를 네이티브로 처리하면서 packed execution을 통해 double-rate FP32를 제공함
    • 컴파일러가 두 FP32 값을 인접 레지스터에 pack하고 같은 명령을 수행해야 했음
    • 프로그래머가 명시적으로 vector를 쓰지 않으면 컴파일러가 이를 잘 해내기 어려운 경우가 많았음
  • CDNA 3는 더 유연한 듀얼 이슈 메커니즘으로 이 문제를 우회함
    • RDNA 3의 VOPD/wave64 방식보다 GCN의 multi-issue 기능 확장에 가까운 것으로 보임
    • CU scheduler는 매 cycle 네 개 SIMD 중 하나를 고르고, 실행 준비가 된 스레드가 있는지 확인함
    • 여러 스레드가 준비되어 있으면 GCN은 최대 5개를 실행 유닛으로 보낼 수 있었음
  • CDNA 3의 듀얼 이슈는 컴파일러보다 프로그래머가 큰 dispatch size로 thread-level parallelism을 노출해야 효과가 날 가능성이 큼
    • SIMD가 더 많은 스레드를 실행 중이면 FP32 명령을 가진 두 스레드를 동시에 찾을 가능성이 커짐
    • 최소한 SIMD당 active thread 2개가 있어야 전체 FP32 처리량을 달성할 수 있음
    • 실제로는 memory latency나 execution latency 때문에 더 높은 occupancy가 필요함
  • AMD는 CDNA 3 SIMD가 추적할 수 있는 스레드 수를 8개에서 24개로 크게 늘림
    • 벡터 레지스터 파일 용량 증가는 언급되지 않았고, 이 용량은 SIMD가 동시에 유지할 수 있는 스레드 수를 제한하는 경우가 많음
    • 스레드당 register 사용량이 적은 단순 kernel에서 multi-issue 능력이 가장 잘 작동할 수 있음
  • 듀얼 이슈는 register file bandwidth도 문제로 만들 수 있음
    • CDNA 2의 packed FP32는 64-bit 값을 전달하는 넓은 register file port를 활용해 추가 read가 필요 없었음
    • 별도 명령은 서로 다른 register를 참조해 더 많은 read를 요구할 수 있음
    • AMD는 source caching을 세대적으로 개선해 vector register read 하나가 더 많은 downstream vector 또는 matrix operation을 지원하게 했다고 밝힘
    • 더 큰 register cache로 port conflict를 완화하고 실행 유닛에 데이터를 공급하는 방식일 가능성이 큼

행렬 연산과 AI 성능

  • 머신러닝 확산으로 행렬 곱셈의 중요성이 커졌고, Nvidia는 Volta와 Turing에서 tensor core를 추가해 이 영역에 크게 투자함
  • AMD CDNA도 matrix multiply를 지원했지만, 동시대 Nvidia 아키텍처는 FP16 같은 저정밀 데이터 타입의 행렬 처리량에 더 많이 투자함
  • MI300X는 이전 CDNA 세대 대비 CU당 matrix throughput을 2배로 늘림
  • MI300X의 칩렛 설계는 매우 많은 CU를 가능하게 해 전체 처리량을 키움
  • Nvidia는 SM당 matrix 성능이 높아 여전히 강력한 경쟁 상대이며, CDNA 3는 AMD의 흐름처럼 vector FP64 성능으로 Nvidia를 강하게 압박하면서 독립적으로는 강한 AI 성능을 유지함

명령어 캐시 변화

  • Compute Unit은 데이터 메모리 접근뿐 아니라 명령어 자체도 메모리에서 가져와야 함
  • GPU 코드는 전통적으로 단순하고 코드 크기가 작아 instruction delivery가 비교적 쉬웠음
  • CDNA 2와 RDNA GPU는 32KB instruction cache를 계속 사용했지만, CDNA 3는 이를 64KB로 늘림
    • associativity도 4-way에서 8-way로 증가함
    • 더 크고 복잡한 kernel에서 instruction cache hit rate를 높임
  • AMD는 CPU 코드를 GPU로 단순 이식한 경우를 염두에 둔 것으로 보임
    • 복잡한 CPU 코드는 GPU에서 부담이 될 수 있음
    • GPU는 긴 거리의 instruction prefetching과 정확한 branch prediction으로 instruction cache miss latency를 숨기기 어려움
    • 더 큰 instruction cache는 큰 kernel을 담는 데 도움이 되고, 높은 associativity는 conflict miss를 줄임
  • CDNA 3의 instruction cache instance는 CDNA 2처럼 두 Compute Unit이 공유함
    • GPU kernel은 보통 많은 Compute Unit을 채울 만큼 큰 work size로 실행되므로, instruction cache 공유는 SRAM을 효율적으로 쓰는 방식임
    • 더 많은 Compute Unit이 하나의 cache instance를 공유하면 instruction bandwidth 요구를 만족하기 어려울 수 있음

MI300X와 MI300A의 차이

  • CDNA 3의 가장 큰 세대 변화는 메모리 계층이며, 실제 핵심 개선도 Infinity Cache 추가에 있음
  • MI250X의 주요 문제는 하나의 GPU라기보다 같은 패키지를 공유하는 두 GPU에 가까웠다는 점임
    • 두 GCD 사이 대역폭은 방향당 200GB/s였음
    • AMD는 이 대역폭이 MI250X를 하나의 GPU로 보이게 하기에는 충분하지 않다고 판단해 die-to-die 대역폭을 크게 늘림
  • MI300은 East-West 전체 대역폭을 방향당 2.4TB/s로 늘려 MI250X 대비 12배 증가시킴
    • North-South 전체 대역폭은 방향당 3.0TB/s로 더 높음
    • 이 대역폭 증가로 MI300은 MI250X처럼 2개 가속기가 아니라 하나의 큰 통합 가속기처럼 보일 수 있음
  • 단일 IO 다이의 총 ingress bandwidth 4.0TB/s는 두 XCD가 사용할 수 있는 4.2TB/s와 거의 맞아 현실적으로 큰 문제가 되지 않음
    • 다만 단일 IO 다이는 5.3TB/s 전체 메모리 대역폭을 모두 활용할 수 없음
    • Ryzen 7000에서 하나의 CCD가 Infinity Fabric 제한 때문에 DDR5 대역폭을 완전히 활용하지 못하는 상황과 비슷함
    • MI300X에서는 모든 다이가 함께 동작할 때 대역폭 요구가 가장 높고, 이 경우 각 다이는 약 1.3TB/s를 소비하므로 cross-die link로 3/4를 가져오는 것이 문제가 되지 않음
  • MI300A는 같은 base die를 재사용하면서 6개 CDNA3 XCD와 24개 Zen 4 core를 결합한 “big iron” APU임
    • CPU와 GPU가 같은 메모리 주소 공간을 공유할 수 있음
    • CPU와 GPU의 일관성을 유지하기 위해 외부 버스로 데이터를 복사할 필요가 없어짐

댓글과 토론

Hacker News 의견들
  • AMD 소비자용 카드가 연산을 못 하는 이유가 그거였나? 단순히 어설픈 제품 분리 전략인 줄 알았는데, 이건 진입로 없는 고속도로처럼 상위 아키텍처 문제로 들려서 좀 심각해 보임
    • 보통 소프트웨어 개발자들은 범용 GPU API 하나만 지원하고, 그 API가 nVidia CUDA
      기술적으로 AMD 소비자용 카드는 연산 성능이 훌륭함. 예를 들어 UE5는 그래픽 파이프라인 대신 연산으로 삼각형 메시를 렌더링함 https://www.youtube.com/watch?v=TMorJX3Nj6U
      게다가 nVidia가 연산 성능과 메모리 대역폭보다 레이 트레이싱과 DLSS를 우선한 탓에, AMD 카드가 동급 nVidia보다 앞서는 경우도 많음
      문제는 어떤 기술 회사도 PyTorch 같은 AI 라이브러리에 D3D나 Vulkan 백엔드를 추가하려 하지 않는다는 것임. nVidia는 현상 유지가 좋으니 안 하고, Intel과 AMD는 공개 GPU API 대신 CUDA를 자기들 독점 대안으로 대체하려 하니 안 함
    • AMD 소비자용 카드도 연산은 하지만, 생태계가 성숙하지 않고 지원도 약함. ROCm은 엉망에 가까움
      다만 어설픈 제품 분리도, 상위 아키텍처 문제도 아님. 특화 제품은 범용 제품보다 자기 분야를 더 잘함. 연산과 게임을 모두 잘하는 카드에 대한 수요는 작고, 그런 사람들은 있긴 해도 한쪽만 신경 쓰는 사람들에 비하면 적음
      GCN을 RDNA와 CDNA로 나눈 효과는 즉각적이었음. Radeon VII(GCN 5)와 RX 5700 XT(RDNA 1)를 비교하면 게임에서는 엎치락뒤치락하며 평균적으로 Radeon VII가 약간 앞서지만, RX 5700 XT는 연산 벤치마크에서 크게 밀림. 둘 다 TSMC 7nm인데 RX 5700 XT는 셰이더가 더 적고(2560 대 3840), 다이도 작고(251 대 311 mm2), 전력도 낮아서(225 대 300 W) 게임 효율이 훨씬 좋다는 걸 보여줌. 낮은 전력, 낮은 소음, 수백 달러 낮은 가격 덕분에 게이머에게 훨씬 매력적인 카드였음
      CDNA 카드는 렌더 출력 유닛 같은 게임에 필요한 구성요소가 빠진 것으로 보임. 그래서 DirectX, OpenGL, Vulkan 공식 지원이 없음. 이걸로 게임을 돌렸다는 사례는 본 적 없음. 대신 연산 성능이 워낙 좋아서 압도적인 CUDA 생태계에도 불구하고 여러 회사가 nVidia 대신 이 카드를 사고 있음. 2013년에 GCN 기반 슈퍼컴퓨터 하나가 상위 100위에 들어갔고, 그게 유일한 GCN 기반 상위 100위 시스템이었음. 지금은 에너지 효율 상위 10대 슈퍼컴퓨터 중 8대가 CDNA 가속기를 쓰고, 전체 1위 최속 슈퍼컴퓨터도 CDNA를 사용함
    • 2개월 전에 고급형 Radeon 카드 지원이 추가됐음. ROCm은 “언젠가” 전반적인 RDNA로 올 예정이지만 느린 과정이고, 처음부터 AMD가 ROCm을 다뤄온 방식과도 대체로 일치함. 아주 작은 연산 하위 집합을 대상으로 시작해서 주요 버전마다 천천히 넓혀가는 식임
      https://www.tomshardware.com/news/amd-enables-rocm-and-pytor...
    • AMD는 늘 ATI를 제대로 이끌지 못했음
      근본적으로 하드웨어 회사이고(Lisa Su의 이력도 그렇듯), CUDA가 결정타라는 사실을 빨리 받아들이지 못했음. Phoronix에서 @Bridgman이 개발자들을 붙잡아 두려는 후퇴전을 계속하던 게 기억남. 질 수밖에 없는 싸움이었음
      어느 정도 이해는 됨. 80/90년대 하드웨어 세대는 스택에서 하드웨어가 최상위라고 본능적으로 생각하고, Su를 포함한 AMD 경영진이 다 그쪽 출신임
      Kodura는 소비자용 카드에서도 CUDA가 돌아간다는 점 때문에 nVidia가 AMD를 압도하고 있다는 걸 이해했음. 그래서 Lisa Su에 맞서 Radeon VII를 밀어붙였고, 그 카드는 아주 최근까지도 수년간 ROCm이 지원하던 유일한 소비자용 카드였음. 그는 얼마 지나지 않아 사실상 해고됐고, 훌륭한 카드였던 RVII도 빠르게 접혔음. 그다음 Wang이 들어와 소비자용/전문가용 분리를 굳혔음
      지금 AMD는 필사적으로 되돌리려 하지만 너무 늦었음. 경쟁하려는 곳은 여럿이지만, 사실상 거론할 만한 곳은 AAPL과 Metal 정도임
      AMD는 기회를 놓쳤음
    • 분리는 2016년쯤으로 보임. 당시 암호화폐 상황을 생각하면 말이 됨. nVidia가 AMD보다 더 크게 맞은 문제 중 하나가 소비자용 카드가 채굴장으로 빨려 들어간 것이었음. AMD가 의식적으로 분리하면서 연산 카드와 게이머용 카드를 사실상 격리한 셈임
      그렇다 해도 이게 AMD 카드의 연산 작업 채택에는 좋았을 것 같지 않음. CUDA의 멋진 점은 CUDA 코드를 개발하는 데 특수 가속 카드가 필요 없다는 것
  • 가까운 미래에 AMD가 NVidia와 경쟁할 수 있을 것 같지 않음. ML/AI 핵심 라이브러리를 만드는 많은 과학자들이 NVidia에서 GPU를 무료나 큰 할인으로 받고 있기 때문임
    그들이 자기 돈이나 연구비로 일반 소비자와 같은 가격을 내고 GPU를 사야 했다면 상황은 달라졌을 수도 있음
    개인적으로 NVidia가 학계와 대학 연구 환경에 파고드는 방식은 매우 비윤리적이라고 봄
    • Nvidia가 여기에 자원과 시간을 투자하기 시작한 건 10년이 넘었음. CUDA는 2007년에 나왔고, 그때는 지금의 ML/AI 흐름들이 존재하지도 않았음
      그 뒤에도 계속 기다리며, 자신들이 만든 제품의 시장이 “올 것”이라는 데 회사를 여러 번 걸었음
      지난 몇 년 사이 그 일이 실제로 벌어졌고, 주가에도 반영됐음. 다른 플레이어들은 기본적으로 10년 뒤처져 있고, 현재의 과열 분위기와 AI/ML 작업 흐름의 대중화를 보면 누가 따라잡는 건 거의 불가능해 보임
    • 이 분야에는 AMD에 대한 악감정도 많음. 초창기에 Nvidia와 AMD GPU를 둘 다 지원하려고 많은 시간을 쓴 사람들을 몇 명 아는데, AMD가 API 지원을 중단하면서 그들의 코드를 무용지물로 만든 적이 있음
      반면 CUDA 코드는 새 Nvidia 카드 세대가 나와도 계속 동작했음
    • 이 말이 얼마나 정확한지는 모르겠음. 대학에서 LLM, 컴퓨터 비전 등 흔히 말하는 “AI” 연구를 하는 연구자들을 지원하고 있는데, NVIDIA가 교육용으로 할인해 주는 건 A5000 카드뿐임. 관심 없어 하는 다른 카드 하나가 더 있을 수도 있음(L40?)
      대부분은 Exxact나 Supermicro 같은 회사에서 A6000 이상을 소비자 가격으로 사고 있음
      V100 시절, 즉 DGX-1 시스템 이후로 연구자가 무료 GPU를 받는 건 한 번도 본 적 없는 것 같음
    • AMD가 개발자들에게 무료 카드를 주는 걸 막는 건 아무것도 없음
  • “연산이 수십 년 동안 메모리를 앞질러 왔고, CPU처럼 GPU도 점점 정교한 캐싱 전략으로 대응해 왔다”는 말은 오히려 반대에 가깝다고 봄
    CPU와 달리 GPU는 이를 직접 상쇄하려 하지 않음. 더 높은 지연 시간을 받아들이는 대신 CPU에 비해 훨씬 더 넓게, 혹은 과감하게 병렬화했고, 수많은 병렬 의사 스레드가 지연 시간 숨김 효과를 제공함
    이 효과는 예를 들어 GPU 코드 최적화 발표에서도 볼 수 있음
    https://www.olcf.ornl.gov/wp-content/uploads/2019/12/03-CUDA...
    슬라이드 11부터 나오는 애니메이션이 그 예임
    • GPU도 병렬성 말고 다른 방식으로 메모리를 다룸. 그래서 GPU는 큰 레지스터 파일(RDNA1에서 스레드당 최대 256개 아키텍처 레지스터)과 로컬 메모리(RDNA1에서 작업 그룹당 최대 64KB LDS)를 제공하는 경향이 있음
      즉 많은 작업을 순수하게 레지스터와 LDS에서 처리할 수 있고, 전역 메모리 접근은 전역 메모리에 거의 모든 것이 있고 아키텍처 레지스터가 16개 안팎인 CPU보다 훨씬 드뭄
      그래도 전역 메모리는 문제임. 지연 시간뿐 아니라 대역폭도 문제이기 때문임. 그래서 RDNA2와 Ada가 대량의 최종 단계 캐시를 추가했음. 지연 시간을 더 잘 숨기기 위한 것도 있지만, 주된 목적은 대역폭 증폭기 역할임
  • VLIW는 잘 몰랐는데 꽤 흥미로움
    Very long instruction word(VLIW) 는 명령어 수준 병렬성(ILP)을 활용하도록 설계된 명령어 집합 아키텍처를 뜻함. 일반적인 중앙처리장치(CPU)는 대체로 프로그램이 순서대로 실행할 명령만 지정하게 하지만, VLIW 프로세서는 병렬로 실행할 명령을 프로그램이 명시적으로 지정할 수 있게 함. 이 설계는 다른 방식에 내재한 복잡성을 피하면서 더 높은 성능을 내려는 목적임
    프로세서 성능을 높이는 전통적인 방법에는 명령을 하위 단계로 나눠 일부를 동시에 실행하는 파이프라이닝, 개별 명령을 프로세서의 다른 부분에서 독립적으로 실행하도록 보내는 슈퍼스칼라 아키텍처, 심지어 프로그램과 다른 순서로 명령을 실행하는 비순차 실행이 있음. 이런 방식은 프로세서가 내부적으로 모든 결정을 내려야 하므로 하드웨어를 복잡하게 만듦
    https://en.wikipedia.org/wiki/Very_long_instruction_word
    • VLIW 프로세서의 가장 유명한 예는 Itanic, 아니 Itanium이었음
      잘되진 않았음. 그래서 Itanic이라고 불렸음
      전제는 컴파일러가 의존성을 충분히 정적으로 파악해서 여러 순차 실행 경로와 일부 분기 실행 경로를 같은 명령 안에 넣을 수 있다는 것이었음. 하지만 실제로 컴파일러가 그렇게 하지 못한다는 게 드러났고, 그래서 프로세서가 순차 명령 스트림에서 의존성과 병렬화 가능한 명령을 동적으로 찾아내게 됐음
      이건 많은 작업, 많은 칩 자원, 많은 에너지를 필요로 함. 그리고 어느 지점까지만 잘 작동하고, 그 이후로는 수확 체감에 부딪힘. 요즘 우리가 있는 지점이 바로 거기로 보임
    • SIMD 전반을 읽어보는 게 좋음
      명령을 보내는 언어가 아니라 처리 방식 자체를 말하는 것임
      그리고 VLIW4나 VLIW5 같은 용어는 특정 구현을 가리킨다는 점도 염두에 둘 만함
      https://en.wikipedia.org/wiki/Single_instruction,_multiple_d...
  • AMD가 칩렛과 버스 패브릭에 대한 지식을 활용해 AI에서 반격할 거라고 말했던 러다이트가 여기 있음. 이 글을 읽을 수 있다고, 아니 글 자체를 읽을 수 있다고도 prétend하진 않겠지만 일단 깃발은 꽂아두고 싶음
  • 조금 딴얘기지만, 언제부터 “compute”가 명사로 쓰이게 된 거지? 귀에 너무 거슬림
    • 적어도 AWS가 부상하던 때부터 기억남. “Amazon Elastic Compute Cloud(EC2)”가 2006년에 출시됐음 [0]. Google Trends도 참고할 만함 [1]
      0: https://en.m.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud
      1: https://trends.google.com/trends/explore?date=all&q=Compute&...
    • Deep Space Nine(1999)에도 그런 표현이 있었으니, 당시 용어 감각이 아주 정확했거나 유행했다 사라졌다를 반복한 표현일 수 있음
    • 요즘은 AI와 GPU 비슷한 칩 때문에 꽤 흔하게 쓰임
    • 매일 듣고 읽고 쓰는 용어인데, 내 직장에서는 약 5년 전쯤 등장했고 약 2년 전쯤부터 흔하게 쓰이기 시작했다고 봄