c ++ newbie here。
过去几天我一直在提高我的记忆管理技能,根据valgrind,我的程序不再泄漏记忆。事实上,我根本没有得到valgrind的警告。
然而,当我在我的代码中添加openmp循环时,我开始在valgrind(memcheck)中得到以下错误:(但没有明确丢失的块)
==6417== 304 bytes in 1 blocks are possibly lost in loss record 3 of 4
==6417== at 0x4C279FC: calloc (vg_replace_malloc.c:467)
==6417== by 0x4011868: _dl_allocate_tls (dl-tls.c:300)
==6417== by 0x6649871: pthread_create@@GLIBC_2.2.5 (allocatestack.c:570)
==6417== by 0x62263DF: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==6417== by 0x42A2BB: Blade::updatePanels() (blade.cpp:187)
==6417== by 0x418677: VLMsolver::initialiseBlade() (vlmsolver.cpp:590)
==6417== by 0x415A1B: VLMsolver::start(std::string) (vlmsolver.cpp:80)
==6417== by 0x40B28C: main (charybdis.cpp:176)
和
==6417== 1,568 bytes in 1 blocks are still reachable in loss record 4 of 4
==6417== at 0x4C28FAC: malloc (vg_replace_malloc.c:236)
==6417== by 0x6221578: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==6417== by 0x6226044: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==6417== by 0x622509B: GOMP_parallel_start (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==6417== by 0x41AF58: VLMsolver::segmentCirculations() (vlmsolver.cpp:943)
==6417== by 0x415E4B: VLMsolver::solveManager() (vlmsolver.cpp:177)
==6417== by 0x415A4B: VLMsolver::start(std::string) (vlmsolver.cpp:91)
==6417== by 0x40B28C: main (charybdis.cpp:176)
这是valgrind不理解openmp的情况吗?或者它可能变得险恶?
请注意,当我使用helgrind运行valgrind时,我会在读取(和写入)消息期间获得数千个“可能的数据竞争”。然而,我的程序(流体动力学求解器)为openmp和serial代码提供了相同的结果。如果您对此问题感兴趣,我可以提供helgrind错误和相关部分。
否则现在,这是第二条消息的违规代码:第943行是编译指示行。
for (int b = 0;b < sNumberOfBlades;++b) {
*VLMSOLVER.CPP LINE 943 is next*:
#pragma omp parallel for collapse(2) num_threads(2) firstprivate(b)
for (int i = 0;i<numX;++i) {
for (int j = 0;j<numY;++j) {
if (j == 0) {
blades[b].line[i*numNodesY+j].circulation = blades[b].panel[i*numY+j].circulation;
} else {
blades[b].line[i*numNodesY+j].circulation = blades[b].panel[i*numY+j].circulation - blades[b].panel[i*numY+j-1].circulation;
}
if (j==numY-1) {
blades[b].line[i*numNodesY+j+1].circulation = -1 * blades[b].panel[i*numY+j].circulation;
}
}
}
if (sBladeSymmetry) {
break;
}
}
int k = numX*numNodesY;
for (int b = 0;b < sNumberOfBlades;++b) {
for (int i = 0;i<numX;++i) {
for (int j = 0;j<numY;++j) {
if (i == 0) {
blades[b].line[k+i*numY+j].circulation = - 1 * blades[b].panel[i*numY+j].circulation;
} else {
blades[b].line[k+i*numY+j].circulation = -1 * blades[b].panel[i*numY+j].circulation + blades[b].panel[(i-1)*numY+j].circulation;
}
if (i==numX-1) {
blades[b].line[k+(i+1)*numY+j].circulation = blades[b].panel[i*numY+j].circulation;
}
}
}
if (sBladeSymmetry) {
break;
}
}
答案 0 :(得分:9)
Still reachable
不是内存泄漏。
Still reachable
表示尚未释放内存块,但仍有有效指针指向尚未释放的寄存器或内存中该块的起始位置。
您需要查看 the Valgrind FAQ 。导致警告libgomp
的实际原因解释为 here 。