2016-08-08 3 views
0

Valgrind сказал мне, что я следующая проблема в моем коде:Memory Leak - OpenMP

LEAK SUMMARY: 
==18114== definitely lost: 0 bytes in 0 blocks 
==18114== indirectly lost: 0 bytes in 0 blocks 
==18114==  possibly lost: 1,776 bytes in 3 blocks 
==18114== still reachable: 2,320 bytes in 4 blocks 
==18114==   suppressed: 0 bytes in 0 blocks 

Эта проблема возникает в:

#pragma omp parallel for num_threads(numThreads) 

в

parallelCalc= new Calculator[numOff]; 

    #pragma omp parallel for num_threads(numThreads) 
    for(int i = 1; i<=numOff;i++) 
    { 
     std::stringstream sstm; 
     sstm << filename <<"/" << i<<".off"; 
     std::string aktFilename = sstm.str(); 


     Polyhedron *poly = new Polyhedron(aktFilename.c_str()); 
     parallelCalc[i-1].init(poly,consistentTargets->points,numTarget); 
     parallelCalc[i-1].hfield(); 


     delete poly; 
    } 

Я пытался установить parallelCalc, совместно используемый в openmp, (я думаю, что это проблема, не так ли?), но когда я это делаю, получаю ошибку MainController::parallelCalc is not a variable in clause shared. Может ли кто-нибудь дать мне подсказку, как решить эту проблему с памятью?

+0

Есть ли причина, по которой вы используете указатель здесь? Если нет, вы должны использовать локальный автоматический объект цикла. – NathanOliver

+0

Неужели проблема связана с omp? Ошибка при исчезновении ошибки, если вы отключите omp? – Mehno

+0

Да, серийная версия не имеет проблем с памятью. И это тот же код, что и без #pragma omp, я думаю, что openmp производит частные параллельные вычисления для каждого потока, и это проблема утечки, не так ли? – Julian

ответ

1

Невозможно воспроизвести вашу ошибку, поскольку код не является полным.

Я вижу одну потенциальную потерю памяти. У вас есть новый запрос Калькулятора, но нет соответствующего удаления.

Кроме того, может быть другая память, статически выделяемая косвенными средствами, что нет способа освободиться.

Один из способов выяснить, что происходит, это использовать valgrind в режиме, в котором он покажет вам, какие конкретные элементы он считает утечкой. Я обычно использую

Valgrind --verbose --num-звонящие = 30 --track-FDS = да --leak проверка = полная --show-достижимые = да

Это сваливают много больше информации позволяет вы должны отследить, где valgrind думает, что происходит утечка. Используйте трассировки стека, которые valgrind дает вам понять, можете ли вы спокойно игнорировать «утечки», потому что вы ничего не можете с этим поделать или вам нужно исправить код, который вы пишете.

+0

Для получения дубликата см. Следующее: http://stackoverflow.com/questions/26391389/compiling-with-openmp-results-in-a-memory-leak?rq=1 – Russ

+0

Я не уверен, это то же самое. Когда я добавляю parallelCalc = new parallelCalc() и удаляю parallelCalc внутри цикла for, я не получаю никаких утечек, но мне нужны результаты parallelCalc. – Julian

+0

Вы удаляете parallelCalc, используя 'delete [] parallelCalc'? Вы пытались запустить valgrind с параметрами командной строки, упомянутыми выше, чтобы узнать, на что указывает valgrind? – Russ