2011-08-07 7 views
10

सी ++ नौसिखिया यहाँ।वालग्रिंड और ओपनएमपी, अभी भी पहुंच योग्य और संभवतः खो गया है, क्या यह बुरा है?

मैं पिछले कुछ दिनों में अपने मेमोरी प्रबंधन कौशल में सुधार कर रहा हूं, और मेरा प्रोग्राम अब वाल्ग्रिंड के अनुसार स्मृति को रिसाव नहीं करता है। वास्तव में, मुझे वाल्ग्रिंड से कोई चेतावनी नहीं मिलती है। (लेकिन कोई निश्चित रूप से खो दिया ब्लॉक)

==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) 

हालांकि, जब मैं जोड़ने OpenMP मेरी कोड में लूप होता है, मैं valgrind में निम्न त्रुटियों (Memcheck) प्राप्त करने के लिए शुरू

क्या यह वालग्रिंड का मामला ओपनएमपी को समझ नहीं रहा है? या यह ऐसा कुछ है जो भयावह हो सकता है?

ध्यान दें कि जब मैं हेल्ग्रिंड के साथ वालग्रिंड चलाता हूं, तो मुझे हजारों "पढ़ने के दौरान संभावित डेटा दौड़" (और लिखना) संदेश मिलते हैं। हालांकि मेरा प्रोग्राम (तरल गतिशीलता सॉल्वर) ओपनएमपी और सीरियल कोड दोनों के लिए एक ही परिणाम देता है। यदि आप इस समस्या के लिए रुचि रखते हैं तो मैं हेल्ग्रिंड त्रुटियों और प्रासंगिक खंड प्रदान कर सकता हूं।

अन्यथा अभी के लिए, दूसरे संदेश के लिए अपमानजनक कोड यहां दिया गया है: और रेखा 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

Still reachableनहीं एक स्मृति रिसाव है।

Still reachable का मतलब है कि स्मृति का एक ब्लॉक मुक्त नहीं किया गया है, लेकिन रजिस्टरों या स्मृति में उस ब्लॉक की शुरुआत के लिए वैध पॉइंटर्स अभी भी मुक्त नहीं हुए हैं।

आपको the Valgrind FAQ पर एक नज़र डालने की आवश्यकता है। libgomp के लिए वास्तविक कारण चेतावनी दी गई है here

+0

इसलिए स्मृति को अभी भी पहुंचने योग्य ओपनएमपी की एक विशेषता है, जैसा कि एसटीएल मामलों के लिए हो सकता है कि लिंक में? – CptLightning

+0

@CptLightning: मुझे विश्वास होगा, लेकिन मैंने वास्तव में ओपनएमपी के साथ काम नहीं किया है, इसलिए मैं यह सुनिश्चित नहीं कर सकता कि यह मामला है। आपको यह देखने की आवश्यकता होगी कि ओपनएमपी एसटीएल द्वारा समान मूलभूत सिद्धांतों का भी उपयोग करता है, जो लिंक बताता है और इसके बारे में बात करता है। –

संबंधित मुद्दे