OpenMPを使用すると、 "post MT section"メッセージの後のループで、32ビットマシン(std :: bad_allocをスローする)のメモリが不足しますが、#pragma for OpenMPはコメントアウトされているので、コードは正常終了まで実行されるので、メモリが並列スレッドで割り当てられても、スレッドは正しく解放されず、メモリが不足するようです。OpenMPを使用しているときにメモリリークが発生する
以下のメモリ割り当ておよび削除コードに問題があるかどうか、またはこれはgcc v4.2.2またはOpenMPのバグですか?私はgcc v4.3も試してみたが、同じ失敗があった。
int main(int argc, char** argv)
{
std::cout << "start " << std::endl;
{
std::vector<std::vector<int*> > nts(100);
#pragma omp parallel
{
#pragma omp for
for(int begin = 0; begin < int(nts.size()); ++begin) {
for(int i = 0; i < 1000000; ++i) {
nts[begin].push_back(new int(5));
}
}
}
std::cout << " pre delete " << std::endl;
for(int begin = 0; begin < int(nts.size()); ++begin) {
for(int j = 0; j < nts[begin].size(); ++j) {
delete nts[begin][j];
}
}
}
std::cout << "post MT section" << std::endl;
{
std::vector<std::vector<int*> > nts(100);
int begin, i;
try {
for(begin = 0; begin < int(nts.size()); ++begin) {
for(i = 0; i < 2000000; ++i) {
nts[begin].push_back(new int(5));
}
}
} catch (std::bad_alloc &e) {
std::cout << e.what() << std::endl;
std::cout << "begin: " << begin << " i: " << i << std::endl;
throw;
}
std::cout << "pre delete 1" << std::endl;
for(int begin = 0; begin < int(nts.size()); ++begin) {
for(int j = 0; j < nts[begin].size(); ++j) {
delete nts[begin][j];
}
}
}
std::cout << "end of prog" << std::endl;
char c;
std::cin >> c;
return 0;
}
インテルコンパイラでビルドされたWindowsでこれを実行すると、32ビットプロセスの2GBの制限に達するため、最初のループで割り当てが失敗します。 OpenMPのオーバーヘッドが、あなたのプラットフォーム上の制限を超えてプロセスをプッシュするだけで済む可能性はありますか? – Scott
@Scott Danahyテストケースを変更してすべての割り当てを半分にするようにしてください。このテストでは4 GBの制限がありました。 – WilliamKF