Ini adalah kumpulan benchmark mikro GPU. Setiap pengujian dirancang untuk menguji skenario atau mekanisme perangkat keras tertentu. Beberapa tolok ukur telah digunakan untuk menghasilkan data untuk makalah ini:
"Estimasi kinerja analitis selama pembuatan kode pada GPU modern"
"Rekayasa kinerja untuk kernel perkalian matriks tinggi & kurus yang nyata dan kompleks pada GPU"
Tolok ukur yang disebut gpu-<benchmarkname>
dapat dihipifikasi! Sedangkan target Makefile default membuat CUDA yang dapat dieksekusi cuda-<benchmarkname>
, target make hip-<benchmarkname>
menggunakan alat hipify-perl untuk membuat file main.hip
dari file main.cu
, dan membuatnya menggunakan kompiler hip . File utama CUDA ditulis agar alat hipify berfungsi tanpa intervensi lebih lanjut.
Lihat juga fungsi GPU-metrics, yang menyediakan cara ringkas untuk mengukur metrik penghitung kinerja perangkat keras dari peluncuran kernel di dalam program yang sedang berjalan.
Jika ada yang berguna, bintang dan kutipan dipersilakan!
Mengukur bandwidth kernel streaming untuk berbagai hunian. Alokasi memori bersama berfungsi sebagai spoiler, sehingga hanya dua blok thread yang dapat berjalan per SM. Memindai ukuran blok thread dari 32 hingga 1024 memindai hunian dari 3% hingga 100%.
Inti | Rumus | |
---|---|---|
inisiasi | SEBUAH[saya] = c | 1 aliran toko |
membaca | jumlah = A[i] | 1 aliran beban |
skala | SEBUAH[saya] = B[saya] * c | 1 aliran muat, 1 aliran penyimpanan |
tiga serangkai | SEBUAH[saya] = B[saya] + c * C[saya] | 2 aliran beban, 1 aliran penyimpanan |
3pt | SEBUAH[saya] = B[i-1] + B[saya] + B[i+1] | 1 aliran beban, 1 aliran penyimpanan |
5pt | SEBUAH[i] = B[i-2] + B[i-1] + B[i] + B[i+1] + B[i+2] | 1 aliran beban, 1 aliran penyimpanan |
Hasil dari NVIDIA-H100-PCIe / CUDA 11.7
thread ukuran blok %occ | init baca skala triad 3pt 5pt 32 3648 3 % | GB/dtk: 228 96 183 254 168 164 64 7296 6,2 % | GB/dtk: 452 189 341 459 316 310 96 10944 9,4 % | GB/dtk: 676 277 472 635 443 436 128 14592 12,5 % | GB/dtk: 888 368 607 821 567 558 160 18240 15,6 % | GB/dtk: 1093 449 704 966 680 670 192 21888 18,8 % | GB/dtk: 1301 533 817 1121 794 781 224 25536 21,9 % | GB/dtk: 1495 612 925 1264 903 889 256 29184 25,0 % | GB/dtk: 1686 702 1037 1399 1005 989 288 32832 28,1 % | GB/dtk: 1832 764 1124 1487 1100 1082 320 36480 31,2 % | GB/dtk: 2015 841 1213 1564 1188 1169 352 40128 34,4 % | GB/dtk: 2016 908 1295 1615 1269 1250 384 43776 37,5 % | GB/dtk: 2016 985 1378 1644 1348 1326 416 47424 40,6 % | GB/dtk: 2016 1045 1439 1641 1415 1395 448 51072 43,8 % | GB/dtk: 2016 1116 1497 1649 1472 1453 480 54720 46,9 % | GB/dtk: 2016 1179 1544 1655 1521 1505 512 58368 50,0 % | GB/dtk: 2017 1261 1583 1675 1556 1545 544 62016 53,1 % | GB/dtk: 2016 1300 1591 1669 1572 1563 576 65664 56,2 % | GB/dtk: 2016 1362 1607 1678 1587 1579 608 69312 59,4 % | GB/dtk: 2018 1416 1619 1689 1598 1592 640 72960 62,5 % | GB/dtk: 2016 1473 1639 1712 1613 1607 672 76608 65,6 % | GB/dtk: 2016 1527 1638 1714 1618 1613 704 80256 68,8 % | GB/dtk: 2015 1578 1644 1725 1625 1619 736 83904 71,9 % | GB/dtk: 2016 1624 1651 1738 1632 1628 768 87552 75,0 % | GB/dtk: 2016 1680 1666 1755 1642 1638 800 91200 78,1 % | GB/dtk: 2015 1714 1663 1758 1645 1642 832 94848 81,2 % | GB/dtk: 2016 1759 1668 1770 1649 1647 864 98496 84,4 % | GB/dtk: 2016 1795 1673 1779 1654 1651 896 102144 87,5 % | GB/dtk: 2016 1837 1686 1796 1663 1662 928 105792 90,6 % | GB/dtk: 2018 1871 1684 1800 1666 1664 960 109440 93,8 % | GB/dtk: 2016 1897 1688 1808 1672 1670 992 113088 96,9 % | GB/dtk: 2016 1919 1693 1818 1678 1675 1024 116736 100,0 % | GB/dtk: 2016 1942 1704 1832 1686 1683
Hasil untuk kernel SCALE dan pilihan GPU:
Perhatikan bahwa hasil H100 adalah untuk versi PCIe, yang memiliki bandwidth DRAM lebih rendah daripada versi SXM!
Pointer mengejar tolok ukur untuk pengukuran latensi. Sebuah warp tunggal melintasi buffer secara penuh dalam urutan acak. Skema partisi digunakan untuk memastikan bahwa semua baris cache terkena tepat satu kali sebelum diakses kembali. Latensi dalam siklus jam dihitung dengan laju jam saat ini.
Transisi cache L1 yang tajam pada 128/192/256 kB untuk NVIDIAS V100/A100/H100 dan pada 16kB untuk AMD MI210. V100 dan MI210 keduanya memiliki cache L2 6MB. A100 dan H100 memiliki cache L2 tersegmentasi pada 2x20MB dan 2x25MB, yang bermanifestasi sebagai dataran menengah kecil ketika data diambil dari bagian L2 yang jauh.
GPU RDNA2, RX6900XT, memiliki hierarki cache paling menarik dengan 4 level cache yang terlihat jelas: cache L0 16kB, cache L1 semi-bersama 128kB, cache L2 4MB, dan cache Infinity 128MB. Ini juga merupakan GPU dengan clocking tertinggi, sehingga waktu akses absolut akan lebih rendah dibandingkan GPU lainnya. Mengukur latensi DRAM-nya sulit dilakukan, karena antarmuka DRAM tidak memiliki clock untuk satu muka gelombang, sehingga menghasilkan latensi DRAM > 2000 siklus.
Mengukur bandwidth tingkat cache pertama dan kedua. Meluncurkan satu blok thread per SM. Setiap blok thread berulang kali membaca isi buffer yang sama. Memvariasikan ukuran buffer akan mengubah tingkat cache yang ditargetkan.
Kapasitas cache L1 16kB (MI100/MI210), 128kB (V100), 192kB (A100) dan 256 kB (H100) sangat terasa dan tajam. Ketiga arsitektur NVIDIA keduanya mentransfer mendekati 128B/cycle/SM, nilai terukur maksimum pada AMD MI100 dan MI210 bergantung pada tipe data. Untuk presisi ganda, maksimumnya adalah 32B/cycle/CU. Untuk tipe data presisi tunggal dan 16B (float4 atau double2) bandwidthnya mencapai 64B.
Tolok ukur ini tidak menargetkan tingkat hierarki memori yang melewati tingkat cache kedua (yaitu DRAM untuk sebagian besar GPU), karena kumpulan data tidak secara jelas keluar dari cache bersama. Karena semua blok thread membaca data yang sama, ada banyak potensi penggunaan kembali di dalam cache bersama sebelum data dikeluarkan. Nilai RX6900XT sangat gila melebihi cache L1 bersama sebesar 128kB. A100 dan H100 turun sedikit pada 20/25MB, ketika kapasitas satu bagian cache terlampaui. Di luar titik ini, data tidak dapat direplikasi di kedua bagian cache L2 dan bandwidth maksimum turun, karena data juga harus diambil dari bagian lainnya.
Mengukur bandwidth tingkat cache bersama. Tolok ukur ini secara eksplisit tidak menargetkan cache L1.
Ketiga GPU tersebut memiliki bandwidth cache L2 yang serupa, yaitu sekitar 5,x TB/s, meskipun dengan kapasitas berbeda.
Pengamatan yang luar biasa adalah RX6900XT, yang memiliki tingkat cache bersama kedua, Infinity Cache 128MB. Kecepatannya hampir 1,92 TB/dtk, sama cepatnya dengan DRAM A100. Pada bagian awal sudah terlihat semi-shared L1 cache RX6900XT, dimana untuk beberapa penempatan blok 4 L1 cache mempunyai pengaruh yang kecil. Hal yang sama berlaku untuk H100, yang memiliki cache L1 lebih besar dengan peluang lebih besar bagi blok thread untuk menemukan data yang ingin dikerjakannya di cache L1 yang dimuat oleh blok thread sebelumnya. Ini hanya berfungsi untuk kumpulan data kecil, yang hanya terdapat beberapa blok data berbeda dan peluang ini masih besar. Hal ini tidak disebabkan oleh Jaringan Memori Bersama Terdistribusi, yang memungkinkan pemuatan dari memori bersama SM lain, karena ini hanya berfungsi untuk pemuatan memori bersama secara eksplisit dan bukan pemuatan global. Hal ini memerlukan pemeriksaan tag pada setiap cache L1 di GPC untuk mengetahui beban apa pun.
Hanya baca, benchmark cache L1 yang mengakses memori dengan langkah 1 hingga 128. Bandwidth diubah menjadi Byte per siklus dan SM. Langkah dari 1 hingga 128 diformat dalam tablo 16x8, karena ini menyoroti pola kelipatan 2/4/8/16 yang berulang.
Setiap perangkat cocok
yang memodelkan kinerja dengan overhead startup
Program ini memindai berbagai Intensitas Komputasi, dengan memvariasikan jumlah perjalanan loop dalam. Sangat cocok untuk mempelajari transisi dari kode terikat memori ke komputasi serta konsumsi daya, frekuensi clock, dan suhu saat menggunakan beberapa GPU. Skrip shell series.sh membuat executable untuk setiap nilai, dan mengeksekusinya satu per satu setelah selesai dibuat.
Kode ini berjalan secara bersamaan di semua perangkat yang tersedia. Contoh keluaran pada empat Tesla V100 PCIe 16GB:
1 640 blok 0 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 138 W 60°C2 640 blok 0 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 137 W 59°C3 640 blok 0 -nya 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 56°C0 640 blok 0 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 54°C1 640 blok 8 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 159 W 63°C0 640 blok 8 nya 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 142 W 56°C2 640 blok 8 nya 1,125 Fl/B 861 GB/s 968 GF/dtk 1380 Mhz 157 W 62°C3 640 blok 8 nya 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 144 W 59°C[...]0 640 blok 64 8,125 Fl/B 811 GB/s 6587 GF /dtk 1380 Mhz 223 W 63°C3 640 blok 64 8,125 Fl/B 813 GB/s 6604 GF/s 1380 Mhz 230 W 66°C1 640 blok 64 8,125 Fl/B 812 GB/s 6595 GF/s 1380 Mhz 241 W 71°C2 640 blok 64 nya 8,125 Fl/B 813 GB/s 6603 GF/s 1380 Mhz 243 W 69°C
Mengukur kecepatan transfer host-ke-perangkat dari fungsi cudaMemcpy pada rentang ukuran transfer
Contoh keluaran untuk Tesla V100 PCIe 16GB
1kB 0,03 mdtk 0,03 GB/dtk 0,68% 2kB 0,03 mdtk 0,06 GB/dtk 5,69% 4kB 0,03 mdtk 0,12 GB/dtk 8,97% 8kB 0,03 mdtk 0,24 GB/dtk 6,25% 16kB 0,04 mdtk 0,44 GB/dtk 5,16% 32kB 0,04 md 0,93 GB/dtk 2,70% 64kB 0,04 md 1,77 GB/dtk 5,16% 128kB 0,04 md 3,46 GB/dtk 7,55% 256kB 0,05 md 5,27 GB/dtk 1,92% 512kB 0,07 md 7,53 GB/dtk 1,03% 1024kB 0,11 md 9,25 GB/dtk 2,52% 2048kB 0,20 md 10,50 GB/dtk 1,07% 4096kB 0,37 md 11,41 GB/dtk 0,58% 8192kB 0,71 md 11,86 GB/dtk 0,44% 16384kB 1,38 md 12,11 GB/dtk 0,14% 32768kB 2,74 md 12,23 GB/dtk 0,03% 65536kB 5,46 md 12,29 GB/dtk 0,08% 131072kB 10,89 md 12,32 GB/dtk 0,02% 262144kB 21,75 md 12,34 GB/dtk 0,00% 524288kB 43,47 md 12,35 GB/dtk 0,00% 1048576kB 86,91 md 12,35 GB/dtk 0,00%
Mengukur kecepatan transfer CUDA Unified Memory menggunakan kernel triad STREAM. Berbagai ukuran kumpulan data digunakan, baik lebih kecil maupun lebih besar dari memori perangkat. Contoh keluaran pada Tesla V100 PCIe 16GB:
ukuran buffer bandwidth penyebaran waktu 24 MB 0,1 mdtk 3,2% 426,2 GB/dtk 48 MB 0,1 mdtk 24,2% 511,6 GB/dtk 96 MB 0,1 mdtk 0,8% 688,0 GB/dtk 192 MB 0,3 mdtk 1,8% 700,0 GB/dtk 384 MB 0,5 mdtk 0,5 % 764,6 GB/dtk 768 MB 1,0 mdtk 0,2% 801,8 GB/dtk 1536 MB 2,0 mdtk 0,0% 816,9 GB/dtk 3072 MB 3,9 mdtk 0,1% 822,9 GB/dtk 6144 MB 7,8 mdtk 0,2% 823,8 GB/dtk 12288 MB 15,7 md 0,1% 822,1 GB/dtk 24576 MB 5108,3 mdtk 0,5% 5,0 GB/dtk 49152 MB 10284,7 mdtk 0,8% 5,0 GB/dtk
Mengukur latensi dan throughput operasi FMA, DIV, dan SQRT. Ini memindai kombinasi ILP=1..8, dengan menghasilkan 1..8 rantai ketergantungan independen, dan TLP, dengan memvariasikan jumlah warp pada SM dari 1 hingga 32. Hasil akhirnya adalah tabel ILP/TLP, dengan kebalikannya throughput (siklus per operasi):
Contoh keluaran pada 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
Beberapa Fitur dapat diambil dari plot.
Latensi:
DFMA: 8 siklus
DDIV: 112 siklus
DSQRT: 101 siklus
Throughput satu warp (berjalan pada satu kuadran SM), tidak ada ketergantungan:
DFMA: 1/4 per siklus (ILP 2, untuk operasi yang tumpang tindih)
DDIV: 1/112 per siklus (tidak ada ILP/tumpang tindih)
DSQRT: 1/101 per siklus (tidak ada ILP/tumpang tindih)
Throughput beberapa warp (semua kuadran SM), ketergantungan tidak relevan:
DFMA: 1 per siklus
DDIV: 1/7,5 siklus
DSQRT: 1/9,6 siklus