2017-03-15 5 views
0

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 

\\[...] 

} 

Répondre

0

Malheureusement, j'utilise des tableaux complexes que je dois déclarer globalement parce qu'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.

Vous ne devriez vraiment pas faire ça! La modification de structures de données globales dans des régions parallèles rend très difficile la mise en cause des courses de données. Au lieu de cela, définissez des inerfaces appropriées, par ex. passage de vecteurs par (const) référence. Par exemple, vous pouvez travailler en toute sécurité sur un const std::vector& dans une région parallèle. Une fois débarrassé de l'état global, et toujours rencontrer des problèmes, n'hésitez pas à poser une question de suivi, mais assurez-vous d'inclure un Minimal, Complete, and Verifiable example (lisez attentivement cette page) ainsi qu'une description de l'erreur spécifique que vous avez obtenez et vos tentatives pour le déboguer.

+0

Merci Zulan! Je vais y jeter un coup d'oeil, mais je pourrais en fait poser une question de suivi plus tard. – thiasma