30.07.2015 Views

Métodos no lineales basados en el gradiente conjugado ... - JP2011

Métodos no lineales basados en el gradiente conjugado ... - JP2011

Métodos no lineales basados en el gradiente conjugado ... - JP2011

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Métodos <strong>no</strong> <strong>lineales</strong> <strong>basados</strong> <strong>en</strong> <strong>el</strong> gradi<strong>en</strong>te<strong>conjugado</strong> para GPUsH. Migallón, 1 V. Migallón 2 y J. P<strong>en</strong>adés 2Resum<strong>en</strong>— En este artículo se pres<strong>en</strong>tan algoritmos paral<strong>el</strong>ospara resolver sistemas <strong>no</strong> <strong>lineales</strong>, diseñados para GPUs (GraphicsProccesing Unit), para lo cual se hecho uso de CUDA (ComputeUnified Device Architecture). Los algoritmos propuestos están<strong>basados</strong> tanto <strong>en</strong> la versión de Fletcher-Reeves d<strong>el</strong> método d<strong>el</strong> gradi<strong>en</strong>te<strong>conjugado</strong>, como <strong>en</strong> precondicionadores poli<strong>no</strong>miales construidosmediante <strong>el</strong> método por bloques <strong>en</strong> dos etapas. Se analizandiversas estrategias para la paral<strong>el</strong>ización de dichos algoritmos,así como difer<strong>en</strong>tes formatos de almac<strong>en</strong>ami<strong>en</strong>to/compresión de lasmatrices dispersas consideradas <strong>en</strong> este trabajo. Expondremos resultadosnuméricos comparando la ejecución <strong>en</strong> plataformas paral<strong>el</strong>asde gra<strong>no</strong> fi<strong>no</strong> (GPU) con la ejecución <strong>en</strong> plataformas paral<strong>el</strong>asbasadas <strong>en</strong> hilos (multiprocesadores de memoria compartida o multicores).Palabras clave—GPGPU, librerías GPU, gradi<strong>en</strong>te <strong>conjugado</strong> <strong>no</strong>lineal, precondicionadores paral<strong>el</strong>os, factorizaciones ILU, métodospor bloques <strong>en</strong> dos etapas.I. INTRODUCCIÓNSE considera la resolución d<strong>el</strong> sistema <strong>no</strong> linealAx = Φ(x), (1)dondeA ∈ R n×n es una matriz simétrica y definida positiva,y Φ : R n → R n es una función <strong>no</strong> lineal con ciertaspropiedades. SeaΨ : R n → R una aplicación <strong>no</strong> lineal, ysea〈x,y〉 = x T y <strong>el</strong> producto inter<strong>no</strong> <strong>en</strong>R n . El problemade minimización consist<strong>en</strong>te <strong>en</strong> <strong>en</strong>contrarx ∈ R n tal queJ(x) = miny∈RnJ(y), (2)donde J(x) = 1 2〈Ax,x〉 − Ψ(x), es equival<strong>en</strong>te a <strong>en</strong>contrarx ∈ R n tal que F(x) = Ax−Φ(x) = 0, dondeΦ(x) = Ψ ′ (x).Un método efectivo para resolver <strong>el</strong> sistema (1), t<strong>en</strong>i<strong>en</strong>do<strong>en</strong> cu<strong>en</strong>ta la conexión con <strong>el</strong> problema de minimización(2), es la versión de Fletcher-Reeves [1] d<strong>el</strong> método d<strong>el</strong>gradi<strong>en</strong>te <strong>conjugado</strong> <strong>no</strong> lineal (NLCG), que se detalla acontinuación:Algoritmo 1: (GC <strong>no</strong> lineal (Fletcher-Reeves))Dado un vector inicial x (0)r (0) = Φ(x (0) )−Ax (0)p (0) = r (0)Para i = 0,1,..., hasta converg<strong>en</strong>ciaα i =→ (ver a continuación)x (i+1) = x (i) +α i p (i)r (i+1) = r (i) −Φ(x (i) )+Φ(x (i+1) )−α i Ap (i)Test de converg<strong>en</strong>ciaβ i+1 = − 〈r(i+1) ,r (i+1) 〉〈r (i) ,r (i) 〉p (i+1) = r (i+1) −β i+1 p (i)1 Dpto. de Física y Arquitectura de Computadores, UniversidadMigu<strong>el</strong> Hernández, e-mail: hmigallon@umh.es.2 Dpto. de Ci<strong>en</strong>cia de la Computación e Int<strong>el</strong>ig<strong>en</strong>ciaArtificial, Universidad de Alicante, e-mail:violeta,jp<strong>en</strong>ades@dccia.ua.es.En <strong>el</strong> Algoritmo 1 la <strong>el</strong>ección de α i debe minimizar lafunción asociada J <strong>en</strong> la dirección p (i) . Esto es equival<strong>en</strong>tea resolver <strong>el</strong> problema unidim<strong>en</strong>sional de punto cerodJ(x (i) +α ip (i) )dα i12= 0. De la definición deJ, se deduce queJ(x (i) + αp (i) ) =〈A(x (i) + α ip (i) ),x (i) + α ip (i)〉 − Ψ(x (i) + α ip (i) ).Por tanto, difer<strong>en</strong>ciando respecto aα i se obti<strong>en</strong>edJ(x (i) + α ip (i) )dα i=α i〈Ap (i) ,p (i)〉 〈− r (i) ,p (i)〉 〈+ Φ(x (i) ) − Φ(x (i) + α ip (i) ),p (i)〉 ,donde r (i) = Φ(x (i) )−Ax (i) es <strong>el</strong> residuo <strong>no</strong> lineal.Por otra parte, puede verse que la segunda derivada respectoaα i esd 2 J(x (i) + α ip (i) )dα 2 =i〈Ap (i) ,p (i)〉 〈− Φ ′ (x (i) + α ip (i) )p (i) ,p (i)〉 .Por lo tanto, si se usa <strong>el</strong> método de Newton para resolver<strong>el</strong> problema de punto cero para α i , se obti<strong>en</strong>e α (k+1)α (k)i−δ (k) , donde (si<strong>en</strong>do γ = (x (i) +α (k)i p (i) ))δ (k) = dJ(x(i) + α (k)i p (i) )/dα id 2 J(x (i) + α (k)i p (i) )/dα 2 i=i =〈α (k)i Ap (i) ,p (i)〉 〈− r (i) ,p (i)〉 +〈Φ(x (i) ) − Φ(γ),p (i)〉〈Ap (i) ,p (i)〉 − 〈 Φ ′ (γ)p (i) ,p (i)〉 .Hay que remarcar que para obt<strong>en</strong>er δ (k) , los productosinter<strong>no</strong>s〈Ap (i) ,p (i) 〉 y〈r (i) ,p (i) 〉 pued<strong>en</strong> computarseúnicam<strong>en</strong>te <strong>en</strong> la iteración inicial d<strong>el</strong> método de Newton.Además Ap (i) ha sido calculado <strong>en</strong> la iteración correspondi<strong>en</strong>ted<strong>el</strong> método d<strong>el</strong> gradi<strong>en</strong>te <strong>conjugado</strong>.El objetivo d<strong>el</strong> precondicionami<strong>en</strong>to es mejorar <strong>el</strong>número de condición (cond) de la matriz d<strong>el</strong> sistema aresolver. Supongamos que M es una matriz simétricay definida positiva que aproxima a A, y fácilm<strong>en</strong>te invertible.Entonces, podemos resolver indirectam<strong>en</strong>te <strong>el</strong>sistema Ax = Φ(x) resolvi<strong>en</strong>do <strong>el</strong> sistema M −1 Ax =M −1 Φ(x). Si cond(M −1 A)


