2016-04-12 18 views
0

Ben palatalized bir kod parçası var, aşağıya bakın. Kod başlangıçta çok hızlı çalışır, ancak belirli tekrarlamalar sonrasında yavaşlar.openmp loop başlangıcında çok hızlı, ancak daha sonra yavaş (neredeyse sıkışmış) olur

// 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; 

Farklı zamanlama ve yığın boyutları denedim, ancak yardımcı olmuyor. Herhangi bir tavsiyeye minnettarım.

Teşekkürler!

+0

Sonunda RAM'in tükendiğinde, muhtemelen getSomeString yönteminin içinde bir tür bellek sorunu gibi görünüyor. Dosyaları kullandıktan sonra kapattığınızdan ve kullanıldığında, tüm dinamik olarak ayrılmış belleği boşaltdığınızdan emin olun. – rasan076

+0

Ben ram üst kullanarak izliyorum, orada görebileceğim bir şey yok ... – Mos

+0

Belki bir std :: map (ama ekleme değil) getSomeString üye fonksiyonuna erişiyorum olduğunu belirtmek iyidir – Mos

cevap

1

Yararlı yorumlar için hepinize teşekkür ederiz. Gerçekten de darboğaz, HDD'deki IO (okuma). İlk hızlanma ayrıca önbelleğe alınan dosyaların bir sonucuydu. Verileri bir SSD sürücüsüne kopyaladım ve bu durumda, paralelleştirme büyük ve net bir fark yaratıyor ve IO büyük bir darboğaz haline gelmiyor.