Esta es una colección de microevaluaciones de GPU. Cada prueba está diseñada para probar un escenario o mecanismo de hardware particular. Algunos de los puntos de referencia se han utilizado para producir datos para estos artículos:
"Estimación analítica del rendimiento durante la generación de código en GPU modernas"
"Ingeniería de rendimiento para núcleos de multiplicación de matrices altos y delgados reales y complejos en GPU"
¡Los puntos de referencia llamados gpu-<benchmarkname>
son hipificables! Mientras que el destino Makefile predeterminado crea el ejecutable CUDA cuda-<benchmarkname>
, el destino make hip-<benchmarkname>
usa la herramienta hipify-perl para crear un archivo main.hip
a partir del archivo main.cu
y lo compila usando el compilador hip. . Los archivos principales de CUDA están escritos para que la herramienta hipify funcione sin mayor intervención.
También eche un vistazo a las funciones gpu-metrics, que proporcionan una forma concisa de medir las métricas del contador de rendimiento del hardware del lanzamiento de un kernel dentro del programa en ejecución.
Si algo de esto es útil, ¡las estrellas y las citas son bienvenidas!
Mide el ancho de banda de los núcleos de transmisión para diferentes ocupaciones. Una asignación de memoria compartida sirve como spoiler, de modo que sólo se pueden ejecutar dos bloques de subprocesos por SM. Al escanear el tamaño del bloque de subprocesos de 32 a 1024, se escanea la ocupación del 3% al 100%.
Núcleo | Fórmula | |
---|---|---|
inicio | A[yo] = c | 1 flujo de tienda |
leer | suma = A[i] | 1 flujo de carga |
escala | A[i] = B[i] * c | 1 flujo de carga, 1 flujo de tienda |
tríada | A[i] = B[i] + c * C[i] | 2 flujos de carga, 1 flujo de almacenamiento |
3 puntos | A[i] = B[i-1] + B[i] + B[i+1] | 1 flujo de carga, 1 flujo de almacenamiento |
5 puntos | A[i] = B[i-2] + B[i-1] + B[i] + B[i+1] + B[i+2] | 1 flujo de carga, 1 flujo de almacenamiento |
Resultados de una NVIDIA-H100-PCIe/CUDA 11.7
hilos blockSize %occ | tríada de escala de lectura inicial 3pt 5pt 32 3648 3 % | GB/s: 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 % | GB/s: 2016 1942 1704 1832 1686 1683
Los resultados para el kernel SCALE y una selección de GPU:
Tenga en cuenta que los resultados del H100 son para la versión PCIe, que tiene un ancho de banda DRAM menor que la versión SXM.
Puntero que busca puntos de referencia para la medición de latencia. Una única deformación atraviesa completamente un búfer en orden aleatorio. Se utiliza un esquema de partición para garantizar que todas las líneas de caché se accedan exactamente una vez antes de volver a acceder a ellas. La latencia en los ciclos de reloj se calcula con la velocidad del reloj actual.
Transiciones nítidas de caché L1 a 128/192/256 kB para NVIDIAS V100/A100/H100 y a 16 kB para MI210 de AMD. Tanto V100 como MI210 tienen una caché L2 de 6 MB. Los A100 y H100 tienen una caché L2 segmentada de 2x20 MB y 2x25 MB, que se manifiesta como una pequeña meseta intermedia cuando los datos se obtienen de la sección L2 más lejana.
La GPU RDNA2, la RX6900XT, tiene la jerarquía de caché más interesante con sus 4 niveles de caché claramente visibles: el caché L0 de 16 kB, el caché L1 semicompartido de 128 kB, el caché L2 de 4 MB y el caché Infinity de 128 MB. También es la GPU con mayor frecuencia, por lo que los tiempos de acceso absoluto serían más bajos que los de otras GPU. Medir su latencia DRAM es difícil porque la interfaz DRAM no registra un solo frente de onda, lo que resulta en latencias DRAM > 2000 ciclos.
Mide los anchos de banda del primer y segundo nivel de caché. Lanza un bloque de subprocesos por SM. Cada bloque de subproceso lee repetidamente el contenido del mismo búfer. La variación del tamaño del búfer cambia el nivel de caché de destino.
Las capacidades de caché L1 de 16 kB (MI100/MI210), 128 kB (V100), 192 kB (A100) y 256 kB (H100) son muy pronunciadas y nítidas. Las tres arquitecturas NVIDIA transfieren cerca de 128B/ciclo/SM, el valor máximo medido en MI100 y MI210 de AMD depende del tipo de datos. Para doble precisión, el máximo es 32B/ciclo/CU. Para tipos de datos de precisión simple y 16 B (ya sea float4 o double2), el ancho de banda es de hasta 64 B.
Este punto de referencia no apunta a los niveles de jerarquía de memoria más allá del segundo nivel de caché (es decir, DRAM para la mayoría de las GPU), porque los conjuntos de datos no salen claramente de un caché compartido. Debido a que todos los bloques de subprocesos leen los mismos datos, existe un gran potencial de reutilización dentro de la caché compartida antes de que se desalojen los datos. Los valores del RX6900XT son una locura más allá de su caché L1 compartida de 128 kB. A100 y H100 caen ligeramente a 20/25 MB, cuando se excede la capacidad de una única sección de caché. Más allá de este punto, los datos no se pueden replicar en ambas secciones de la caché L2 y el ancho de banda máximo disminuye, ya que los datos también deben recuperarse de la otra sección.
Mide anchos de banda de niveles de caché compartidos. Este punto de referencia explícitamente no se dirige a las cachés L1.
Las tres GPU tienen anchos de banda de caché L2 similares de aproximadamente 5,x TB/s, aunque con diferentes capacidades.
Una observación notable es la RX6900XT, que tiene un segundo nivel de caché compartido, el Infinity Cache de 128 MB. Con casi 1,92 TB/s, es tan rápido como la DRAM del A100. Al principio, se puede ver la caché L1 semicompartida del RX6900XT, donde para algunas ubicaciones de bloques las 4 cachés L1 tienen un pequeño efecto. Lo mismo se aplica al H100, que tiene una caché L1 más grande con una mayor probabilidad de que un bloque de subprocesos encuentre los datos en los que desea trabajar que ya están en la caché L1 cargada por el bloque de subprocesos anterior. Esto sólo funciona para conjuntos de datos pequeños, donde sólo hay unos pocos bloques de datos diferentes y esta posibilidad sigue siendo significativa. Esto no es atribuible a la Red de Memoria Compartida Distribuida, que permite cargar desde la memoria compartida de otros SM, porque solo funciona para cargas explícitas de memoria compartida y no para cargas globales. Esto requeriría que la etiqueta verifique cada caché L1 en el GPC para detectar cualquier carga.
Solo lectura, punto de referencia de caché L1 que accede a la memoria con pasos de 1 a 128. El ancho de banda se convierte a Bytes por ciclo y SM. Los pasos del 1 al 128 están formateados en un cuadro de 16x8, porque resalta los patrones recurrentes de múltiplos de 2/4/8/16.
Cada dispositivo recibe un ajuste de
que modela el rendimiento con una sobrecarga de inicio
Este programa escanea un rango de intensidades computacionales, variando la cantidad de viajes del circuito interno. Es adecuado tanto para estudiar la transición de la memoria a los códigos vinculados al cálculo como también el consumo de energía, las frecuencias de reloj y las temperaturas cuando se utilizan múltiples GPU. El script de shell series.sh crea un ejecutable para cada valor y los ejecuta uno tras otro después de terminar de compilar.
El Código se ejecuta simultáneamente en todos los dispositivos disponibles. Ejemplo de salida en cuatro Tesla V100 PCIe de 16 GB:
1 640 bloques 0 sus 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 138 W 60°C2 640 bloques 0 sus 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 137 W 59°C3 640 bloques 0 es 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 56°C0 640 bloques 0 sus 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 54°C1 640 bloques 8 sus 1,125 Fl/B 861 GB/s 968 GB/s 1380 Mhz 159 W 63°C0 640 bloques 8 sus 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 142 W 56°C2 640 bloques 8 sus 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 157 W 62°C3 640 bloques 8 sus 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 144 W 59°C[...]0 640 bloques 64 sus 8.125 Fl/B 811 GB/s 6587 GF/s 1380 Mhz 223 W 63 °C3 640 bloques 64 sus 8.125 Fl/B 813 GB/s 6604 GF/s 1380 Mhz 230 W 66°C1 640 bloques 64 sus 8.125 Fl/B 812 GB/s 6595 GF/s 1380 Mhz 241 W 71°C2 640 bloques 64 sus 8.125 Fl/B 813 GB/s 6603 GF/s 1380 Mhz 243 W 69°C
Mide la tasa de transferencia de host a dispositivo de la función cudaMemcpy en una variedad de tamaños de transferencia
Ejemplo de salida para un Tesla V100 PCIe de 16 GB
1kB 0,03ms 0,03GB/s 0,68% 2kB 0,03ms 0,06GB/s 5,69% 4kB 0,03ms 0,12GB/s 8,97% 8kB 0,03ms 0,24GB/s 6,25% 16kB 0,04ms 0,44 GB/s 5,16 % 32 kB 0,04 ms 0,93 GB/s 2,70 % 64 kB 0,04 ms 1,77 GB/s 5,16 % 128 kB 0,04 ms 3,46 GB/s 7,55 % 256 kB 0,05 ms 5,27 GB/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,29 GB/s 0,08 % 131072 kB 10,89 ms 12,32 GB/s 0,02 % 262144 kB 21,75 ms 12,34 GB/s 0,00 % 524288 kB 43,47 ms 12,35 GB/s 0,00 % 1048576kB 86,91ms 12,35GB/s 0,00%
Mide la tasa de transferencia de la memoria unificada CUDA utilizando un kernel tríada STREAM. Se utiliza una variedad de tamaños de conjuntos de datos, tanto más pequeños como más grandes que la memoria del dispositivo. Ejemplo de salida en un Tesla V100 PCIe de 16 GB:
tamaño del búfer tiempo de ancho de banda extendido 24 MB 0,1 ms 3,2 % 426,2 GB/s 48 MB 0,1 ms 24,2 % 511,6 GB/s 96 MB 0,1 ms 0,8 % 688,0 GB/s 192 MB 0,3 ms 1,8 % 700,0 GB/s 384 MB 0,5 ms 0,5 % 764,6 GB/s 768 MB 1,0 ms 0,2 % 801,8 GB/s 1536 MB 2,0 ms 0,0 % 816,9 GB/s 3072 MB 3,9 ms 0,1 % 822,9 GB/s 6144 MB 7,8 ms 0,2 % 823,8 GB/s 12288 MB 15,7 ms 0,1 % 822,1 GB/s 24576 MB 5108,3 ms 0,5 % 5,0 GB/s 49152 MB 10284,7 ms 0,8 % 5,0 GB/s
Mide la latencia y el rendimiento de la operación FMA, DIV y SQRT. Escanea combinaciones de ILP=1..8, generando 1..8 cadenas de dependencia independientes, y TLP, variando el recuento de deformación en un SM de 1 a 32. El resultado final es una tabla ILP/TLP, con el recíproco Rendimientos (ciclos por operación):
Ejemplo de salida en un Tesla V100 PCIe de 16 GB:
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
Algunas características se pueden extraer de la trama.
Latencias:
DFMA: 8 ciclos
DDIV: 112 ciclos
DSQRT: 101 ciclos
Rendimiento de un warp (se ejecuta en un cuadrante SM), sin dependencias:
DFMA: 1/4 por ciclo (ILP 2, para superposición de operaciones)
DDIV: 1/112 por ciclo (sin ILP/superposición)
DSQRT: 1/101 por ciclo (sin ILP/superposición)
Rendimiento de múltiples warps (todos los cuadrantes SM), las dependencias son irrelevantes:
DFMA: 1 por ciclo
DDIV: 1/7,5 ciclos
DSQRT: 1/9,6 ciclos