2011-08-07 52 views
10

C++ newbie here。valgrind和openmp,仍然可到達並可能丟失,是不是很糟糕?

過去幾天我一直在提高自己的記憶管理技能,而且根據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: [email protected]@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; 
    } 
} 

回答

9

​​是不是內存泄漏。

​​意味着一塊內存沒有被釋放,但仍有有效指針指向該寄存器或內存中尚未被釋放的該塊的開始。

你需要看看the Valgrind FAQ。引起警告的libgomp的實際原因解釋爲here

+0

因此,讓內存仍然可以訪問是openmp的一個特性,就像它在STL情況下的情況一樣,就像在那個鏈接中一樣? – CptLightning

+0

@CptLightning:我會這麼認爲的,但是我沒有真正與OpenMP合作過,所以我不能肯定地說這是事實。您需要查看OpenMP是否也使用與STL相同的基礎知識,鏈接將解釋和討論。 –

相關問題