C++ valgrind和openmp仍然可以访问并且可能丢失,这是不是很糟糕?
这里是c++新手 valgrind说,在过去的几天里,我一直在提高我的内存管理技能,我的程序不再泄漏内存。事实上,我一点也没有收到valgrind的警告 然而,当我将openmp循环添加到代码中时,我开始在valgrind(memcheck)中出现以下错误:(但绝对没有丢失的块) 以及: 这是valgrind不理解openmp的情况吗?或者是某种可能变得邪恶的东西 请注意,当我使用helgrind运行valgrind时,我会得到数千条“读(和写)消息期间可能的数据竞争”。但是,我的程序(流体动力学解算器)为openmp和串行代码提供了相同的结果。如果您对此问题感兴趣,我可以提供helgrind错误和相关部分 否则,下面是第二条消息的错误代码:第943行是pragma行C++ valgrind和openmp仍然可以访问并且可能丢失,这是不是很糟糕?,c++,openmp,valgrind,C++,Openmp,Valgrind,这里是c++新手 valgrind说,在过去的几天里,我一直在提高我的内存管理技能,我的程序不再泄漏内存。事实上,我一点也没有收到valgrind的警告 然而,当我将openmp循环添加到代码中时,我开始在valgrind(memcheck)中出现以下错误:(但绝对没有丢失的块) 以及: 这是valgrind不理解openmp的情况吗?或者是某种可能变得邪恶的东西 请注意,当我使用helgrind运行valgrind时,我会得到数千条“读(和写)消息期间可能的数据竞争”。但是,我的程序(流体动力
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;
}
}
for(int b=0;b for(int i=0;i仍然可访问不是内存泄漏。
仍然可访问
表示内存块尚未释放,但寄存器或内存中仍有指向该块开头的有效指针未释放
你需要看一看。libgomp
导致警告的实际原因已经解释清楚了,所以让内存仍然可以访问是openmp的一项功能,就像在该链接中的STL情况一样?@cptlighting:我相信是这样,但我没有真正使用openmp,所以我不能说f你需要看看OpenMP是否也使用了与STL相同的基本原理,链接对此进行了解释和讨论。
==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)
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;
}
}