α i =→ ver algoritmo 1x (i+1) = x (i) +α i p (i)r (i+1) = r (i) −Φ(x (i) )+Φ(x (i+1) )−α i Ap (i)Resolver Ms (i+1) = r (i+1)Test de converg<strong>en</strong>ciaβ i+1 = − 〈s(i+1) ,r (i+1) 〉〈s (i) ,r (i) 〉p (i+1) = r (i+1) −β i+1 p (i)Dado que <strong>el</strong> sistema auxiliar Ms = r ha de resolverse<strong>en</strong> cada iteración d<strong>el</strong> algoritmo, está solución hade poderse obt<strong>en</strong>er rápidam<strong>en</strong>te. Además, para que <strong>el</strong>precondicionador sea efectivo es necesario que M seauna bu<strong>en</strong>a aproximación de A. El precondicionami<strong>en</strong>tomediante series truncadas [2] es una técnica común deprecondicionami<strong>en</strong>to para resolver sistemas <strong>lineales</strong>, queconsiste <strong>en</strong> considerar una partición de la matriz A talque,A = P −Q (3)y realizar m iteraciones d<strong>el</strong> proceso iterativo definidopor esta partición, buscando la solución de As = r, ytomando s (0) = 0. Es bi<strong>en</strong> co<strong>no</strong>cido que la solución d<strong>el</strong>sistema auxiliar Ms = r es s = (I + R + R 2 + ... +R m−1 )P −1 r, dondeR = P −1 Q y la matriz de precondicionami<strong>en</strong>toesM m = P(I +R+R 2 +...+R m−1 ) −1(ver [2]).Si además suponemos que A está dividida <strong>en</strong> p × pp∑bloques, con bloques diagonales de ord<strong>en</strong> n j , n j =j=1n, tal que <strong>el</strong> sistema (1) puede escribirse como:⎡⎤⎡⎤ ⎡ ⎤A 11 A 12 ··· A 1p x 1 Φ 1 (x)A 21 A 22 ··· A 2px 2Φ ⎢⎥⎢⎥⎣. .. ⎦⎣. ⎦ = 2 (x)⎢⎥⎣. ⎦ , (4)A p1 A p2 ··· A pp x p Φ p(x)donde x y Φ(x) están particionados <strong>en</strong> función d<strong>el</strong>tamaño de los bloques deA. Si consideramos la partición(3) estandoP compuesta por los bloques diagonales deA<strong>en</strong> la ecuación (4), es decirP = diag(A 11 ,...,A pp ), (5)realizarmiteraciones d<strong>el</strong> proceso iterativo definido por lapartición (3) para obt<strong>en</strong>er una aproximación de As = r,corresponde a realizar m iteraciones d<strong>el</strong> método de Jacobipor bloques. Por lo tanto, <strong>en</strong> cada iteración l, l =1,2,..., d<strong>el</strong> método de Jacobi por bloques, ha de resolversep sistemas <strong>lineales</strong> indep<strong>en</strong>di<strong>en</strong>tes d<strong>el</strong> tipo,A jj s (l)j = (Qs (l−1) +r) j , 1 ≤ j ≤ p. (6)Por tanto, los sistemas <strong>lineales</strong> (6) pued<strong>en</strong> ser resu<strong>el</strong>tospor procesos distintos. Sin embargo, cuando <strong>el</strong> tamañode los bloques diagonales A jj , 1 ≤ j ≤ p, es grande, esaconsejable utilizar un proceso iterativo para obt<strong>en</strong>er unaaproximación de las soluciones, utilizando por tanto <strong>el</strong>método <strong>en</strong> dos etapas; ver por ejemplo [3]. Formalm<strong>en</strong>te,consideramos las particionesA jj = B j −C j , 1 ≤ j ≤ p, (7)y <strong>en</strong> la l-ésima iteración se realizan, para cada j, 1 ≤j ≤ p, q(j) iteraciones d<strong>el</strong> proceso iterativo definido porlas particiones (7) para obt<strong>en</strong>er una aproximación de lasolución de (6). Por tanto, para resolver <strong>el</strong> sistema auxiliarMs = r d<strong>el</strong> algoritmo 2, se realizan m pasos d<strong>el</strong>a iteración s (l) = Ts (l−1) + W −1 r, l = 1,2,...,m,tomando s (0) = 0, dondeT = H +(I −H)P −1 Q, W = P(I −H) −1 , (8)estando P definido <strong>en</strong> (5) y H =diag((B1 −1 C 1) q(1) ,...,(Bp −1 C p ) q(p) ); ver por ejemplo[4]. El sigui<strong>en</strong>te algoritmo muestra <strong>el</strong> método utilizadopara aproximar <strong>el</strong> sistema lineal As = r (ver [3]).Algoritmo 3: (Método paral<strong>el</strong>o por bloques <strong>en</strong> dosetapas)Dado un vector inicial s (0) =() T(s (0)1 )T ,(s (0)2 )T ,...,(s (0)p ) T , y una secu<strong>en</strong>ciade número de iteraciones internas q(j), 1 ≤ j ≤ pPara l = 1,2,..., hasta converg<strong>en</strong>ciaEn <strong>el</strong> proceso j, j = 1,2,...,p= s (l)jPara k = 1 hasta q(j)y (0)jB j y (k)j = C j y (k−1)j +(Qs (l−1) +r) j() Ts (l) = (y (q(1))1 ) T ,(y (q(2))2 ) T ,...,(y p(q(p)) ) THay que remarcar, que <strong>el</strong> vector obt<strong>en</strong>ido tras m iteracionesd<strong>el</strong> algoritmo 3, si<strong>en</strong>do s (0) = 0, vi<strong>en</strong>e dado pors (m) = (I + T + T 2 + ... + T m−1 )W −1 r donde T yW están definidos <strong>en</strong> (8). Por tanto, <strong>el</strong> precondicionadorobt<strong>en</strong>ido mediante <strong>el</strong> método por bloques <strong>en</strong> dos etapasesM m = W(I+T +T 2 +...+T m−1 ) −1 . Para obt<strong>en</strong>erlas particiones internas, <strong>en</strong> <strong>el</strong> método NLPCG, se ha hechouso de factorizaciones incompletas LU, <strong>en</strong> [5] puedeverse una descripción detallada d<strong>el</strong> algoritmo NLPCG.II. PROGRAMACIÓN PARALELA CON CUDALa arquitectura de una GPU (Graphics ProcessingUnit), está formada por un conjunto de multiprocesadoresde<strong>no</strong>minados “streaming multiprocessors (SM)”, cadau<strong>no</strong> de los cuales está compuesto por un conjunto deprocesadores de<strong>no</strong>minados “streaming processors (SP)”.CUDA es <strong>el</strong> mod<strong>el</strong>o de programación utilizado para explotar<strong>el</strong> paral<strong>el</strong>ismo de las GPUs, <strong>el</strong> cual es un mod<strong>el</strong>oheterogéneo que hace uso tanto de la CPU comode la GPU. En <strong>el</strong> mod<strong>el</strong>o de programación de CUDA(ver por ejemplo [6] y [7]), una aplicación consiste <strong>en</strong>un programa secu<strong>en</strong>cial principal (o “host”) ejecutado<strong>en</strong> la CPU, <strong>el</strong> cual puede lanzar programas, co<strong>no</strong>cidoscomo “kern<strong>el</strong>s”, <strong>en</strong> <strong>el</strong> dispositivo paral<strong>el</strong>o, es decir <strong>en</strong>la GPU. Pese a que la CPU sobre la que se ejecuta <strong>el</strong>programa host puede ser un multiprocesador de memoriacompartida, con capacidad para ejecutar programas paral<strong>el</strong>os,desarrollados por ejemplo con Op<strong>en</strong>MP, sólo unprocesador (o “core”) puede lanzar un kern<strong>el</strong>, es decir lasllamadas a los kern<strong>el</strong>s deb<strong>en</strong> serializarse. La ejecuciónde los kern<strong>el</strong>s son de tipo SPMD (Single Program MultipleData), que, además, puede utilizar un gran númerode “threads” o hilos. Cada hilo de un kern<strong>el</strong> ejecuta <strong>el</strong>mismo programa secu<strong>en</strong>cial, si<strong>en</strong>do <strong>el</strong> programador <strong>el</strong>que debe organizar los hilos de un kern<strong>el</strong> <strong>en</strong> bloques,formando estos bloques lo que se co<strong>no</strong>ce como “grid”.Los hilos de un bloque pued<strong>en</strong> cooperar <strong>en</strong>tre <strong>el</strong>los, sin-


