C++ valgrind和openmp仍然可以访问并且可能丢失,这是不是很糟糕?

C++ valgrind和openmp仍然可以访问并且可能丢失,这是不是很糟糕?,c++,openmp,valgrind,C++,Openmp,Valgrind,这里是c++新手 valgrind说,在过去的几天里,我一直在提高我的内存管理技能,我的程序不再泄漏内存。事实上,我一点也没有收到valgrind的警告 然而,当我将openmp循环添加到代码中时,我开始在valgrind(memcheck)中出现以下错误:(但绝对没有丢失的块) 以及: 这是valgrind不理解openmp的情况吗?或者是某种可能变得邪恶的东西 请注意,当我使用helgrind运行valgrind时,我会得到数千条“读(和写)消息期间可能的数据竞争”。但是,我的程序(流体动力

这里是c++新手

valgrind说,在过去的几天里,我一直在提高我的内存管理技能,我的程序不再泄漏内存。事实上,我一点也没有收到valgrind的警告

然而,当我将openmp循环添加到代码中时,我开始在valgrind(memcheck)中出现以下错误:(但绝对没有丢失的块)

以及:

这是valgrind不理解openmp的情况吗?或者是某种可能变得邪恶的东西

请注意,当我使用helgrind运行valgrind时,我会得到数千条“读(和写)消息期间可能的数据竞争”。但是,我的程序(流体动力学解算器)为openmp和串行代码提供了相同的结果。如果您对此问题感兴趣,我可以提供helgrind错误和相关部分

否则,下面是第二条消息的错误代码:第943行是pragma行

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;bfor(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;
    }
}