2016-02-01 3 views
0

J'essaye de paralléliser un code en utilisant OpenMP, je n'utilise que deux réductions et je ne comprends pas pourquoi mon code OpenMP est plus lent que le code séquentiel. C'est juste une division du tableau entre les processeurs. Est-ce que quelqu'un a une idée de pourquoi c'est comme ça?Le code est plus lent quand j'utilise OpenMP

float visibleLength; 
float *k = (float *)malloc(N * sizeof(float)); 
int visibleLines = 0; 


k[0] = data.y[0]/data.x[0]; 
visibleLength = data.y[0]; 

omp_set_num_threads(12); 
#pragma omp parallel for reduction(+:visibleLines,visibleLength) 
for (int i = 1; i<N; i++) { 
    k[i] = fmax(k[i - 1], data.y[i]/data.x[i]); 
    if (k[i] > k[i - 1]) { 
     visibleLines = visibleLines + 1; 
     visibleLength = visibleLength + data.y[i] - k[i - 1] * data.x[i]; 
    } 
} 
+1

Comment mesurez-vous le temps? Où sont vos résultats de mesure? –

+0

J'utilise la fonction clock(); pour mesurer l'heure et le résultat ici '// FIN HORLOGE \t end = clock(); \t printf ("Fin de l'horloge \ n"); \t printf ("\ n visibleLines =% d \ n \ n", lignes visibles); \t printf ("\ n visibleLength =% f \ n \ n", visibleLength); \t time_spent = (double (début de début)/CLOCKS_PER_SEC); Printf ("\ n Time Expend =% f \ n \ n", time_spent); ' –

Répondre

1

Votre algorithme semble être séquentielle parce que vous utilisez le résultat de l'itération précédente k[i-1]. Je ne pense pas non plus que la clause ordered le corrigerait. Vous devriez changer l'algorithme. Etes-vous sûr que vos résultats étaient corrects lorsque vous avez essayé la course parallèle?

Je serais surpris s'ils l'étaient.

+0

oui les résultats sont corrects, mais plus lentement si vous commentez le #pragma vous avez le code séquentiel et j'essaie de le paralyser en utilisant ce #pragma –