2016-04-12 3 views
0

Ich habe ein Stück Code, die ich palatalisiert habe, siehe unten. Der Code läuft am Anfang sehr schnell, jedoch verlangsamt er sich nach bestimmten Iterationen.openmp Schleife ist sehr schnell am Anfang, wird aber langsam (fast stecken) danach

// something before this ... 
// filename_list is quite long, 100k+ files 

vector<string> some_string_list(filename_list.size(), " "); 
int file_count = filename_list.size(); 

int counter = 0; 

#pragma omp parallel for reduction(+:counter) schedule(auto) 
for (int i = 0; i < file_count; i++) 
{ 
    string loop_filename = filename_list[i]; 
    counter++; 

    // The filename is used to call a class member function and get some data, the file is used for reading 
    // This is the heavy part of code 
    some_string_list[i] = someclassinstance.getSomeString(loop_filename, param1, param2); 
    int temp = counter; 
    if(temp % 1000 == 0) 
    { 
    cout << "." << flush; 
    } 
} 

cout << endl; 

Ich habe verschiedene Scheduling und Chunk-Größen ausprobiert, aber es hilft nicht. Ich schätze jeden Rat.

Danke!

+0

Es klingt wie eine Art von Speicherproblem, wo Sie schließlich aus RAM, wahrscheinlich innerhalb der "GetSomeString" -Methode. Stellen Sie sicher, dass Sie die Dateien schließen, nachdem Sie sie verwendet haben, und alle dynamisch zugewiesenen Speicher freigeben, wenn diese verwendet werden. – rasan076

+0

Ich überwache Ram mit Top, nichts, was ich dort sehen kann ... – Mos

+0

Vielleicht ist es gut zu erwähnen, dass ich auf eine std :: map zugreifen (aber nicht einfügen) in der GetSomeString Member-Funktion – Mos

Antwort

1

Vielen Dank für die hilfreichen Kommentare. Tatsächlich ist der Engpass der IO (Read) auf HDD. Die anfängliche Beschleunigung war auch ein Ergebnis von Dateien, die zwischengespeichert wurden. Ich habe die Daten auf ein SSD-Laufwerk kopiert, und in diesem Fall macht die Parallelisierung einen großen und klaren Unterschied, und IO wird kein großer Flaschenhals.