2010-09-27 6 views
2

Salutations à tous,OpenMP Paralléliser le bloc de code dans une boucle for?

Je veux exécuter le bloc de code à l'intérieur de la boucle, dans un thread OpenMP distinct. Ai-je défini les directives OpenMP correctes dans l'extrait de code suivant:

#ifdef OPENMP_ENABLE 
     #pragma omp parallel for 
    #endif 

for(int i=0;i<numOfSlices;i++){     // Entire block inside this loop should be fun in new OpenMP thread 

     int id =0; 

     #ifdef OPENMP_ENABLE 
       id=omp_get_thread_num(); 
       qDebug("------- OPENMP thread number %d",id); 
     #endif 
      qDebug("  - Image Slice %d",i); 

     int width=0,height=0; 
     //Image Buffer 
     unsigned char *buff=planeViewer->getImageBuggerOfSlice(i,height,width); 

     //Trunk 
     RzTrunk *rztrnk=planeViewer->getTrunkOfSlice(i); 

     //If Empty trunk,add frame @TODO Hard coded 
     if(rztrnk->getCurveCount()==0){ 
      RzCurve *crv=rztrnk->createFrameCurve(10,10,width-10,height-10); 
      rztrnk->addCurve(crv); 
     } 

     //Covert Rinzo Trunk to Centy Trunk! 
     //TODO Make sure to deallocate memory 
     QImage *qimg=new QImage(buff,width,height,QImage::Format_RGB32); 
     trnk_t *trnkt = convertRzTrunkToCntyTrunk(rztrnk, qimg->width(),qimg->height()); 


     //Convert QImage to Cnty Image format 
     image_t *imgt=convertQImageToImaget(qimg); 

     //This extract parts , first should detect outer border 
     if(etype==EXTRACT_DEFL_INOUT){ 
      cnty_extract_contour(EXTRACT_DEFL_OUT, trnkt, imgt, NULL, NULL,settings2, NULL); 
      trnk_make_crvs_nodes_active(trnkt); 
     } 

     cnty_extract_contour(etype, trnkt, imgt, NULL, NULL,settings, NULL); 
     convertCntyTrunkToRzTrunk(trnkt, rztrnk); 

     trnk_destruct(trnkt); 
     destroyImaget(imgt); 
     delete qimg; 
     delete buff;  
} //end of for loop 
+3

Cela semble correct - si votre intention était de découper la boucle for et de la traiter par différents threads de travail openmp, où est le problème? Quel est le résultat de la boucle ... peut-être l'écriture il faudrait "#pragma omp citical" – FFox

+0

la ligne "RzTrunk * rztrnk = avionViewer-> getTrunkOfSlice (i);" obtenir une instance à partir d'une liste liée et tout le traitement est effectué sur cette variable * rztrnk.Result est juste les entrées modifiées dans la liste liée. –

+0

Ainsi, les données de différents i n'interfèrent pas? Alors le code ci-dessus devrait fonctionner. – FFox

Répondre

0

J'ai trouvé la raison question.Le était que la « cnty_extract_contour() » méthode n'est pas thread-safe.

Questions connexes