J'ai utilisé les directives #pragma pour paralléliser mon programme. Sans cela, tout fonctionne bien.C++ pragma omp erreur de segmentation (course de données?) Avec tableaux
Malheureusement, j'utilise des tableaux complexes que je dois déclarer globalement car ils sont utilisés dans plusieurs fonctions au sein de la parallélisation. Pour autant que je comprenne, techniquement cela ne fait pas de différence puisqu'ils sont stockés globalement de toute façon. Cependant, le ou les tableaux problématiques sont utilisés en privé. D'après ce que j'ai compris des autres discussions, je dois assigner de la mémoire aux tableaux avant que la parallélisation commence pour s'assurer que le programme réserve la mémoire correctement pour chaque thread. Dans les threads, j'attribue de nouveau de la mémoire. La taille (matrixsize) ne change pas. Mais même si je mets num_threads (1) pour tester les données (le tableau "degré") dans le thread devient corrompu finalement.
Dans une version antérieure, j'ai déclaré les tableaux dans les threads et n'utilisait aucune fonction. Tout a bien fonctionné, mais cela devient trop compliqué maintenant.
J'ai essayé de réduire le code. J'espère que c'est compréhensible. J'utilise gcc pour le compiler.
Désolé, je n'arrive pas à comprendre le problème. Je serais reconnaissant pour certains conseils.
mieux, Mathias
#include <omp.h>
int matrixsize=200;
vector<int> degree;
vector<list<int> >adjacency;
vector<vector<bool> >admatrix;
vector<vector<float> > geopos;
\\[...]
void netgen();
void runanalyses();
\\[...]
int main(int argc, char *argv[])
{
\\[...]
adjacency.assign(matrixsize,list<int>());
admatrix.assign(matrixsize, vector<bool>(matrixsize, 0));
degree.assign(matrixsize,0);
geopos.assign(matrixsize,vector<float> (dim,0));
#pragma omp parallel for shared(degdist,ADC,ADCnorm,ACC,ACCnorm,its,matrixsize) private(adjacency,admatrix,degree,geopos) num_threads(1)
for (int a=0;a<its;a++)
{
adjacency.assign(matrixsize,list<int>());
admatrix.assign(matrixsize, vector<bool>(matrixsize, 0));
degree.assign(matrixsize,0);
geopos.assign(matrixsize,vector<float> (dim,0));
netgen();
runanalyses();
} // for parallelization
\\[...]
}
Merci Zulan! Je vais y jeter un coup d'oeil, mais je pourrais en fait poser une question de suivi plus tard. – thiasma