Pregunta

el código que estoy tratando con bucles tiene como las siguientes:

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   

para pequeñas nt (10).

Después de temporización que, en realidad es 100 veces más lento de utilizar el bucle 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 fuera de la caja antes de ejecutar el código.

Soy relativamente nuevo en MATLAB, y acaba de comenzar a utilizar las funciones paralelas, así que por favor no asuma que estoy no estoy haciendo algo estúpido.

Gracias!

PS:. Estoy ejecutando el código en una de cuatro núcleos por lo que se puede esperar para ver algunas mejoras

¿Fue útil?

Solución

Fabricación de la partición y la agrupación de los resultados (por encima en dividir el trabajo y la recolección de los resultados de los varios hilos / núcleos) es alta para valores pequeños de nt. Esto es normal, no lo haría con la partición de datos para tareas sencillas que se pueden realizar de forma rápida en un bucle simple.

Realizar siempre algo desafiante dentro del bucle que vale la sobrecarga de partición. Aquí es un buen introducción a la programación paralela .

Los hilos provienen de un grupo de subprocesos por lo que la sobrecarga de crear los hilos de rosca no debería estar allí. Sin embargo, con el fin de crear los resultados parciales n matrices a partir del tamaño bistar se debe crear, todos los resultados parciales computada y luego todos estos resultados parciales que ser añadido (recombinación). En un bucle recta, esto es con una alta probabilidad hecho en el lugar, no hay asignaciones tienen lugar.

La declaración completa de la ayuda (gracias por su enlace a continuación) es:

  

Si el tiempo para f cálculo, g, y h es   grande , parfor será significativamente   más rápido que el correspondiente para   declaración, incluso si n es relativamente   pequeña.

Así que ya ves que significan exactamente lo mismo que lo que quiero decir, la sobrecarga para los pequeños valores de n es sólo vale la pena el esfuerzo si lo que se hace en el bucle es lo suficientemente compleja que lleva tiempo /.

Otros consejos

Parforcomes con un poco de sobrecarga. Por lo tanto, si nt es muy pequeño, y si el cálculo en el bucle se realiza muy rápidamente (como una adición), la solución parfor es más lento. Además, si ejecuta parforon una de cuatro núcleos, aumento de velocidad será casi lineal durante 1-3 núcleos, pero menos si se utiliza 4 núcleos, desde la última núcleo también tiene que ejecutar los procesos del sistema.

Por ejemplo, si parfor viene con 100 ms de sobrecarga, y el cálculo en el bucle de toma de 5 ms, y si se supone que el aumento de velocidad es de hasta lineal a 4 núcleos con un coeficiente de 1 (es decir, utilizando 4 núcleos hace el cálculo 4 veces más rápido), nt tiene que ser alrededor de 30 para usted para lograr una ganancia de velocidad con parfor (150ms 132ms, con for con parfor). Si se va a ejecutar sólo 10 iteraciones, parfor sería más lento (50 ms con for, 112ms con parfor).

Se puede calcular la sobrecarga en la máquina mediante la comparación de tiempo de ejecución con 1 vs 0 trabajador trabajadores, y se puede estimar la ganancia de velocidad al hacer un ajuste de línea a través de los tiempos de ejecución con 1 a 4 trabajadores. Entonces sabrá cuando es útil para su uso parfor.

Además de la mala actuación debido a la sobrecarga de comunicación (ver otras respuestas), no hay otra razón para el uso parfor en este caso. Todo lo que se hace dentro de la parfor en este caso, utiliza incorporada multithreading . Suponiendo que todos los trabajadores se están ejecutando en el mismo PC no hay ninguna ventaja, porque una sola llamada ya utiliza todos los núcleos de su procesador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top