El caso de prueba siguiente se queda sin memoria en máquinas de 32 bits (throwing std :: bad_alloc) en el ciclo siguiente al mensaje "post MT section" cuando se usa OpenMP, sin embargo, si #pragmas para OpenMP está comentado, el código se ejecuta hasta el final, así que parece que cuando la memoria se asigna en subprocesos paralelos, no se libera correctamente y, por lo tanto, se queda sin memoria.Fuga de memoria al utilizar OpenMP
La pregunta es si hay algún problema con la asignación de memoria y el código de eliminación a continuación o ¿es esto un error en gcc v4.2.2 o OpenMP? También probé gcc v4.3 y obtuve el mismo error.
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;
}
Cuando ejecuto esto en Windows creado con el compilador de Intel mis asignaciones comienzan a fallar en el primer ciclo debido al límite de 2gb para un proceso de 32 bits. ¿Es posible que la sobrecarga de OpenMP simplemente empuje su proceso sobre cualquier límite en su plataforma? – Scott
@Scott Danahy Intente cambiar el caso de prueba para cortar todas las asignaciones a la mitad, esta prueba funcionó con un límite de 4 GB. – WilliamKF