2016-11-16 2 views
0

Wie können wir alle Prozessoren gleichzeitig verwenden, um unter Verwendung von Openmp Flag unter dem Code zu laufen?Wie es als parallele Verarbeitung mit OpenMP-Flag zu machen?

Wenn ich Umwandlung bin while-Schleife für Schleife for(;!xml.atEnd();) verwendet wird, zeigt Fehler:

need to initialisation and increment/decrements

//Need parallel processing for this code. 
while (!xml.atEnd()) { 
     // cerr <<"while loop"; 
     xml.readNext(); 
     if (xml.isStartElement()) { 
      currentXmlElement = xml.name(); 


      if (xml.name() == "sample") { 
       QString fname = xml.attributes().value("filename").toString(); 
       QString sname = xml.attributes().value("name").toString(); 
       QString setname = xml.attributes().value("setName").toString(); 
       QString sampleOrder = xml.attributes().value("sampleOrder").toString(); 
       QString isSelected = xml.attributes().value("isSelected").toString(); 
       //_mainwindow->setStatusText(tr("Loading sample: %1").arg(sname)); 
       //_mainwindow->setProgressBar(tr("Loading Sample Number %1").arg(++currentSampleCount),currentSampleCount,currentSampleCount+1); 

       bool checkLoaded=false; 
       Q_FOREACH(mzSample* loadedFile, _mainwindow->getSamples()) { 
        if (QString(loadedFile->fileName.c_str())== fname) checkLoaded=true; 
       } 

       if(checkLoaded == true) continue; // skip files that have been loaded already 
       // #pragma omp critical { 
       qDebug() << "Checking:" << fname; 
       QFileInfo sampleFile(fname); 

       if (!sampleFile.exists()) { 
        Q_FOREACH(QString path, pathlist) { 
         fname= path + QDir::separator() + sampleFile.fileName(); 
         qDebug() << "Checking if exists:" << fname; 
         if (sampleFile.exists()) break; 
        } 
       } 

       if (!fname.isEmpty()) { 
        // mzFileIO* fileLoader = new mzFileIO(this); 
        // fileLoader->setMainWindow(_mainwindow); 
        // mzSample* sample = fileLoader->loadSample(fname); 
        // delete(fileLoader); 

        mzSample* sample = _mainwindow->fileLoader->loadSample(fname); 
        if (sample) { 
         _mainwindow->addSample(sample); 
         currentSample=sample; 
         if (!sname.isEmpty())  sample->sampleName = sname.toStdString(); 
         if (!setname.isEmpty())   sample->setSetName(setname.toStdString()); 
         if (!sampleOrder.isEmpty())  sample->setSampleOrder(sampleOrder.toInt()); 
         if (!isSelected.isEmpty())  sample->isSelected = isSelected.toInt(); 
        } else { 
         currentSample=NULL; 
        } 
       } 
      } 

    //change sample color 
      if (xml.name() == "color" && currentSample) { 
       currentSample->color[0] = xml.attributes().value("red").toString().toDouble(); 
       currentSample->color[1] = xml.attributes().value("blue").toString().toDouble(); 
       currentSample->color[2] = xml.attributes().value("green").toString().toDouble(); 
       currentSample->color[3] = xml.attributes().value("alpha").toString().toDouble(); 
      } 

    //polynomialAlignmentTransformation vector 
      if (xml.name() == "polynomialAlignmentTransformation" && currentSample) { 
     vector<double>transform; 
     Q_FOREACH(QXmlStreamAttribute coef, xml.attributes()) { 
     double coefValue =coef.value().toString().toDouble(); 
     transform.push_back(coefValue); 
     } 
     qDebug() << "polynomialAlignmentTransformation: "; printF(transform); 
     currentSample->polynomialAlignmentTransformation = transform; 
     currentSample->saveOriginalRetentionTimes(); 
     currentSample->applyPolynomialTransform(); 
    } 
     } 
     if (xml.isCharacters() && currentXmlElement == "projectDescription") { 
      projectDescription.append(xml.text()); 
     } 
    } 
+0

Reduzierte Einrückung –

Antwort

0

OpenMP wirklich nicht mit beliebigen Objekten befassen. Außerdem passt das OpenMP-Modell hier nicht. Die Grundidee von OpenMP besteht darin, einzelne Iterationen einer for-Schleife zu verschiedenen Threads zu verarbeiten. Dies wird nicht gut für das Lesen von XML-Daten funktionieren, die aufgrund ihrer Natur seriell gelesen werden müssen, um die Reihenfolge zu erhalten.

In Ihrem Fall angenommen, Sie könnten OpenMP verwenden und die äußere Schleife parallelisieren. Angenommen, es laufen 8 OpenMP-Threads. Jeder wird die xml.readNext(); Zeile ausführen. Ich kann fast garantieren, dass die readNext Funktion nicht thread-safe ist, die Ihnen undefined Ergebnisse gibt. Selbst wenn es threadsicher wäre, müsste es einen ganzen Artikel (nicht sicher, was gelesen wird, da ich den Typ xml nicht kenne) atomar lesen, was Ihren Code sowieso größtenteils seriell machen würde.

Verwandte Themen