cronizando su ejecución mediante barreras. Las memoriasdisponibles <strong>en</strong> una GPU son: la memoria global quees la de mayor lat<strong>en</strong>cia, la memoria de sólo lectura (“constant”),la memoria de “textura”, la memoria compartiday los registros. La memoria compartida lo es para unbloque, y los registros son propios de cada hilo. Aunque,tanto la memoria “constant” como la memoria “texture”dispon<strong>en</strong> de caché, <strong>no</strong> han sido utilizadas por la naturalezade nuestro problema.El hardware se ocupa de la organización, creación ymanejo de los hilos. Por ejemplo, la GPU GTX 280dispone de30 multiprocesadores, pudi<strong>en</strong>do trabajar hastacon30K hilos. Para manejar efici<strong>en</strong>tem<strong>en</strong>te esta cantidadde hilos, la GPU utiliza una arquitectura SIMT (SingleInstruction Multiple Thread), ver por ejemplo [6] y [8],<strong>en</strong> la cual los hilos de un bloque se ejecutan <strong>en</strong> gruposde 32 hilos, llamados “warps”. Un warp <strong>en</strong> un mom<strong>en</strong>todado ejecuta una única instrucción <strong>en</strong> todos sus hilos. Noobstante, los hilos de un warp pued<strong>en</strong> seguir su propiaejecución, es decir, la ejecución <strong>en</strong> cada hilo puede serdifer<strong>en</strong>te, si<strong>en</strong>do mucho más efici<strong>en</strong>te que todos los hilosrealic<strong>en</strong> la misma ejecución.III. FORMATOS DE ALMACENAMIENTO DE MATRICESDISPERSASEl producto de una matriz dispersa por un vector(SpMV) es una de las operaciones básicas <strong>en</strong> los algoritmosvistos <strong>en</strong> la sección I. Para optimizar esta operaciónhemos considerado varios formatos de almac<strong>en</strong>ami<strong>en</strong>tode matrices dispersas. En concreto, se ha usado <strong>el</strong> formatoCRS (Compressed Row Storage), <strong>el</strong> formato ELL-PACK [9] (o ITPACK), y <strong>el</strong> formato propuesto <strong>en</strong> [10]de<strong>no</strong>minado ELLPACK-R. Exist<strong>en</strong> multitud de posiblesrepres<strong>en</strong>taciones de matrices dispersas, cada una con difer<strong>en</strong>tesrequisitos de almac<strong>en</strong>ami<strong>en</strong>to, difer<strong>en</strong>tes característicasde computación y distintas formas de accedery manipular los <strong>el</strong>em<strong>en</strong>tos de la matriz. Hemos consideradoúnicam<strong>en</strong>te formatos de almac<strong>en</strong>ami<strong>en</strong>to de matricesdispersas de uso común y que además pres<strong>en</strong>tan unbu<strong>en</strong> comportami<strong>en</strong>to al computar la operación SpMV <strong>en</strong>una GPU.El formato CRS (o CSR), muy común y de propósitog<strong>en</strong>eral, <strong>no</strong> presupone nada respecto al patrón de dispersiónde la matriz, y <strong>no</strong> almac<strong>en</strong>a ningún <strong>el</strong>em<strong>en</strong>to <strong>no</strong>necesario. El formato CRS almac<strong>en</strong>a <strong>en</strong> posiciones contiguasde memoria los <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos de la matriz.Este formato utiliza tres vectores, u<strong>no</strong> de “floats” y dosde <strong>en</strong>teros. El primero almac<strong>en</strong>a los <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulosde la matrizAagrupados por filas. En <strong>el</strong> primer vector de<strong>en</strong>teros se almac<strong>en</strong>a la columna de los <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos.El otro vector de <strong>en</strong>teros almac<strong>en</strong>a la posición <strong>en</strong> laque empieza cada fila <strong>en</strong> los otros dos vectores, por tanto<strong>el</strong> último <strong>el</strong>em<strong>en</strong>to de este vector corresponde al númerode <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos (NNZ) o a NNZ+1 si <strong>el</strong> primer<strong>el</strong>em<strong>en</strong>to es 1 <strong>en</strong> lugar de 0.El formato ELLPACK [9] fue diseñado para resolversistemas <strong>lineales</strong> de gran tamaño <strong>en</strong> arquitecturas vectoriales.Hay que hacer <strong>no</strong>tar que exist<strong>en</strong> ciertas similitudes<strong>en</strong>tre una arquitectura vectorial y la arquitectura deuna GPU. El formato ELLPACK, también de<strong>no</strong>minadoITPACK, usa dos vectores, <strong>el</strong> primero, de floats, almac<strong>en</strong>alos <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos de la matriz; y <strong>el</strong> segundo,de <strong>en</strong>teros, almac<strong>en</strong>a <strong>el</strong> número de columna de cadau<strong>no</strong> de los <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos almac<strong>en</strong>ados <strong>en</strong> <strong>el</strong> primervector. La dim<strong>en</strong>sión de ambos vectores es, al me<strong>no</strong>s,N ∗ MaxEntriesbyRows, donde N es <strong>el</strong> número defilas y MaxEntriesbyRows es <strong>el</strong> número máximo de<strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos por fila <strong>en</strong> la matriz. Por tanto, <strong>en</strong>este formato todas las filas se almac<strong>en</strong>an ocupando <strong>el</strong>mismo tamaño, aqu<strong>el</strong>las filas con un número de <strong>el</strong>em<strong>en</strong>tos<strong>no</strong> nulos inferior a MaxEntriesbyRows, son r<strong>el</strong>l<strong>en</strong>adascon ceros. T<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta esta estructura, <strong>el</strong>formato ELLPACK almac<strong>en</strong>a <strong>en</strong> una estructura regular,similar a una matriz d<strong>en</strong>sa, una matriz dispersa. Esta estructuraregular, como se ha dicho anteriorm<strong>en</strong>te, es apropiadapara realizar operaciones con matrices dispersas <strong>en</strong>arquitecturas vectoriales. Sin embargo, si <strong>el</strong> porc<strong>en</strong>tajede <strong>el</strong>em<strong>en</strong>tos nulos es alto y <strong>el</strong> patrón de dispersión d<strong>el</strong>a matriz es irregular, respecto al número de <strong>el</strong>em<strong>en</strong>tos<strong>no</strong> nulos por fila, <strong>el</strong> r<strong>en</strong>dimi<strong>en</strong>to d<strong>el</strong> formato ELLPACKdisminuye, además de aum<strong>en</strong>tar <strong>el</strong> tamaño de memorianecesario para almac<strong>en</strong>ar la matriz respecto a otros formatos.La variante d<strong>el</strong> formato ELLPACK, de<strong>no</strong>minadaELLPACK-R [10], fue diseñada con <strong>el</strong> objetivo de optimizar<strong>el</strong> producto de una matriz dispersa por un vector<strong>en</strong> GPUs. El formato ELLPACK-R está formado porlos mismos dos vectores d<strong>el</strong> formato ELLPACK, más untercer vector de <strong>en</strong>teros de tamaño N, que almac<strong>en</strong>a <strong>el</strong>número de <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos de cada fila, descartando,por tanto, los <strong>el</strong>em<strong>en</strong>tos nulos con los que se han r<strong>el</strong>l<strong>en</strong>adolas filas con un número de <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos inferiora MaxEntriesbyRows. En este caso es necesarioque los <strong>el</strong>em<strong>en</strong>tos de cada fila se almac<strong>en</strong><strong>en</strong> por ord<strong>en</strong>creci<strong>en</strong>te de columna. La v<strong>en</strong>tajas que pres<strong>en</strong>ta <strong>el</strong> formatoELLPACK (ver [10]) para su uso <strong>en</strong> GPUs son: proporcionaun acceso coalesc<strong>en</strong>te a la memoria global, para<strong>el</strong>lo es necesario que las filas estén ord<strong>en</strong>adas <strong>en</strong> ord<strong>en</strong>creci<strong>en</strong>te de número de columna; al igual que los otrosdos formatos vistos, permite una ejecución sin procesosde sincronización <strong>en</strong>tre hilos; reduce los tiempos de espera<strong>en</strong>tre los hilos de un warp; además, la computaciónrealizada por los hilos de un warp es homogénea.IV. OPERACIONES BÁSICASSegún la descripción d<strong>el</strong> algoritmo 1 y d<strong>el</strong> algoritmo 2,las operaciones básicas para implem<strong>en</strong>tar dichos métodosson:• El producto de una matriz dispersa por un vector(SpMV).• Operaciones vectoriales básicas (incluidas <strong>en</strong> <strong>el</strong> niv<strong>el</strong>1 de la librería BLAS [11]).• El producto inter<strong>no</strong>.• La resolución de un sistema LU (método incluido<strong>en</strong> SPARSKIT [12]), utilizado únicam<strong>en</strong>te <strong>en</strong> <strong>el</strong>método NLPCG.Esta sección está dedicada a describir las difer<strong>en</strong>tes opcionespara realizar las operaciones básicas reseñadas yanalizarlas <strong>en</strong> <strong>el</strong> contexto de nuestro trabajo.


