2010-11-22 27 views
6

J'ai actuellement un code (en C) avec une boucle externe qui est OpenMP-parallélisée (elle opère localement sur une liste de mémoire partagée). Je le réécris en C++, et pour beaucoup de choses j'ai trouvé la macro BOOST_FOREACH une très belle syntaxe en tant que construction en boucle pour l'itération sur une liste, un tableau, etcMixage Boost FOREACH macro et parallélisation OpenMP

Ma question est: est-ce que je peux utiliser les deux cette syntaxe et paralléliser la boucle OpenMP-style?

Répondre

2

Copie à partir du terminal vaut 1 kilowords:

$ g++ a.cpp -I/opt/boost-1.45.0/include -O -fopenmp 
a.cpp: In function ‘int main()’: 
a.cpp:12: error: for statement expected before ‘if’ 
0

Oui, cela devrait simplement fonctionner. BOOST_FOREACH est juste une macro auxiliaire pour une boucle for, donc OpenMP devrait reconnaître et paralléliser cette boucle. Pourquoi ne pas simplement essayer, et profiler le résultat?

+1

Je ne suis pas sûr ... autant que je peux voir de l'en-tête, la macro BOOST_FOREACH plus se développe en une boucle, car il inclut d'abord une série de 'if'-'else' ... Donc, si je mets mes directives OpenMP juste au dessus de la macro, elles ne seront pas juste au-dessus de la boucle' for' elle-même. –

0

Je serais impressionné si OpenMP paralysait boost_foreach, car foreach s'appuie fortement sur les astuces de modèle pour déduire le type de conteneur. Si j'étais dans votre position, je réécrirais le foreach pour utiliser des boucles for-régulières.

+2

Enfer, il y a tellement de fausses choses avec cette réponse ... La science informatique n'est pas une science empirique, pour la plupart. Pour le moment, si cela fonctionne sur un système donné, avec un compilateur donné (et un ensemble d'options), cela ne me donne aucune garantie que cela fonctionnera sur n'importe quel autre système ou avec n'importe quel autre compilateur. –

+0

Science et science, si c'est NUM_CORES-3 fois plus rapide, je serais tout à fait sûr que openMP paralyserait la boucle for –