2010-01-21 10 views
7

समानांतर क्यों नहीं करता है, मैंने अभी OpenMP का उपयोग करने का तरीका सीखना शुरू कर दिया है। मैं यह पता लगाने की कोशिश कर रहा हूं कि निम्न कोड विजुअल स्टूडियो 2008 के साथ समानांतर में क्यों नहीं चलता है। यह संकलित करता है और ठीक चलाता है। हालांकि यह मेरी क्वाड कोर मशीन पर केवल एक कोर का उपयोग करता है। यह कोड का हिस्सा है जिसे मैं MATLAB मैक्स फ़ंक्शन पर पोर्ट करने का प्रयास कर रहा हूं। किसी भी सूचक की सराहना की है।यह जानने की कोशिश कर रहा है कि ओपनएमपी कोड

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v) 
for(t = 0; t<T; t++) 
{ 
    dz = aRNG->randn(); 
    v += mrdt* (tv - v) + 
     vv_v_sqrt_dt * dz + 
     vv_vv_v_dt*(dz*dz - 1.); 

    sum_v += v; 
    if(t == ts_count-1) 
    { 
     int_v->at_w(k++) = sum_v/(double)(t+1); 
     ts_count += ts; 
    } 
} 

उत्तर

4

वी चर पिछले यात्रा

for(t = 0; t<T; t++) { 
    ... 
    v += ... (tv - v) .... 
    ... 
    } 

आप ऐसा नहीं कर सकते की वी मूल्य का उपयोग कर गणना की जाती है, यह समानांतरवाद टूट जाता है। लूप किसी भी अनुक्रम में, या बिना किसी दुष्प्रभाव के, एक साथ में differents समानांतर भाग के साथ चलाने में सक्षम होना चाहिए। पहली नज़र से, ऐसा लगता है कि आप इस तरह के लूप को समानांतर नहीं कर सकते हैं।

+0

आपको लूप के भीतर यादृच्छिक संख्या जनरेटर के अपने से कुछ पर विचार करना चाहिए। इसके कार्यान्वयन के आधार पर यह उपरोक्त मुद्दे को संबोधित करने के बाद आपके कोड को प्रभावी ढंग से क्रमबद्ध करने के लिए साझा संसाधन को लॉक कर सकता है। –

0

मैं भी यकीन नहीं है, यह एक लंबे समय के बाद से मैं OpenMP इस्तेमाल किया गया है, लेकिन आप निजी रूप में पाश चर टी सेट है। क्या तुम यही चाहते हो? क्या समांतरता चर नहीं है?

0

एक संभावना यह है कि आप "sum_v" चर का उपयोग कर रहे हैं। चूंकि आप कमी कर रहे हैं, रनटाइम शायद वहां केवल मूल्यों को जमा करने की अपेक्षा करता है, और लूप होने के बाद ही इसे 'सामान्य' तक पहुंचता है।

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