A. Producto matriz dispersa por vectorEl objetivo de utilizar difer<strong>en</strong>tes formatos de almac<strong>en</strong>ami<strong>en</strong>tode matrices dispersas, descritos <strong>en</strong> lasección III, es optimizar <strong>el</strong> producto de una matriz dispersapor un vector. El código d<strong>el</strong> kern<strong>el</strong> que implem<strong>en</strong>tala operación SpMV usando <strong>el</strong> formato CRS <strong>no</strong> ha sidooptimizado. Para optimizar este código exist<strong>en</strong> dos vías,la primera es utilizar un formato de almac<strong>en</strong>ami<strong>en</strong>to queoptimice dicho cálculo, opción que sí será considerada; yla segunda vía consiste <strong>en</strong> modificar la estructura de hiloscon <strong>el</strong> objetivo de optimizar <strong>el</strong> acceso a la memoriaglobal de la GPU. Sin embargo, <strong>en</strong> este segundo caso,las optimizaciones que podrían aplicarse se c<strong>en</strong>tran <strong>en</strong>matrices con un patrón de dispersión mayor al d<strong>el</strong> ejemploutilizado <strong>en</strong> nuestro trabajo (ver la sección V). En<strong>el</strong> ejemplo utilizado <strong>en</strong> nuestro trabajo <strong>el</strong> número típicode <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos por fila es de 7, y, por ejemplo,las optimizaciones propuestas <strong>en</strong> [13] necesitan más de32 <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos por fila para ser aplicadas. Portanto, la vía utilizada para optimizar la operación SpMVserá la utilización de los formatos de almac<strong>en</strong>ami<strong>en</strong>to dematrices dispersas ELLPACK y ELLPACK-R, las cualesmejoran <strong>el</strong> patrón de acceso a memoria respecto al formatoCRS.Por otra parte, se ha utilizado la librería CUSPARSE[14] para calcular la operación SpMV. La librería CUS-PARSE es una reci<strong>en</strong>te librería para la ejecución <strong>en</strong> GPUsde operaciones <strong>en</strong>tre <strong>el</strong>em<strong>en</strong>tos (matrices o vectores) dispersos,y <strong>en</strong>tre <strong>el</strong>em<strong>en</strong>tos dispersos y <strong>el</strong>em<strong>en</strong>tos d<strong>en</strong>sos.Actualm<strong>en</strong>te, sólo soporta <strong>el</strong> formato CRS <strong>en</strong> <strong>el</strong> productode una matriz dispersa por un vector.B. Operaciones vectorialesLos operaciones vectoriales, que <strong>no</strong> implican un procesode reducción, incluidas <strong>en</strong> los algoritmos 1 y 2, sonla copia de vectores, <strong>el</strong> producto de un escalar por unvector, la operación axpy (o similar) y <strong>el</strong> cálculo de lafunción <strong>no</strong> lineal propia d<strong>el</strong> sistema. La computación deestas operaciones <strong>en</strong> una GPU ya está optimizada por lapropia arquitectura de la GPU, <strong>no</strong> obstante int<strong>en</strong>tamosoptimizarlas agrupando varias de <strong>el</strong>las <strong>en</strong> un único kern<strong>el</strong>.Por otra parte, se ha utilizado CUBLAS [15], versiónde la librería BLAS para su uso con CUDA. El uso deCUBLAS impide la agrupación de varias operaciones <strong>en</strong>único kern<strong>el</strong>, que era la primera vía de optimización propuesta.C. Producto inter<strong>no</strong>El proceso de reducción que implica <strong>el</strong> producto inter<strong>no</strong>hace que éste sea una operación especial <strong>en</strong> CUDA.En la computación <strong>en</strong> GPUs es necesario mant<strong>en</strong>erocupados a todos los SM (streaming multiprocessors),además para trabajar con vectores de gran tamaño esnecesario usar muchos bloques de hilos. Para conseguirestos dos propósitos cada bloque realiza <strong>el</strong> proceso de reducciónde una porción d<strong>el</strong> vector. Dado que CUDA <strong>no</strong>proporciona mecanismos globales de sincronización quepermitan comunicar resultados parciales <strong>en</strong>tre bloques, secalculan VectorN vectores de Elem<strong>en</strong>tN <strong>el</strong>em<strong>en</strong>tos, tal ycomo se propone <strong>en</strong> la NVIDIA CUDA C SDK. El númerode <strong>el</strong>em<strong>en</strong>tos (Elem<strong>en</strong>tN) de cada porción de vector debeser múltiplo d<strong>el</strong> tamaño de un warp, para mant<strong>en</strong>er lasrestricciones de alineami<strong>en</strong>to de la memoria y <strong>el</strong> accesocoalesc<strong>en</strong>te. Un bloque calcula la reducción de una omás porciones d<strong>el</strong> vector. Además, para evitar procesosde sincronización se trabaja con la memoria compartida,la cual actúa como un acumulador. El tamañode esta memoria compartida (ACCUM N) deber ser pot<strong>en</strong>ciade dos y si es posible múltiplo d<strong>el</strong> tamaño de unwarp. Por tanto, cada hilo calcula un <strong>el</strong>em<strong>en</strong>to d<strong>el</strong> acumuladortrabajando con <strong>el</strong>em<strong>en</strong>tos d<strong>el</strong> vector separados<strong>en</strong> ACCUM N <strong>el</strong>em<strong>en</strong>tos. El kern<strong>el</strong> finaliza realizando unproceso de reducción tipo árbol de los <strong>el</strong>em<strong>en</strong>tos almac<strong>en</strong>ados<strong>en</strong> <strong>el</strong> acumulador y donde sí es necesario realizarprocesos de sincronización <strong>en</strong>tre hilos. Hay que remarcarque la CPU debe finalizar la operación trabajando con losresultados parciales obt<strong>en</strong>idos, lógicam<strong>en</strong>te <strong>el</strong> número deresultados parciales obt<strong>en</strong>idos es igual al número de porcionesde vector (VectorN) con las que se ha trabajado.En nuestros algoritmos hemos agrupado varios productosinter<strong>no</strong>s <strong>en</strong> único kern<strong>el</strong>.Por otra parte, la librería CUBLAS proporcionatambién la función que permite <strong>el</strong> cálculo d<strong>el</strong> productointer<strong>no</strong>, y t<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta que hemos trabajado conla versión optimizada de CUBLAS incluida <strong>en</strong> <strong>el</strong> CUDAToolkit 3.2 RC, <strong>no</strong> se han considerado otras optimizaciones.D. Solucionador LUEn <strong>el</strong> proceso para resolver un sistema LU cada <strong>el</strong>em<strong>en</strong>tocomputado de la solución es utilizado para <strong>el</strong>cálculo d<strong>el</strong> sigui<strong>en</strong>te <strong>el</strong>em<strong>en</strong>to. Por tanto este proceso <strong>no</strong>dispone de paral<strong>el</strong>ismo inher<strong>en</strong>te de gra<strong>no</strong> fi<strong>no</strong>. Hemosdesarrollado difer<strong>en</strong>tes algoritmos con diversas estrategiaspara resolver <strong>el</strong> sistema LU <strong>en</strong> la GPU, pero ningunade <strong>el</strong>las ha obt<strong>en</strong>ido bue<strong>no</strong>s resultados. Por lo tanto, lamejor opción ha sido resolver <strong>el</strong> sistema LU haci<strong>en</strong>douso de la arquitectura multicore de la CPU, lo cual <strong>no</strong> hasido d<strong>el</strong> todo efectivo al verse p<strong>en</strong>alizado <strong>el</strong> algoritmo por<strong>el</strong> aum<strong>en</strong>to de comunicaciones <strong>en</strong>tre la CPU y la GPU.En la sección V pres<strong>en</strong>taremos resultados haci<strong>en</strong>do usode CUDA y de Op<strong>en</strong>MP conjuntam<strong>en</strong>te. En este ámbitohay que remarcar que <strong>en</strong> <strong>el</strong> método NLCG, las comunicaciones<strong>en</strong>tre GPU y CPU se reduc<strong>en</strong> a algu<strong>no</strong>s escalaresy los vectores necesarios para completar los procesos dereducción.V. RESULTADOS NUMÉRICOSPara analizar <strong>el</strong> comportami<strong>en</strong>to de los métodos propuestos,NLCG y NLPCG, se ha utilizado <strong>el</strong> multicoreInt<strong>el</strong> Core 2 Quad Q6600, 2.4 GHz, con 4 GB de RAMy8MB memoria caché L2, de<strong>no</strong>minado SULLI, con sistemaoperativo Ubuntu 9.04 (Jaunty Jackalope) para sistemasde 64 bits. La GPU disponible <strong>en</strong> SULLI es unaNVIDIA GeForce GTX 280. Los códigos de CUDA hansido compilados con <strong>el</strong> compilador de NVIDIA (nvcc)proporcionado por <strong>el</strong> CUDA Toolkit 3.2 RC.El ejemplo utilizado <strong>en</strong> nuestros experim<strong>en</strong>tos es unaecuación <strong>en</strong> derivadas parciales, <strong>no</strong> lineal y <strong>el</strong>íptica,co<strong>no</strong>cida como <strong>el</strong> problema de Bratu. Este problematridim<strong>en</strong>sional vi<strong>en</strong>e dado por∇ 2 u−λe u = 0, (9)


