2016-04-12 2 views
0

私は口蓋化したコードを持っています。下記を参照してください。コードは最初は非常に速く実行されますが、特定の反復後には速度が低下します。openmpループは最初は非常に高速ですが、後で遅くなります(ほとんど固まってしまいます)

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

私はさまざまなスケジューリングとチャンクサイズを試しましたが、それは役に立ちません。私は助言に感謝します。

ありがとうございます!

+0

最終的にRAMを使い果たしてしまい、おそらく 'getSomeString'メソッドの中にあるメモリ問題のようです。ファイルを使用した後にファイルを閉じ、動的に割り当てられたすべてのメモリが使用されている場合は、それらを解放するようにしてください。 – rasan076

+0

私はトップを使ってラムを監視していますが、そこには何も表示されません。 – Mos

+0

getSomeStringメンバー関数のstd :: map(ただし挿入しません)にアクセスしているといいでしょう。 – Mos

答えて

1

ありがとうございました。 実際、ボトルネックはHDDのIO(読み取り)です。 初期スピードアップはファイルがキャッシュされた結果でもあります。 SSDドライブにデータをコピーしましたが、この場合、並列化は大きく異なりますが、IOは大きなボトルネックにはなりません。

関連する問題