2013-03-19 11 views
10

मेरे पास एक लूप है जिसे किसी शर्त के आधार पर schedule(static) या schedule(dynamic, 10) का उपयोग करके निष्पादित किया जा सकता है। वर्तमान में, मेरे कोड सूखी नहीं है (अपने आप को दोहराना नहीं) पर्याप्त और पिछले कार्यक्षमता यह निम्नलिखित पुनरावृत्ति है समायोजित करने के लिए:ओपनएमपी सशर्त प्रगति "अगर अन्य"

boolean isDynamic; //can be true or false 
if(isDynamic){ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10) 
    for(...){ 
     //for code inside 
    } 
}else{ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static) 
    for(...){ 
     //SAME for code inside, in fact, this is the EXACT same for as before 
    } 
} 

इन धागों को पढ़ने के बाद, मैंने देखा है OpenMP एक #if(expression) pragma है:

लेकिन हालांकि मैं मेरी समस्या के साथ कई लोगों को देखा है, वहाँ एक सामान्य समाधान कमी जा रहा है। सबसे अच्छा समाधान लूप के शरीर को फ़ंक्शन में बदलने के लिए है, और उसके बाद फ़ंक्शन कहा जाता है, लेकिन यह समाधान मेरे लिए पर्याप्त नहीं है।

तो मुझे आश्चर्य है, क्या ओपनएमपी में #if(expression) else प्रज्ञा का प्रकार है? कुछ की तरह:

#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static) 

या हूँ मैं एक अलग समारोह में पाश शरीर के लिए मेरी जगह है और इसे उस तरह से कॉल करने के लिए मजबूर कर दिया?

उत्तर

4

यह एक दिलचस्प सवाल है। असल में, आप रनटाइम पर schedule नीति को बदलना चाहते हैं। जहां तक ​​मुझे पता है, वर्तमान ओपनएमपी के लिए ऐसा कोई निर्देश नहीं है।

मुझे वही समस्या थी जो आपने किया था। जैसा कि आपने उल्लेख किया है, मेरा समाधान लूप बॉडी को एक समारोह के रूप में बना रहा है। अन्यथा, आपको एक बदसूरत मैक्रो का उपयोग करने की आवश्यकता है।

हालांकि, मैंने schedule(runtime) का उपयोग करने का भी प्रयास किया, जो पर्यावरण परिवर्तनीय OMP_SCHEDULE पढ़ता है। इसलिए, मैंने रनटाइम पर इस पर्यावरण चर को बदल दिया, लेकिन काम नहीं किया। ऐसा इसलिए है क्योंकि ओपनएमपी रनटाइम शुरुआत में केवल एक बार इस माहौल को पढ़ता है। यह एक कार्यान्वयन-विशिष्ट मुद्दा हो सकता है। इसलिए, अन्य कार्यान्वयन फ्लाई पर इस पर्यावरण चर को पढ़ सकता है। आप इस दृष्टिकोण को आजमा सकते हैं।

+0

मुझे लगता है कि आप इस सुझाव के बारे में बात कर रहे हैं (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196)। टीबीएच, मुझे नहीं लगता कि यहां तक ​​कि संकलित भी है, OMP_FOR को भी परिभाषित नहीं किया गया है। जहां तक ​​OMP_SCHEDULE जाता है मुझे इसके बारे में कोई जानकारी नहीं थी। मैं चारों ओर देखने की कोशिश करूंगा और देख सकता हूं कि मैं क्या पा सकता हूं, थक्स! –

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