Fig. 1. Speed-up d<strong>el</strong> método NLCG.Fig. 2. Método NLCG vs formato de almac<strong>en</strong>ami<strong>en</strong>to.donde u es la temperatura y λ es una constante co<strong>no</strong>cidacomo <strong>el</strong> parámetro de Frank-Kam<strong>en</strong>etskii; ver por ejemplo[16]. Hay dos posibles soluciones para este problemadado un valor de λ. Una de las soluciones, s<strong>en</strong>cilla deobt<strong>en</strong>er, es cercana a u = 0. Para converger a la otrasolución es necesario partir de un vector inicial cerca<strong>no</strong>a dicha solución. En nuestro mod<strong>el</strong>o se considera un dominiocúbico 3D de longitud unidad y λ = 6. Para resolverla ecuación (9) usando <strong>el</strong> método de difer<strong>en</strong>ciasfinitas, consideramos un mallado d<strong>el</strong> dominio formadopor d 3 <strong>no</strong>dos. La discretización da lugar a un sistema <strong>no</strong>lineal de la forma Ax = Φ(x), donde Φ : R n → R n esuna aplicación diagonal y <strong>no</strong> lineal, <strong>en</strong> la cual la compon<strong>en</strong>tei-ésimaΦi deΦdep<strong>en</strong>de únicam<strong>en</strong>te de la compon<strong>en</strong>tei-ésima de x. La matriz A es una matriz dispersade ord<strong>en</strong> n = d 3 , si<strong>en</strong>do <strong>el</strong> número típico de <strong>el</strong>em<strong>en</strong>tos<strong>no</strong> nulos por fila de siete, con me<strong>no</strong>s <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulos<strong>en</strong> aqu<strong>el</strong>los puntos que correspond<strong>en</strong> a la frontera d<strong>el</strong>dominio físico.El análisis que pres<strong>en</strong>tamos se basa <strong>en</strong> la comparaciónde los tiempos de ejecución utilizando como plataformade computación la GPU GeForce GTX 280, con los tiemposde ejecución <strong>en</strong> <strong>el</strong> multicore SULLI. En primer lugarpres<strong>en</strong>tamos resultados para resolver sistemas de variostamaños usando <strong>el</strong> método NLCG. En la figura 1 semuestra <strong>el</strong> speed-up utilizando, por un lado Op<strong>en</strong>MP condifer<strong>en</strong>te número de cores, y por otro la GPU GeForceGTX 280. Lógicam<strong>en</strong>te la GPU es controlada por u<strong>no</strong> d<strong>el</strong>os cores de SULLI. En esta figura podemos observar quese obti<strong>en</strong>e un bu<strong>en</strong> speed-up usando los cores disponiblesde SULLI, pero que dicho speed-up <strong>no</strong> es comparable alobt<strong>en</strong>ido con la GPU, <strong>en</strong> la cual <strong>el</strong> valor es superior a25.Este resultado confirma la expectativa de una muy bu<strong>en</strong>ainteracción <strong>en</strong>tre <strong>el</strong> algoritmo NLCG y la GPU.En la figura 2 se puede ver <strong>el</strong> comportami<strong>en</strong>to de los difer<strong>en</strong>tesformatos de almac<strong>en</strong>ami<strong>en</strong>to de matrices dispersasdescritos <strong>en</strong> la sección III. Hay que t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta,que <strong>el</strong> formato utilizado modifica <strong>el</strong> kern<strong>el</strong> que calcula laoperación SpMV. Los mejores resultados se obti<strong>en</strong><strong>en</strong> utilizando<strong>el</strong> formato ELLPACK-R, ya que este algoritmo<strong>no</strong> incluye instrucciones de control de flujo que provoqu<strong>en</strong>la serialización de la ejecución de los difer<strong>en</strong>tes hilosde un warp y, además, permite <strong>el</strong> acceso coalesc<strong>en</strong>tea los <strong>el</strong>em<strong>en</strong>tos de la matriz. No obstante, hay que remarcarque <strong>el</strong> formato ELLPACK-R es <strong>el</strong> que más memoriarequiere de los formatos vistos, debido al uso d<strong>el</strong> tercerFig. 3. Uso de CUBLAS y/o CUSPARSE <strong>en</strong> <strong>el</strong> método NLCG.vector para almac<strong>en</strong>ar <strong>el</strong> número de <strong>el</strong>em<strong>en</strong>tos <strong>no</strong> nulosde cada fila, además d<strong>el</strong> r<strong>el</strong>l<strong>en</strong>ado de algunas filascon ceros. Hemos analizado <strong>el</strong> comportami<strong>en</strong>to d<strong>el</strong> algoritmoNLCG <strong>en</strong> función tanto d<strong>el</strong> número de hilos porbloque, como d<strong>el</strong> tamaño d<strong>el</strong> acumulador implem<strong>en</strong>tado<strong>en</strong> la memoria compartida para calcular <strong>el</strong> producto inter<strong>no</strong>.La figura 2 pres<strong>en</strong>ta resultados utilizando los valoresóptimos para estos dos parámetros, es decir 256 hilospor bloque y un tamaño de ACCUM N igual a 128.Por último, respecto al método NLCG, <strong>en</strong> la figura 3se muestran resultados haci<strong>en</strong>do uso de las libreríasCUBLAS y CUSPARSE, librerías incluidas <strong>en</strong> <strong>el</strong> CUDAToolkit 3.2 RC. En dicha figura se analiza <strong>el</strong> uso deCUBLAS y de CUSPARSE por separado y también <strong>el</strong>uso de ambas librerías conjuntam<strong>en</strong>te. En primer lugar,podemos observar que <strong>el</strong> uso de CUBLAS pres<strong>en</strong>tapeores resultados que si se utiliza únicam<strong>en</strong>te <strong>el</strong> API deCUDA. Esto es debido a las optimizaciones realizadasagrupando varias operaciones <strong>en</strong> un único kern<strong>el</strong>, procesoque <strong>no</strong> puede llevarse a cabo si se usa CUBLAS. Al contrario,<strong>el</strong> uso de CUSPARSE obti<strong>en</strong>e una pequeña mejora.Hay que remarcar que <strong>el</strong> uso conjunto de CUBLAS yCUSPARSE obti<strong>en</strong>e resultados aceptables con la v<strong>en</strong>tajaque esconde al usuario la <strong>el</strong>ección de parámetros talescomo <strong>el</strong> número de hilos por bloque y <strong>el</strong> tamaño d<strong>el</strong> acumuladorpara <strong>el</strong> cálculo de operaciones de reducción.En [5] se detalla <strong>el</strong> comportami<strong>en</strong>to d<strong>el</strong> algoritmoNLPCG <strong>en</strong> una plataforma multicore, todos los experim<strong>en</strong>tosrealizados haci<strong>en</strong>do uso de la GPU muestran queese comportami<strong>en</strong>to <strong>no</strong> difiere al cambiar la plataformade computación a una GPU. En resum<strong>en</strong>, <strong>el</strong> valor óptimod<strong>el</strong> número de iteraciones internas y <strong>el</strong> valor óptimo d<strong>el</strong>número de iteraciones externas es un valor pequeño. Respectoal niv<strong>el</strong> de ll<strong>en</strong>ado de la factorización ILU, se con-


