Las matrices de entrada
Las características de la matriz de entrada al algoritmo, básicamente el número de columnas y el número de elementos no nulos en cada columna, afecta a la forma en que la GPU aprovecha los mecanismos de paralelización para el código, y debe ser elegido cuidadosamente de cara a optimizar el rendimiento. Se puede utilizar cualquiera de las matrices disponibles en el repositorio Matrix Market (colección Harwell-Boeing de matrices dispersas), o de forma más astuta, crear una matriz propia que reúna los rasgos que consideremos óptimos para maximizar la productividad de la GPU. Para ello, junto con mytoy.cu proporcionamos como herramienta un generador de matrices dispersas que respeta el formato aceptado por el código para su matriz de entrada.
Algunos ejemplos interesantes que hemos creado con este generador son los siguientes:
Nombre del fichero |
Filas de la matriz |
Columnas de la matriz |
Elementos no nulos | Carga de trabajo | GPU destino |
---|---|---|---|---|---|
mat-200-200-27k.rua | 200 | 200 | 27.000 | Mínima | Kepler |
mat-4000-200-540k.rua | 4.000 | 200 | 540.000 | 20 x Mínima | Kepler |
mat-32000-200-4320k.rua | 32.000 | 200 | 4.320.000 | 160 x Mínima | Kepler |
mat-512000-200-69120k.rua | 512.000 | 200 | 69.120.000 | 2560 x Mínima | Kepler |
mat-300-100-22k.rua | 300 | 100 | 22.000 | Mínima | Fermi |
mat-6000-100-440k.rua | 6.000 | 100 | 440.000 | 20 x Mínima | Fermi |
mat-24000-100-1760k.rua | 24.000 | 100 | 1.760.000 | 80 x Mínima | Fermi |
mat-96000-100-7040k.rua | 96.000 | 100 | 7.040.000 | 320 x Mínima | Fermi |
Observaciones:
- Las matrices dispersas utilizan el formato comprimido por columnas (Compressed Storage Column - CSC).
- Se utiliza una stream CUDA por cada columna de la matriz. Hay matrices con 100 y 200 columnas, pero muchas más filas, y sobre todo, valores no nulos (hasta un máximo de 69.120.000).
- La matriz de entrada puede seleccionarse del directorio sparsematrices. El programador puede también generar sus propias matrices para adaptar la estructura y posición de los elementos no nulos a aquellos que considere óptimos para maximizar los GFLOPS que computa la GPU. Para ello debe emplear las rutinas que encontrará en el directorio HB-libraries.
- Todos los valores no nulos de la matriz se han inicializado con el número 0.999999 para prevenir underflow/overflow cuando se computa de forma reiterada sobre ellos mismos.