performance - MATLAB PARFOR es más lento que para-¿qué pasa?
parallel-processing (3)
el código con el que trato tiene bucles como los siguientes:
bistar = zeros(numdims,numcases);
parfor hh=1:nt
bistar = bistar + A(:,:,hh)*data(:,:,hh+1)'' ;
end
para nt pequeño (10).
Después de cronometrarlo, en realidad es 100 veces más lento que con el ciclo normal. Sé que parfor puede hacer sumas paralelas, así que no estoy seguro de por qué esto no está funcionando.
Corro
matlabpool
con las configuraciones listas para usar antes de ejecutar mi código.
Soy relativamente nuevo en Matlab y recién comencé a usar las funciones paralelas, así que no asumas que no estoy haciendo algo estúpido.
¡Gracias!
PD: estoy ejecutando el código en un núcleo cuádruple, así que esperaría ver algunas mejoras.
Además del mal rendimiento debido a la sobrecarga de comunicación (ver otras respuestas), hay otra razón para no usar parfor
en este caso. Todo lo que se hace dentro del parfor
en este caso usa multiprocesamiento integrado . Suponiendo que todos los trabajadores se ejecutan en la misma PC, no hay ventaja porque una sola llamada ya usa todos los núcleos de su procesador.
Hacer la partición y la agrupación de los resultados (sobrecarga al dividir el trabajo y recopilar los resultados de varios hilos / núcleos) es alto para valores pequeños de nt
. Esto es normal, no haría particiones de datos para tareas fáciles que se pueden realizar rápidamente en un bucle simple.
Siempre realice algo desafiante dentro del ciclo que valga la sobrecarga de la partición. Aquí hay una buena introducción a la programación paralela .
Los subprocesos provienen de un grupo de subprocesos por lo que la sobrecarga de crear los subprocesos no debería estar allí. Pero para crear los resultados parciales deben crearse n
matrices del tamaño bistar
, todos los resultados parciales calculados y luego todos estos resultados parciales deben agregarse (recombinarse). En un ciclo recto, esto es con una alta probabilidad de realizarse en el lugar, no se realizan asignaciones.
La declaración completa en la ayuda (gracias por su enlace a continuación) es:
Si el tiempo para calcular f, g, y h es grande , el parfor será significativamente más rápido que el del enunciado correspondiente, incluso si n es relativamente pequeño.
Así que, como verá, significan exactamente lo mismo que lo que quiero decir, la sobrecarga para los pequeños n valores solo vale la pena si lo que hace en el ciclo es lo suficientemente complejo / lento.
Parfor
viene con un poco de sobrecarga. Por lo tanto, si nt
es realmente pequeño, y si el cálculo en el ciclo se realiza muy rápidamente (como una adición), la solución parfor
es más lenta. Además, si ejecuta parfor
en un quad-core, la ganancia de velocidad será casi lineal para 1-3 núcleos, pero menos si usa 4 núcleos, ya que el último núcleo también necesita ejecutar procesos del sistema.
Por ejemplo, si parfor viene con 100 ms de sobrecarga, y el cálculo en el ciclo tarda 5 ms, y si suponemos que la ganancia de velocidad es lineal hasta 4 núcleos con un coeficiente de 1 (es decir, utilizando 4 núcleos hace el cálculo 4 veces más rápido) , no necesita ser de alrededor de 30 para que pueda obtener una ganancia de velocidad con parfor
(150 ms con for
, 132 ms con parfor
). Si parfor
que ejecutar solo 10 iteraciones, el parfor
sería más lento (50 ms con for
, 112 ms con parfor
).
Puede calcular la sobrecarga de su máquina comparando el tiempo de ejecución con 1 trabajador frente a 0 trabajadores, y puede estimar la ganancia de velocidad haciendo que un revestimiento encaje en los tiempos de ejecución con 1 a 4 trabajadores. Entonces sabrá cuándo es útil usar parfor
.