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.