นี่คือชุดของการวัดประสิทธิภาพระดับไมโครของ GPU การทดสอบแต่ละครั้งได้รับการออกแบบมาเพื่อทดสอบสถานการณ์เฉพาะหรือกลไกของฮาร์ดแวร์ เกณฑ์มาตรฐานบางส่วนได้ถูกนำมาใช้เพื่อสร้างข้อมูลสำหรับเอกสารเหล่านี้:
"การประมาณประสิทธิภาพเชิงวิเคราะห์ระหว่างการสร้างโค้ดบน GPU สมัยใหม่"
"วิศวกรรมประสิทธิภาพสำหรับเคอร์เนลการคูณเมทริกซ์สูงและผอมจริงและซับซ้อนบน GPU"
เกณฑ์มาตรฐานที่เรียกว่า gpu-<benchmarkname>
นั้นสามารถปรับเปลี่ยนได้! ในขณะที่เป้าหมาย Makefile เริ่มต้นสร้างไฟล์ปฏิบัติการ CUDA cuda-<benchmarkname>
เป้าหมาย make hip-<benchmarkname>
ใช้เครื่องมือ hipify-perl เพื่อสร้างไฟล์ main.hip
จากไฟล์ main.cu
และสร้างมันโดยใช้ hip คอมไพเลอร์ . ไฟล์หลักของ CUDA ถูกเขียนเพื่อให้เครื่องมือ hipify ทำงานโดยไม่มีการแทรกแซงเพิ่มเติม
ดูที่ฟังก์ชัน gpu-metrics ซึ่งให้วิธีที่กระชับในการวัดตัวนับประสิทธิภาพของฮาร์ดแวร์ของการเปิดตัวเคอร์เนลภายในโปรแกรมที่รันอยู่
หากสิ่งนี้มีประโยชน์ ยินดีให้ดาวและการอ้างอิง!
วัดแบนด์วิธของเคอร์เนลสตรีมมิ่งสำหรับอัตราการเข้าพักที่แตกต่างกัน การจัดสรรหน่วยความจำที่ใช้ร่วมกันทำหน้าที่เป็นสปอยเลอร์ เพื่อให้สามารถรันบล็อกเธรดได้เพียงสองบล็อกต่อ SM การสแกนขนาดบล็อกเธรดตั้งแต่ 32 ถึง 1,024 จะสแกนการเข้าใช้ตั้งแต่ 3% ถึง 100%
เคอร์เนล | สูตร | |
---|---|---|
เริ่มต้น | อ[ฉัน] = ค | สตรีมร้านค้า 1 รายการ |
อ่าน | ผลรวม = A[i] | สตรีมโหลด 1 รายการ |
มาตราส่วน | A[i] = B[i] * ค | 1 สตรีมโหลด 1 สตรีมร้านค้า |
สามคน | A[i] = B[i] + ค * 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 | init อ่านสเกลสาม 3pt 5pt 32 3648 3 % | GB/วินาที: 228 96 183 254 168 164 64 7296 6.2 % | GB/s: 452 189 341 459 316 310 96 10944 9.4 % | GB/s: 676 277 472 635 443 436 128 14592 12.5 % | GB/s: 888 368 607 821 567 558 160 18240 15.6 % | GB/s: 1093 449 704 966 680 670 192 21888 18.8 % | GB/s: 1301 533 817 1121 794 781 224 25536 21.9 % | GB/s: 1495 612 925 1264 903 889 256 29184 25.0 % | GB/s: 1686 702 1037 1399 1005 989 288 32832 28.1 % | GB/s: 1832 764 1124 1487 1100 1082 320 36480 31.2 % | GB/s: 2015 841 1213 1564 1188 1169 352 40128 34.4 % | GB/s: 2016 908 1295 1615 1269 1250 384 43776 37.5 % | GB/s: 2016 985 1378 1644 1348 1326 416 47424 40.6 % | GB/s: 2016 1045 1439 1641 1415 1395 448 51072 43.8 % | GB/s: 2016 1116 1497 1649 1472 1453 480 54720 46.9 % | GB/s: 2016 1179 1544 1655 1521 1505 512 58368 50.0 % | GB/s: 2017 1261 1583 1675 1556 1545 544 62016 53.1 % | GB/s: 2016 1300 1591 1669 1572 1563 576 65664 56.2 % | GB/s: 2016 1362 1607 1678 1587 1579 608 69312 59.4 % | GB/s: 2018 1416 1619 1689 1598 1592 640 72960 62.5 % | GB/s: 2016 1473 1639 1712 1613 1607 672 76608 65.6 % | GB/s: 2016 1527 1638 1714 1618 1613 704 80256 68.8 % | GB/s: 2015 1578 1644 1725 1625 1619 736 83904 71.9 % | GB/s: 2016 1624 1651 1738 1632 1628 768 87552 75.0 % | GB/s: 2016 1680 1666 1755 1642 1638 800 91200 78.1 % | GB/s: 2015 1714 1663 1758 1645 1642 832 94848 81.2 % | GB/s: 2016 1759 1668 1770 1649 1647 864 98496 84.4 % | GB/s: 2016 1795 1673 1779 1654 1651 896 102144 87.5 % | GB/s: 2016 1837 1686 1796 1663 1662 928 105792 90.6 % | GB/s: 2018 1871 1684 1800 1666 1664 960 109440 93.8 % | GB/s: 2016 1897 1688 1808 1672 1670 992 113088 96.9 % | GB/s: 2016 1919 1693 1818 1678 1675 1024 116736 100.0 % | กิกะไบต์/วินาที: 2016 1942 1704 1832 1686 1683
ผลลัพธ์สำหรับเคอร์เนล SCALE และ GPU ที่เลือก:
โปรดทราบว่าผลลัพธ์ H100 มีไว้สำหรับเวอร์ชัน PCIe ซึ่งมีแบนด์วิดท์ DRAM ต่ำกว่าเวอร์ชัน SXM!
เกณฑ์มาตรฐานการไล่พอยน์เตอร์สำหรับการวัดเวลาแฝง วาร์ปเดียวจะลัดเลาะบัฟเฟอร์ไปจนสุดในลำดับแบบสุ่ม รูปแบบการแบ่งพาร์ติชั่นถูกใช้เพื่อให้แน่ใจว่าแคชไลน์ทั้งหมดถูกโจมตีหนึ่งครั้งก่อนที่จะเข้าถึงได้อีกครั้ง เวลาแฝงในรอบสัญญาณนาฬิกาคำนวณด้วยอัตราสัญญาณนาฬิกาปัจจุบัน
การเปลี่ยนแคช L1 แบบคมชัดที่ 128/192/256 kB สำหรับ NVIDIAS V100/A100/H100 และที่ 16kB สำหรับ MI210 ของ AMD V100 และ MI210 มีแคช L2 ขนาด 6MB A100's และ H100 มีแคช L2 แบบแบ่งส่วนที่ 2x20MB และ 2x25MB ซึ่งจะแสดงเป็นพื้นที่ราบระดับกลางขนาดเล็กเมื่อดึงข้อมูลจากส่วน L2 ที่อยู่ไกลออกไป
RX6900XT GPU RDNA2 มีลำดับชั้นแคชที่น่าสนใจที่สุด โดยมีระดับแคช 4 ระดับที่มองเห็นได้ชัดเจน: แคช L0 ขนาด 16kB, แคช L1 แบบกึ่งแชร์ขนาด 128kB, แคช L2 ขนาด 4MB และแคช Infinity ขนาด 128MB นอกจากนี้ยังเป็น GPU ที่มีการโอเวอร์คล็อกสูงสุด ดังนั้นเวลาในการเข้าถึงที่แน่นอนจะต่ำกว่า GPU อื่นๆ การวัดเวลาแฝงของ DRAM นั้นทำได้ยาก เนื่องจากอินเทอร์เฟซ DRAM ไม่ได้โอเวอร์คล็อกสำหรับคลื่นหน้าเดียว ส่งผลให้เวลาแฝงของ DRAM > 2000 รอบ
วัดแบนด์วิธของระดับแคชที่หนึ่งและที่สอง เปิดตัวหนึ่งบล็อกเธรดต่อ SM แต่ละบล็อกเธรดจะอ่านเนื้อหาของบัฟเฟอร์เดียวกันซ้ำๆ ขนาดบัฟเฟอร์ที่แตกต่างกันจะเปลี่ยนระดับแคชเป้าหมาย
ความจุแคช L1 ขนาด 16kB (MI100/MI210), 128kB (V100), 192kB (A100) และ 256 kB (H100) มีความเด่นชัดและคมชัดมาก สถาปัตยกรรม NVIDIA ทั้งสามสถาปัตยกรรมถ่ายโอนได้ใกล้เคียง 128B/รอบ/SM ค่าที่วัดได้สูงสุดใน MI100 และ MI210 ของ AMD ขึ้นอยู่กับประเภทข้อมูล สำหรับความแม่นยำสองเท่า ค่าสูงสุดคือ 32B/รอบ/CU สำหรับประเภทข้อมูลความแม่นยำเดี่ยวและ 16B (เช่น float4 หรือ double2) แบนด์วิดท์จะสูงถึง 64B
การวัดประสิทธิภาพนี้ไม่ได้กำหนดเป้าหมายระดับลำดับชั้นของหน่วยความจำที่เลยระดับแคชที่สอง (เช่น DRAM สำหรับ GPU ส่วนใหญ่) เนื่องจากชุดข้อมูลไม่ได้หลุดออกจากแคชที่ใช้ร่วมกันอย่างชัดเจน เนื่องจากบล็อกเธรดทั้งหมดอ่านข้อมูลเดียวกัน จึงมีโอกาสนำกลับมาใช้ใหม่ได้จำนวนมากภายในแคชที่ใช้ร่วมกันก่อนที่ข้อมูลจะถูกไล่ออก ค่า RX6900XT นั้นเกินเลยแคช L1 ที่ใช้ร่วมกันขนาด 128kB A100 และ H100 ลดลงเล็กน้อยที่ 20/25MB เมื่อเกินความจุของส่วนแคชเดียว หลังจากจุดนี้ ไม่สามารถจำลองข้อมูลในส่วนแคช L2 ทั้งสองส่วนและแบนด์วิธสูงสุดลดลง เนื่องจากจะต้องดึงข้อมูลจากส่วนอื่นด้วย
วัดแบนด์วิธของระดับแคชที่ใช้ร่วมกัน การวัดประสิทธิภาพนี้ไม่ได้กำหนดเป้าหมายไปที่แคช L1 อย่างชัดเจน
GPU ทั้งสามตัวมีแบนด์วิดท์แคช L2 ที่คล้ายกันประมาณ 5.x TB/s แม้ว่าจะมีความจุต่างกันก็ตาม
ข้อสังเกตที่น่าทึ่งคือ RX6900XT ซึ่งมีแคชที่ใช้ร่วมกันระดับที่สอง นั่นคือ 128MB Infinity Cache ด้วยความเร็วเกือบ 1.92 TB/s ซึ่งเร็วเท่ากับ DRAM ของ A100 ในช่วงเริ่มต้น สามารถมองเห็นแคช L1 แบบกึ่งแชร์ RX6900XT ได้ โดยที่แคช L1 จำนวน 4 ตำแหน่งสำหรับตำแหน่งบล็อกบางตำแหน่งจะมีผลเพียงเล็กน้อย เช่นเดียวกับ H100 ซึ่งมีแคช L1 ที่ใหญ่กว่าพร้อมโอกาสเพิ่มขึ้นสำหรับบล็อกเธรดในการค้นหาข้อมูลที่ต้องการใช้งานอยู่แล้วในแคช L1 ที่โหลดโดยบล็อกเธรดก่อนหน้า วิธีนี้ใช้ได้กับชุดข้อมูลขนาดเล็กเท่านั้นซึ่งมีบล็อกข้อมูลที่แตกต่างกันเพียงไม่กี่บล็อกและโอกาสนี้ยังคงมีนัยสำคัญ สิ่งนี้ไม่ได้เกิดจากเครือข่ายหน่วยความจำที่ใช้ร่วมกันแบบกระจาย ซึ่งอนุญาตให้โหลดจากหน่วยความจำที่ใช้ร่วมกันของ SM อื่น ๆ เนื่องจากใช้งานได้เฉพาะกับการโหลดหน่วยความจำที่ใช้ร่วมกันอย่างชัดเจนเท่านั้น ไม่ใช่การโหลดทั่วโลก สิ่งนี้จะต้องมีแท็กตรวจสอบทุกแคช L1 ใน GPC สำหรับการโหลดใดๆ
มาตรฐานแคช L1 แบบอ่านอย่างเดียวที่เข้าถึงหน่วยความจำด้วยความก้าวหน้า 1 ถึง 128 แบนด์วิดท์จะถูกแปลงเป็นไบต์ต่อรอบและ SM การก้าวจาก 1 ถึง 128 จะถูกจัดรูปแบบในฉากขนาด 16x8 เนื่องจากนั่นจะเน้นรูปแบบที่เกิดซ้ำของจำนวนทวีคูณของ 2/4/8/16
อุปกรณ์แต่ละชิ้นได้รับความพอดี
ซึ่งเป็นแบบจำลองประสิทธิภาพพร้อมค่าใช้จ่ายในการเริ่มต้นระบบ
โปรแกรมนี้สแกนช่วงความเข้มของการคำนวณ โดยการเปลี่ยนแปลงจำนวนทริปวงใน เหมาะทั้งในการศึกษาการเปลี่ยนจากหน่วยความจำไปเป็นโค้ดที่ถูกผูกไว้กับการประมวลผล เช่นเดียวกับการใช้พลังงาน ความถี่สัญญาณนาฬิกา และอุณหภูมิเมื่อใช้ GPU หลายตัว เชลล์สคริปต์ series.sh สร้างไฟล์ปฏิบัติการสำหรับแต่ละค่า และดำเนินการทีละค่าหลังจากสร้างเสร็จแล้ว
รหัสทำงานพร้อมกันบนอุปกรณ์ที่มีอยู่ทั้งหมด ตัวอย่างเอาต์พุตบน 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 869 GB/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/s 968 GF/s 1380 Mhz 159 W 63°C0 640 บล็อก 8 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 142 W 56°C2 640 บล็อก 8 1.125 Fl/B 861 GB/s 968 GF/วินาที 1380 Mhz 157 W 62°C3 640 บล็อก 8 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 144 W 59°C[...]0 640 บล็อก 64 8.125 Fl/B 811 GB/s 6587 GF/ คลื่นความถี่ 1380 Mhz 223 W 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 6603 GF/s 1380 Mhz 243 W 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/s 2.70% 64kB 0.04ms 1.77GB/s 5.16% 128kB 0.04ms 3.46GB/s 7.55% 256kB 0.05ms 5.27GB/s 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/s 0.44% 16384kB 1.38ms 12.11GB/s 0.14% 32768kB 2.74ms 12.23GB/s 0.03% 65536kB 5.46ms 12.29GB/s 0.08% 131072kB 10.89ms 12.32GB/s 0.02% 262144kB 21.75ms 12.34GB/s 0.00% 524288kB 43.47ms 12.35GB/s 0.00% 1048576kB 86.91ms 12.35GB/s 0.00%
วัดอัตราการถ่ายโอน CUDA Unified Memory โดยใช้ STREAM triad kernel มีการใช้ชุดข้อมูลหลายขนาด ทั้งเล็กและใหญ่กว่าหน่วยความจำอุปกรณ์ ตัวอย่างเอาต์พุตบน Tesla V100 PCIe 16GB:
ขนาดบัฟเฟอร์ แบนด์วิดท์การแพร่กระจายเวลา 24 MB 0.1ms 3.2% 426.2GB/s 48 MB 0.1ms 24.2% 511.6GB/s 96 MB 0.1ms 0.8% 688.0GB/s 192 MB 0.3ms 1.8% 700.0GB/s 384 MB 0.5ms 0.5 % 764.6GB/s 768 MB 1.0ms 0.2% 801.8GB/s 1536 MB 2.0ms 0.0% 816.9GB/s 3072 MB 3.9ms 0.1% 822.9GB/s 6144 MB 7.8ms 0.2% 823.8GB/s 12288 MB 15.7ms 0.1% 822.1GB/s 24576 MB 5108.3ms 0.5% 5.0GB/s 49152 MB 10284.7ms 0.8% 5.0GB/s
วัดเวลาแฝงและปริมาณงานของการดำเนินการ FMA, DIV และ SQRT โดยจะสแกนการรวมกันของ ILP=1..8 โดยการสร้าง 1..8 ห่วงโซ่การพึ่งพาอิสระ และ TLP โดยการเปลี่ยนแปลงจำนวนการบิดงอบน SM จาก 1 ถึง 32 ผลลัพธ์สุดท้ายคือตาราง 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 รอบ