GPU 마이크로 벤치마크 모음입니다. 각 테스트는 특정 시나리오나 하드웨어 메커니즘을 테스트하도록 설계되었습니다. 벤치마크 중 일부는 다음 논문에 대한 데이터를 생성하는 데 사용되었습니다.
"최신 GPU에서 코드 생성 중 분석 성능 추정"
"GPU에서 실제적이고 복잡한 크고 얇은 행렬 곱셈 커널을 위한 성능 엔지니어링"
gpu-<benchmarkname>
이라는 벤치마크는 힙합화 가능합니다! 기본 Makefile 대상은 CUDA 실행 파일 cuda-<benchmarkname>
을 빌드하는 반면, 대상 make hip-<benchmarkname>
hipify-perl 도구를 사용하여 main.cu
파일에서 main.hip
파일을 생성하고 hip 컴파일러를 사용하여 빌드합니다. . CUDA 메인 파일은 hipify 도구가 추가 개입 없이 작동하도록 작성되었습니다.
또한 실행 중인 프로그램 내에서 커널 실행에 대한 하드웨어 성능 카운터 메트릭을 간결하게 측정하는 방법을 제공하는 gpu-metrics 함수를 살펴보세요.
이 중 어떤 것이든 유용하다면 별표와 인용을 환영합니다!
다양한 점유율에 대한 스트리밍 커널의 대역폭을 측정합니다. 공유 메모리 할당은 스포일러 역할을 하므로 SM당 두 개의 스레드 블록만 실행할 수 있습니다. 스레드 블록 크기를 32에서 1024까지 스캔하면 점유율이 3%에서 100%까지 스캔됩니다.
핵심 | 공식 | |
---|---|---|
초기화 | A[i] = c | 매장 스트림 1개 |
읽다 | 합계 = A[i] | 로드 스트림 1개 |
규모 | A[i] = B[i] * c | 로드 스트림 1개, 스토어 스트림 1개 |
삼인조 | A[i] = B[i] + c * C[i] | 로드 스트림 2개, 스토어 스트림 1개 |
3점 | A[i] = B[i-1] + B[i] + B[i+1] | 로드 스트림 1개, 매장 스트림 1개 |
5포인트 | A[i] = B[i-2] + B[i-1] + B[i] + B[i+1] + B[i+2] | 로드 스트림 1개, 매장 스트림 1개 |
NVIDIA-H100-PCIe / CUDA 11.7의 결과
blockSize 스레드 %occ | 읽기 스케일 트라이어드 초기화 3pt 5pt 32 3648 3 % | GB/초: 228 96 183 254 168 164 64 7296 6.2% | GB/초: 452 189 341 459 316 310 96 10944 9.4% | GB/초: 676 277 472 635 443 436 128 14592 12.5% | GB/초: 888 368 607 821 567 558 160 18240 15.6% | GB/초: 1093 449 704 966 680 670 192 21888 18.8% | GB/초: 1301 533 817 1121 794 781 224 25536 21.9% | GB/초: 1495 612 925 1264 903 889 256 29184 25.0% | GB/초: 1686 702 1037 1399 1005 989 288 32832 28.1% | GB/초: 1832 764 1124 1487 1100 1082 320 36480 31.2% | GB/초: 2015 841 1213 1564 1188 1169 352 40128 34.4% | GB/초: 2016 908 1295 1615 1269 1250 384 43776 37.5% | GB/초: 2016 985 1378 1644 1348 1326 416 47424 40.6% | GB/초: 2016 1045 1439 1641 1415 1395 448 51072 43.8% | GB/초: 2016 1116 1497 1649 1472 1453 480 54720 46.9% | GB/초: 2016 1179 1544 1655 1521 1505 512 58368 50.0% | GB/초: 2017 1261 1583 1675 1556 1545 544 62016 53.1% | GB/초: 2016 1300 1591 1669 1572 1563 576 65664 56.2% | GB/초: 2016 1362 1607 1678 1587 1579 608 69312 59.4% | GB/초: 2018 1416 1619 1689 1598 1592 640 72960 62.5% | GB/초: 2016 1473 1639 1712 1613 1607 672 76608 65.6% | GB/초: 2016 1527 1638 1714 1618 1613 704 80256 68.8% | GB/초: 2015 1578 1644 1725 1625 1619 736 83904 71.9% | GB/초: 2016 1624 1651 1738 1632 1628 768 87552 75.0% | GB/초: 2016 1680 1666 1755 1642 1638 800 91200 78.1% | GB/초: 2015 1714 1663 1758 1645 1642 832 94848 81.2% | GB/초: 2016 1759 1668 1770 1649 1647 864 98496 84.4% | GB/초: 2016 1795 1673 1779 1654 1651 896 102144 87.5% | GB/초: 2016 1837 1686 1796 1663 1662 928 105792 90.6% | GB/초: 2018 1871 1684 1800 1666 1664 960 109440 93.8% | GB/초: 2016 1897 1688 1808 1672 1670 992 113088 96.9% | GB/초: 2016 1919 1693 1818 1678 1675 1024 116736 100.0% | GB/초: 2016 1942 1704 1832 1686 1683
SCALE 커널 및 GPU 선택 결과:
H100 결과는 SXM 버전보다 DRAM 대역폭이 낮은 PCIe 버전에 대한 것입니다!
대기 시간 측정을 위한 포인터 추적 벤치마크입니다. 단일 워프는 무작위 순서로 버퍼를 완전히 통과합니다. 모든 캐시 라인이 다시 액세스되기 전에 정확히 한 번만 적중되도록 하기 위해 파티셔닝 체계가 사용됩니다. 클록 사이클의 지연 시간은 현재 클록 속도로 계산됩니다.
Sharp L1 캐시는 NVIDIAS V100/A100/H100의 경우 128/192/256kB, AMD MI210의 경우 16kB로 전환됩니다. V100과 MI210에는 모두 6MB L2 캐시가 있습니다. A100과 H100에는 2x20MB 및 2x25MB의 분할된 L2 캐시가 있으며, 이는 먼 L2 섹션에서 데이터를 가져올 때 작은 중간 고원으로 나타납니다.
RDNA2 GPU인 RX6900XT는 4가지 캐시 레벨(16kB L0 캐시, 128kB 반공유 L1 캐시, 4MB L2 캐시, 128MB Infinity 캐시)이 명확하게 표시되는 가장 흥미로운 캐시 계층 구조를 가지고 있습니다. 또한 클럭킹이 가장 높은 GPU이므로 절대 액세스 시간이 다른 GPU보다 낮습니다. DRAM 인터페이스가 단일 파면에 대해 클럭업을 하지 않아 DRAM 대기 시간이 2000사이클을 초과하기 때문에 DRAM 대기 시간을 측정하는 것은 어렵습니다.
첫 번째 및 두 번째 캐시 수준의 대역폭을 측정합니다. SM당 하나의 스레드 블록을 실행합니다. 각 스레드 블록은 동일한 버퍼의 내용을 반복적으로 읽습니다. 버퍼 크기를 변경하면 대상 캐시 수준이 변경됩니다.
16kB(MI100/MI210), 128kB(V100), 192kB(A100) 및 256kB(H100) L1 캐시 용량은 매우 뚜렷하고 선명합니다. 세 가지 NVIDIA 아키텍처는 모두 128B/사이클/SM에 가깝게 전송되며, AMD의 MI100 및 MI210에서 측정된 최대 값은 데이터 유형에 따라 다릅니다. 배정밀도의 경우 최대값은 32B/사이클/CU입니다. 단정밀도 및 16B 데이터 유형(float4 또는 double2)의 경우 대역폭은 최대 64B입니다.
이 벤치마크는 데이터 세트가 공유 캐시에서 명확하게 삭제되지 않기 때문에 두 번째 캐시 수준(즉, 대부분의 GPU의 경우 DRAM)을 넘는 메모리 계층 수준을 대상으로 하지 않습니다. 모든 스레드 블록은 동일한 데이터를 읽기 때문에 데이터가 제거되기 전에 공유 캐시 내에서 많은 재사용 가능성이 있습니다. RX6900XT 값은 128kB 공유 L1 캐시를 넘어서는 괴짜입니다. A100과 H100은 단일 캐시 섹션의 용량을 초과하면 20/25MB로 약간 감소합니다. 이 지점을 넘어서면 두 L2 캐시 섹션 모두에서 데이터를 복제할 수 없으며 다른 섹션에서도 데이터를 가져와야 하므로 최대 대역폭이 떨어집니다.
공유 캐시 수준의 대역폭을 측정합니다. 이 벤치마크는 명시적으로 L1 캐시를 대상으로 하지 않습니다.
세 GPU 모두 용량은 다르지만 약 5.xTB/s의 비슷한 L2 캐시 대역폭을 갖습니다.
주목할만한 관찰은 두 번째 공유 캐시 레벨인 128MB Infinity Cache를 갖춘 RX6900XT입니다. 거의 1.92TB/s로 A100의 DRAM만큼 빠릅니다. 처음에는 RX6900XT 반공유 L1 캐시를 볼 수 있는데, 일부 블록 배치에서는 4개의 L1 캐시가 작은 영향을 미칩니다. H100에도 동일하게 적용됩니다. 더 큰 L1 캐시를 사용하면 스레드 블록이 이전 스레드 블록에 의해 로드된 L1 캐시에서 이미 작업하려는 데이터를 찾을 가능성이 높아집니다. 이는 서로 다른 데이터 블록이 몇 개만 있고 이 가능성이 여전히 중요한 소규모 데이터 세트에만 적용됩니다. 이는 다른 SM의 공유 메모리에서 로드할 수 있는 분산 공유 메모리 네트워크(Distributed Shared Memory Network)에 기인한 것이 아닙니다. 이는 전역 로드가 아닌 명시적 공유 메모리 로드에만 작동하기 때문입니다. 이를 위해서는 모든 로드에 대해 GPC의 모든 L1 캐시를 검사하는 태그가 필요합니다.
읽기 전용, 스트라이드 1~128로 메모리에 액세스하는 L1 캐시 벤치마크. 대역폭은 주기당 바이트 및 SM으로 변환됩니다. 1에서 128까지의 보폭은 16x8 테이블로 형식화되었습니다. 이는 2/4/8/16의 배수의 반복 패턴을 강조하기 때문입니다.
각 장치는 다음에 적합합니다.
시작 오버헤드로 성능을 모델링하는 것
이 프로그램은 내부 루프 트립의 양을 변경하여 다양한 계산 강도를 스캔합니다. 여러 GPU를 사용할 때 메모리에서 계산 경계 코드로의 전환뿐만 아니라 전력 소비, 클록 주파수 및 온도를 연구하는 데 모두 적합합니다. 쉘 스크립트 series.sh는 각 값에 대한 실행 파일을 빌드하고 빌드가 완료된 후 하나씩 실행합니다.
코드는 사용 가능한 모든 장치에서 동시에 실행됩니다. 4개의 Tesla V100 PCIe 16GB에 대한 출력 예:
1 640 블록 0 해당 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 138 W 60°C2 640 블록 0 해당 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 137 W 59°C3 640 블록 0 0.125 Fl/B 869GB/s 109 GF/s 1380 Mhz 124 W 56°C0 640 블록 0 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 54°C1 640 블록 8 1.125 Fl/B 861 GB/초 968GF/초 1380Mhz 159W 63°C0 640개 블록 8개 1.125Fl/B 861GB/s 968GF/s 1380Mhz 142W 56°C2 640개 블록 8개 1.125Fl/B 861GB/s 968GF/s 1380Mhz 157W 62°C3 640개 블록 8 해당 1.125Fl/B 861GB/s 968GF/s 1380Mhz 144W 59°C[...]0 640개 블록 64 해당 8.125Fl/B 811GB/s 6587GF/s 1380Mhz 223W 63 °C3 640 블록 64 그것 8.125 Fl/B 813 GB/s 6604 GF/s 1380 Mhz 230 W 66°C1 640 블록 64 해당 8.125 Fl/B 812 GB/s 6595 GF/s 1380 Mhz 241 W 71°C2 640 블록 64 해당 8.125 Fl/B 813 GB/s 6603GF/s 1380Mhz 243W 69°C
다양한 전송 크기에 걸쳐 cudaMemcpy 기능의 호스트-장치 전송 속도를 측정합니다.
Tesla V100 PCIe 16GB의 출력 예
1kB 0.03ms 0.03GB/초 0.68% 2kB 0.03ms 0.06GB/초 5.69% 4kB 0.03ms 0.12GB/초 8.97% 8kB 0.03ms 0.24GB/초 6.25% 16kB 0.04ms 0.44GB/초 5.16% 32kB 0.04ms 0.93GB/초 2.70% 64kB 0.04ms 1.77GB/초 5.16% 128kB 0.04ms 3.46GB/초 7.55% 256kB 0.05ms 5.27GB/초 1.92% 512kB 0.07ms 7.53GB/s 1.03% 1024kB 0.11ms 9.25GB/s 2.52% 2048kB 0.20ms 10.50GB/s 1.07% 4096kB 0.37ms 11.41GB/s 0.58% 8192kB 0.71ms 11.86GB/초 0.44% 16384kB 1.38ms 12.11GB/초 0.14% 32768kB 2.74ms 12.23GB/초 0.03% 65536kB 5.46ms 12.29GB/초 0.08% 131072kB 10.89ms 12.32GB/초 0.02% 262144kB 21.75ms 12.34GB/초 0.00% 524288kB 43.47ms 12.35GB/초 0.00% 1048576kB 86.91ms 12.35GB/초 0.00%
STREAM 트라이어드 커널을 사용하여 CUDA 통합 메모리 전송 속도를 측정합니다. 장치 메모리보다 작거나 큰 다양한 데이터 세트 크기가 사용됩니다. Tesla V100 PCIe 16GB의 출력 예:
버퍼 크기 시간 분산 대역폭 24MB 0.1ms 3.2% 426.2GB/s 48MB 0.1ms 24.2% 511.6GB/s 96MB 0.1ms 0.8% 688.0GB/s 192MB 0.3ms 1.8% 700.0GB/s 384MB 0.5ms 0.5 % 764.6GB/s 768MB 1.0ms 0.2% 801.8GB/s 1536MB 2.0ms 0.0% 816.9GB/s 3072MB 3.9ms 0.1% 822.9GB/s 6144MB 7.8ms 0.2% 823.8GB/s 12288MB 15.7ms 0.1% 822.1GB/s 24576MB 5108.3ms 0.5% 5.0GB/s 49152MB 10284.7ms 0.8% 5.0GB/s
FMA, DIV 및 SQRT 작업의 대기 시간과 처리량을 측정합니다. 1..8개의 독립적인 종속성 체인을 생성하여 ILP=1..8의 조합과 SM의 워프 수를 1에서 32까지 변경하여 TLP를 검색합니다. 최종 출력은 ILP/TLP 테이블이며, 역수는 다음과 같습니다. 처리량(작업당 주기):
Tesla V100 PCIe 16GB의 출력 예:
DFMA 8.67 4.63 4.57 4.66 4.63 4.72 4.79 4.97 4.29 2.32 2.29 2.33 2.32 2.36 2.39 2.48 2.14 1.16 1.14 1.17 1.16 1.18 1.20 1.24 1.08 1.05 1.05 1.08 1.08 1.10 1.12 1.14 1.03 1.04 1.04 1.08 1.07 1.10 1.11 1.14 1.03 1.04 1.04 1.08 1.07 1.10 1.10 1.14DDIV111.55 111.53 111.53 111.53 111.53 668.46 779.75 891.05 55.76 55.77 55.76 55.76 55.76 334.26 389.86 445.51 27.88 27.88 27.88 27.88 27.88 167.12 194.96 222.82 14.11 14.11 14.11 14.11 14.11 84.77 98.89 113.00 8.48 8.48 8.48 8.48 8.48 50.89 59.36 67.84 7.51 7.51 7.51 7.51 7.51 44.98 52.48 59.97DSQRT101.26 101.26 101.26 101.26 101.26 612.76 714.79 816.83 50.63 50.62 50.63 50.63 50.62 306.36 357.38 408.40 25.31 25.31 25.31 25.31 25.31 153.18 178.68 204.19 13.56 13.56 13.56 13.56 13.56 82.75 96.83 110.29 9.80 9.80 9.80 9.80 9.80 60.47 70.54 80.62 9.61 9.61 9.61 9.61 9.61 58.91 68.72 78.53
일부 기능은 플롯에서 추출할 수 있습니다.
대기 시간:
DFMA: 8사이클
DDIV: 112사이클
DSQRT: 101사이클
하나의 워프 처리량(하나의 SM 사분면에서 실행), 종속성 없음:
DFMA: 주기당 1/4(ILP 2, 작업 중복까지)
DDIV: 주기당 1/112(ILP/중복 없음)
DSQRT: 주기당 1/101(ILP/중복 없음)
다중 워프 처리량(모든 SM 사분면), 종속성은 관련 없음:
DFMA: 사이클당 1개
DDIV: 1/7.5 사이클
DSQRT: 1/9.6주기