Sólo el bucle externo es paralela en el ejemplo de código. Puede probar imprimiendo omp_get_thread_num()
en el bucle interno y verá que, para un i
dado, el número de subproceso es el mismo (por supuesto, esta prueba es demostrativa en lugar de definitiva ya que las diferentes ejecuciones darán resultados diferentes). Por ejemplo, con:
#include <stdio.h>
#include <omp.h>
#define dimension 4
int main() {
#pragma omp parallel for
for (int i = 0; i < dimension; i++)
for (int j = 0; j < dimension; j++)
printf("i=%d, j=%d, thread = %d\n", i, j, omp_get_thread_num());
}
me sale:
i=1, j=0, thread = 1
i=3, j=0, thread = 3
i=2, j=0, thread = 2
i=0, j=0, thread = 0
i=1, j=1, thread = 1
i=3, j=1, thread = 3
i=2, j=1, thread = 2
i=0, j=1, thread = 0
i=1, j=2, thread = 1
i=3, j=2, thread = 3
i=2, j=2, thread = 2
i=0, j=2, thread = 0
i=1, j=3, thread = 1
i=3, j=3, thread = 3
i=2, j=3, thread = 2
i=0, j=3, thread = 0
En cuanto al resto de su código, es posible que desee poner más detalles en una nueva pregunta (que es difícil saber a partir de la pequeña muestra), pero, por ejemplo, no puede poner private(j)
cuando j
solo se declara después. Es automáticamente privado en mi ejemplo anterior. Supongo que diff
es una variable que no podemos ver en la muestra. Además, la variable de bucle i
es automáticamente privado (de la version 2.5 spec - mismo en la especificación 3,0)
El bucle de iteración variable en el para-bucle de un favor o en paralelo para constructo es privado en que constructo .
Editar: Todo lo anterior es correcto para el código que usted y yo hemos mostrado, pero puede estar interesado en lo siguiente. Para la versión 3.0 de OpenMP (disponible en, por ejemplo, gcc version 4.4, pero no en la versión 4.3) existe una cláusula collapse
donde puede escribir el código como lo ha hecho, pero con #pragma omp parallel for collapse (2)
para paralelizar ambos bucles (consulte the spec).
Editar: OK, he descargado gcc 4.5.0 y corrió el código anterior, pero utilizando collapse (2)
para obtener el siguiente resultado, que muestra el bucle interno ahora parallelized:
i=0, j=0, thread = 0
i=0, j=2, thread = 1
i=1, j=0, thread = 2
i=2, j=0, thread = 4
i=0, j=1, thread = 0
i=1, j=2, thread = 3
i=3, j=0, thread = 6
i=2, j=2, thread = 5
i=3, j=2, thread = 7
i=0, j=3, thread = 1
i=1, j=1, thread = 2
i=2, j=1, thread = 4
i=1, j=3, thread = 3
i=3, j=1, thread = 6
i=2, j=3, thread = 5
i=3, j=3, thread = 7
Comentarios here (búsqueda de "Soluciones provisionales") también son relevantes para soluciones alternativas en la versión 2.5 si desea paralelizar ambos bucles, pero la versión 2.5 especificada anteriormente es bastante explícita (consulte los ejemplos no conformes en la sección A.35).
posible que desee etiquetarlo con el lenguaje que está usando, aunque Tendría que eliminar una de las etiquetas existentes. –
Buen punto mmyers - para referencia parece que está usando c/C++ (openMP es c/C++ y fortran solamente) –