La question et la réponse acceptée existent depuis un certain temps, voici quelques informations supplémentaires qui donnent un aperçu supplémentaire d'openMP et qui pourraient donc être utiles à d'autres utilisateurs.
En C++, le private
et firstprivate
clause traite les objets de classe différemment :
Depuis l'interface de programme d'application OpenMP v3.1 :
privé le nouvel élément de la liste est initialisé, ou a une valeur initiale indéfinie, comme s'il était avait été déclaré localement sans initialisateur. L'ordre dans lequel les constructeurs par défaut pour les différentes variables privées de la classe type sont appelés est non spécifié.
premierprivé pour les variables de type classe, un constructeur de copie est invoqué pour effectuer l'initialisation. initialisation des variables de la liste.
c'est-à-dire private
appelle le constructeur par défaut, alors que firstprivate
appelle le constructeur de copie de la classe correspondante.
Le constructeur par défaut de std::vector
construit un conteneur vide sans éléments, c'est pourquoi les tampons ont une taille de 0.
Pour répondre à la question, il s'agirait d'une autre solution qui ne nécessite pas de diviser la région OpenMP :
std::vector<size_t> buffer(100, 0);
#pragma omp parallel for firstprivate(buffer)
for (size_t j = 0; j < 10000; ++j) {
// use the buffer
}
EDIT un mot d'avertissement concernant les variables privées en général : la taille de la pile de threads est limitée et, à moins d'être explicitement définie (variable d'environnement OMP_STACKSIZE
) dépendant du compilateur. Si vous utilisez des variables privées ayant une grande empreinte mémoire, le dépassement de pile peut devenir un problème.