2010-08-26 11 views
2

Je fais des essais de temps sur mon code, et logiquement, il semble vraiment facile de paralléliser avec OpenMP car chaque essai est indépendant des autres. En l'état actuel, mon code ressemble à ceci:E/S OpenMP et Fichier

for(int size = 30; size < 50; ++size) { 
    #pragma omp parallel for 
    for(int trial = 0; trial < 8; ++trial) { 
     time_t start, end; 
     //initializations 
     time(&start); 

     //perform computation 

     time(&end); 

     output << size << "\t" << difftime(end,start) << endl; 
    } 
    output << endl; 
} 

je soupçonne faufilant que ce genre d'un faux pas, cependant, que deux threads peuvent écrire simultanément des valeurs à la sortie, vissage ainsi la mise en forme . Est-ce un problème, et si oui, va entourer le code output << size << ... avec une déclaration #pragma omp critical le corriger?

Répondre

2

Peu importe si votre sortie sera vissée (ce sera probablement le cas). À moins que vous ne soyez vraiment attentif à affecter vos threads OpenMP à différents processeurs qui ne partagent pas de ressources telles que la bande passante mémoire, vos essais chronométrés ne sont pas non plus très significatifs. Différents passages vont interférer les uns avec les autres.

La solution au problème que vous posez est d'écrire les temps de résultat dans les éléments désignés d'un tableau, avec un intervalle pour chaque essai, et sortir les résultats après le fait.

+0

Je ne suis pas tellement intéressé par les données de synchronisation absolues, je suis juste en train d'essayer de voir la mise à l'échelle relative entre les différentes tailles. Cela sera-t-il aussi lourdement touché? Les premiers essais parallèles ont semblé suffisamment convaincants comme les résultats de la série pour que je puisse continuer, mais je suis toujours un noob et l'apparence peut être trompeuse :) –

+0

Je peux penser à plusieurs scénarios dans lesquels différentes tailles de problèmes seraient impactées différemment par les problèmes que j'ai mentionnés. Par exemple, il y aura une coupure de pression de cache différente en fonction du parallélisme avec lequel vous courez. – Novelocrat

0

Tant que cela ne vous dérange pas les lignes individuelles étant hors service, tout ira bien. OpenMP doit s'assurer qu'une ligne entière est imprimée à la fois.

Cependant, vous devrez déclarer le début et la fin comme privés dans le pragma, sinon les threads les écraseront et perturberont vos timings.

+0

Huh. Pourquoi donc? J'ai juste supposé que puisque les déclarations venaient après le pragma initial de création de thread, chaque thread ferait ses propres déclarations. Je l'ai testé, et gcc a crié car ils n'avaient pas encore été déclarés. –