2010-05-31 10 views
7

Estoy tratando de acelerar algunos cálculos usando OpenCL y parte del algoritmo consiste en invertir una matriz. ¿Existe alguna biblioteca de código abierto o código disponible libremente para calcular la factorización de lu (lapack dgetrf y dgetri) de matriz o inversión general escrita en OpenCL o CUDA? La matriz es real y cuadrada, pero no tiene otras propiedades especiales además de eso. Hasta ahora, he logrado encontrar solo implementaciones básicas de operaciones blas matrix-vector en gpu.Inversión de matriz en OpenCL

La matriz es bastante pequeña, solo alrededor de 60-100 filas y cols, por lo que podría calcularse más rápido en la CPU, pero se usa un poco en el medio del algoritmo, por lo que tendría que transferirlo al host, calcular el inverso, y luego transfiere el resultado nuevamente al dispositivo donde luego se usa en cálculos mucho más grandes.

+0

También debe tener en cuenta que invertir una matriz puede ser una operación costosa, especialmente para matrices grandes, y muy a menudo existe una forma alternativa de resolver el problema. La descomposición de LU es un "bloque de construcción" que se puede usar para evitar hacer una verdadera inversión. – Tom

Respuesta

5

No tengo una implementación en Open CL, pero tanto "Numerical Recipes" como Gil Strang "Into to Applied Math" tienen explicaciones maravillosas que serían fáciles de codificar. "NR" tiene un código C que puedes adaptar.

calcular el inverso

Esto es incorrecto. No estás calculando un inverso con la descomposición LU, estás descomponiendo la matriz. Si quisieras lo contrario, tendrías que hacer la sustitución hacia atrás con una serie de vectores unitarios. Es una diferencia pequeña pero importante.

11
+0

Esto es lo que quería. La única pega es que los núcleos para la factorización de LU no utilizan el pivoteo, por lo que su rendimiento puede ser bastante pobre y numéricamente inestable para algunas entradas. – buchtak

1

Sé que esto es un poco tarde, pero si usted está tratando de hacer cualquier cálculo de la matriz en una matriz que es que pequeña (60-100 filas), los cálculos van a ser mucho más rápidos en una CPU que en una GPU debido al tiempo que lleva copiar la información de la memoria principal a la memoria de la GPU. Si quiere hacer esto, le sugiero que estudie el uso de un lenguaje paralelo como OpenMP o MPI, ya que le permitiría paralelizar su código para acelerar los cálculos en la CPU.

0

La pregunta original (ahora 7 años) en realidad se resolvió 4 años después en un paper describing matrix inversion in CUDA based on Gauss-Jordan. Intenta distribuir los cálculos entre diferentes subprocesos y proporciona indicaciones de rendimiento detalladas para matrices de hasta 2048 de tamaño.

Si bien no es OpenCL, las ideas generales se traducirán de CUDA con bastante facilidad.