2010-12-09 13 views
5

Voy a intentar optimizar algún código escrito en MATLAB, usando CUDA. Recientemente comencé a programar CUDA, pero tengo una idea general de cómo funciona.CUDA y MATLAB para la optimización de bucle

Entonces, supongo que quiero agregar dos matrices juntas. En CUDA, podría escribir un algoritmo que utilizaría un hilo para calcular la respuesta para cada elemento en la matriz de resultados. Sin embargo, ¿no es esta técnica probablemente similar a lo que MATLAB ya hace? En ese caso, ¿no sería la eficiencia independiente de la técnica y atribuible solo al nivel de hardware?

+0

Puede ser interesante comparar la solución de The MathWorks con herramientas de terceros y CUDA hechos a mano. http://developer.nvidia.com/object/matlab_cuda.html – zellus

Respuesta

3

La técnica puede ser similar, pero recuerda que con CUDA tienes cientos de hilos ejecutándose simultáneamente. Si MATLAB está usando subprocesos y esos subprocesos se ejecutan en un núcleo cuádruple, solo obtendrá 4 subprocesos ejecutados por ciclo de reloj, mientras que puede lograr un par de cientos de subprocesos para ejecutarse en CUDA con el mismo ciclo de reloj.

Respondiendo a su pregunta, SÍ, la eficiencia en este ejemplo es independiente de la técnica y es atribuible solo al hardware.

+0

No me sorprendería en absoluto ver una aceleración, de hecho, espero que dado que el tamaño de entrada vale la sobrecarga. Pero, mi punto es que el algoritmo en sí mismo (es decir, calcular la adición para cada elemento en paralelo) no contribuye a la aceleración, independientemente del hardware. – dnbwise

1

La respuesta es inequívocamente sí, todas las eficiencias son a nivel de hardware. No sé exactamente cómo funciona Matlab, pero la ventaja de CUDA es que los subprocesos múltiples se pueden ejecutar simultáneamente, a diferencia de Matlab.

En una nota lateral, si su problema es pequeño o requiere muchas operaciones de lectura de escritura, CUDA probablemente solo sea un dolor de cabeza adicional.

+0

Presumiblemente, MATLAB utiliza varios subprocesos en el nivel de máquina virtual. – dnbwise

0

CUDA tiene soporte oficial para matlab.

[link necesidad]

Puede hacer uso de archivos MEX a ejecutarse en la GPU desde MATLAB.

El cuello de botella es la velocidad a la que se transfieren los datos de la CPU-RAM a la GPU. Entonces, si la transferencia se minimiza y se realiza en grandes porciones, la aceleración es excelente.

0

Para cosas simples, es mejor usar el soporte gpuArray en el Matlab PCT. Puede verificarlo aquí http://www.mathworks.de/de/help/distcomp/using-gpuarray.html

Para cosas como agregar gpuArrays, multiplications, mins, maxs, etc., la implementación que utilizan tiende a ser correcta. Descubrí que para hacer cosas como operaciones por lotes de pequeñas matrices como abs (y-Hx).^2, es mejor escribir un Kernel pequeño que lo haga por ti.