Fig. 4. Método NLPCG, m = 1, q = 1 yn = 884736.nuestros algoritmos, con <strong>el</strong> objetivo de optimizarlas y deexperim<strong>en</strong>tar algunas librerías disponibles. Hemos podidoconcluir que librerías como CUBLAS y CUSPARSEpued<strong>en</strong> ofrecer un bu<strong>en</strong> r<strong>en</strong>dimi<strong>en</strong>to. Respecto al formatode almac<strong>en</strong>ami<strong>en</strong>to de matrices dispersas se concluye quedebe ser s<strong>el</strong>eccionado <strong>en</strong> función de las características d<strong>el</strong>a plataforma paral<strong>el</strong>a, si<strong>en</strong>do ELLPACK-R <strong>el</strong> formatomás efici<strong>en</strong>te para la ejecución <strong>en</strong> una GPU. Por último,se han mostrado las difer<strong>en</strong>cias de adaptación de ambosmétodos a las dos arquitecturas paral<strong>el</strong>as utilizadas, obt<strong>en</strong>i<strong>en</strong>do<strong>en</strong> ambos casos mejores resultados trabajando conla GPU que trabajando con <strong>el</strong> multicore, y además <strong>en</strong> estecaso <strong>el</strong> método NLCG explota mejor <strong>el</strong> paral<strong>el</strong>ismo, obt<strong>en</strong>i<strong>en</strong>domejores resultados que <strong>el</strong> método NLPCG.AGRADECIMIENTOSEl pres<strong>en</strong>te trabajo ha sido financiado por <strong>el</strong> Ministeriode Ci<strong>en</strong>cia e In<strong>no</strong>vación mediante <strong>el</strong> proyecto TIN2008-06570-C04-04.Fig. 5. Comparación de los métodos NLCG y NLPCG <strong>en</strong> CPU y GPU,ord<strong>en</strong> d<strong>el</strong> sistema n = 373248.cluye que <strong>el</strong> valor óptimo es0o1. Trabajando con dichosvalores óptimos, <strong>en</strong> la figura 4 pres<strong>en</strong>tamos resultados d<strong>el</strong>método NLPCG haci<strong>en</strong>do uso de ambas plataformas decomputación conjuntam<strong>en</strong>te. En dicha figura podemosobservar que <strong>el</strong> algoritmo NLPCG <strong>no</strong> se adapta bi<strong>en</strong> alparal<strong>el</strong>ismo ofrecido por la GPU, y que <strong>el</strong> uso de ambasplataformas tampoco obti<strong>en</strong>e bue<strong>no</strong>s resultados al versep<strong>en</strong>alizado, como se ha com<strong>en</strong>tado anteriorm<strong>en</strong>te, por<strong>el</strong> increm<strong>en</strong>to de las comunicaciones <strong>en</strong>tre GPU y CPU.Respecto al resto de parámetros vistos <strong>en</strong> <strong>el</strong> algoritmoNLCG, podemos ext<strong>en</strong>der las conclusiones obt<strong>en</strong>idas <strong>en</strong>dicho método al método NLPCG.Por último, si analizamos la figura 5 deducimos que<strong>el</strong> speed-up obt<strong>en</strong>ido usando la GPU siempre es mayorque usando los cuatro cores disponibles <strong>en</strong> SULLI. Deeste modo podemos concluir que utilizando una GPU <strong>el</strong>método NLCG ofrece mejores prestaciones, pero <strong>no</strong> asíusando un multicore, <strong>en</strong> cuya caso las mejores prestacioneslas ofrece <strong>el</strong> método NLPCG.VI. CONCLUSIONESHaci<strong>en</strong>do uso d<strong>el</strong> mod<strong>el</strong>o de computación GPGPU(G<strong>en</strong>eral-purpose computing on graphics processingunits) hemos desarrollado la versión de Fletcher-Reevesd<strong>el</strong> método d<strong>el</strong> gradi<strong>en</strong>te <strong>conjugado</strong> <strong>no</strong> lineal, y hemosaplicado, a dicho método, un precondicionador de tipopoli<strong>no</strong>mial basado <strong>en</strong> los métodos <strong>en</strong> dos etapas. Sehan comparado los métodos desarrollados con los mismosmétodos desarrollados para Op<strong>en</strong>MP, y <strong>en</strong> <strong>el</strong> casod<strong>el</strong> método precondicionado se ha utilizado un mod<strong>el</strong>ode programación mixto para explotar <strong>el</strong> paral<strong>el</strong>ismo ofrecidopor la GPU y <strong>el</strong> paral<strong>el</strong>ismo ofrecido por <strong>el</strong> multicore.Hemos id<strong>en</strong>tificado las operaciones básicas deREFERENCIAS[1] R. Fletcher y C. Reeves, “Function minimization by conjugategradi<strong>en</strong>ts,” The Computer Journal, vol. 7, pp. 149–154, 1964.[2] L. Adams, “M-step preconditioned conjugate gradi<strong>en</strong>t methods,”SIAM Journal on Sci<strong>en</strong>tific and Statistical Computing, vol. 6, pp.452–462, 1985.[3] R. Bru, V. Migallón, J. P<strong>en</strong>adés, y D.B. Szyld, “Parall<strong>el</strong>, synchro<strong>no</strong>usand asynchro<strong>no</strong>us two-stage multisplitting methods,”Electronic Transactions on Numerical Analysis, vol. 3, pp. 24–38,1995.[4] V. Migallón y J. P<strong>en</strong>adés, “Converg<strong>en</strong>ce of two-stage iterativemethods for hermitian positive definite matrices,” Applied MathematicsLetters, vol. 10, <strong>no</strong>. 3, pp. 79–83, 1997.[5] H. Migallón, V. Migallón, y J. P<strong>en</strong>adés, “Parall<strong>el</strong> <strong>no</strong>nlinear conjugategradi<strong>en</strong>t algorithms on multicore architectures,” in Proceedingsof the International Confer<strong>en</strong>ce on Computational andMathematical Methods in Sci<strong>en</strong>ce and Engineering, pp. 689–700.2009.[6] J. Nickolls, I. Buck, M. Garland, y K. Skadron, “Scalable parall<strong>el</strong>programming with CUDA,” Queue, vol. 6, <strong>no</strong>. 2, pp. 40–53, 2008.[7] NVIDIA Corporation, “NVIDIA CUDA C programming guide,”Version 3.2, http://dev<strong>el</strong>oper.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_C_Programming_Guide.pdf, 2010.[8] E. Lindholm, J. Nickolls, S. Oberman, y J. Montrym, “NVIDIATesla: A unified graphics and computing architecture,” IEEE Micro,vol. 28, <strong>no</strong>. 2, pp. 39–55, 2008.[9] D.R. Kincaid y D.M. Young, “A brief review of the ITPACKproject,” Journal of Computational and Applied Mathematics,vol. 24, <strong>no</strong>. 1–2, pp. 121–127, 1988.[10] F. Vázquez, J.J. Fernández, y E.M. Garzón, “A new approachfor sparse matrix vector product on NVIDIA GPUs,” Concurr<strong>en</strong>cyand Computation: Practice and experi<strong>en</strong>ce, 2010, DOI:10.1002/cpe.1658.[11] C.L. Lawson, R.J. Hanson, D. Kincaid, y F.T. Krogh, “Basic linearalgebra subprograms for FORTRAN usage,” ACM Transactionson Mathematical Software, vol. 5, pp. 308–323, 1979.[12] Y. Saad, “SPARSKIT: A basic tool kit for sparse matrix computation,”http://www-users.cs.umn.edu/ ∼ saad/software/SPARSKIT/sparskit.html.[13] M. Manikandan y R. Bordawekar, “Optimizing sparse matrixvectormultiplication on GPUs,” Tech. Rep. RC24704, IBM,2008.[14] NVIDIA Corporation, “CUDA CUSPARSE Library,” Tech.Rep. PG-05329-032 V01, 2010, http://dev<strong>el</strong>oper.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUSPARSE_Library.pdf.[15] NVIDIA Corporation, “CUDA CUBLAS Library,” Tech.Rep. PG-05326-032 V01, 2010, http://dev<strong>el</strong>oper.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUBLAS_Library.pdf.[16] B.M. Averick, R.G. Carter, J.J. More, y G. Xue, “The MINPACK-2 test problem collection,” Tech. Rep. MCS-P153-0692, Mathematicsand Computer Sci<strong>en</strong>ce Division, Argonne.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!