2017-07-14 4 views
5

चैपल कटौती वर्तमान में चर के प्रारंभिक मानों को अनदेखा करती है। इसका मतलब है कि यह कोडनेस्टेड कटौती - चैपल में इन्हें लिखने का सबसे बेवकूफ तरीका क्या है?

var x: int; 
for i in 1..3 { 
    forall j in 1..10 with (+ reduce x) { 
    x += 1; 
    } 
} 

writeln(x); 

10 और 30 नहीं देता है, क्योंकि इस उपयोगकर्ता ने सोचा था। हालांकि यह व्यवहार ठीक है (और इसे कम करने वाले खंडों पर नोट्स में दस्तावेज किया गया है - मैंने अभी इसके बारे में कड़ी मेहनत नहीं की है), यह पता चला है कि अगर मैं 30 प्राप्त करना चाहता हूं (दोनों लूपों में जमा करके), मुझे इसकी आवश्यकता है वास्तव में हाथ से योग करते हैं। मुझे लगता है कि यह काफी सुंदर और for छोरों के लिए सममित भी एक reduce मंशा है के लिए होगा .... यानी मैं लिखने के लिए

var x: int; 
for i in 1..3 with (+ reduce x) { 
    forall j in 1..10 with (+ reduce x) { 
    x += 1; 
    } 
} 

writeln(x); 

ध्यान दें कि यहां तक ​​कि संख्या संक्षेप के मामले में, मैं शुरू करने की जरूरत है चाहता हूँ एक अस्थायी चर। संचालन की तरह अधिकतम/मिनट के लिए, किसी और को भी सावधान रहने की आवश्यकता है।

क्या कोई कारण नहीं है कि reduce लूप के अंदर इरादों का समर्थन न करें? वैकल्पिक रूप से, क्या ऐसा करने के लिए एक और मूर्खतापूर्ण (चैपल-कृत्रिम) तरीका है?

अद्यतन: जितना अधिक मैं इस बारे में सोचता हूं, यह स्पष्ट नहीं है कि मेरा प्रस्तावित कोड इस मामले में काम करेगा कि बाहरी for को forall द्वारा प्रतिस्थापित किया गया था। मुझे लगता है कि मुद्दा यह है कि वेरिएबल कार्य-स्थानीय हैं और पुनरावृत्ति-स्थानीय नहीं हैं, ताकि कमी केवल कार्यों पर ही हो। तो एक को अभी भी एक अलग आंतरिक कमी कदम की आवश्यकता होगी। यह एक अस्थायी चर की आवश्यकता है जो हटा देगा।

मुझे लगता है कि अधिक व्यापक सवाल क्या नेस्ट कटौती की इन प्रकार के ऐसा करने के लिए सही तरीका क्या है है ...

+1

अपने प्रश्न में पहला कार्यक्रम अब काम करता है के रूप में आप पर उम्मीद:

चैपल 1.15.0 के रूप में, इससे बचने के लिए एक ही रास्ता धारावाहिक पाश के भीतर मैन्युअल रूप से कमी करने के लिए, इस प्रकार होगा चैपल की मास्टर शाखा (https://github.com/chapel-lang/chapel/pull/7351) और यह परिवर्तन अक्टूबर 2017 में चैपल 1.16 रिलीज में उपलब्ध होना चाहिए। – Brad

+0

बीटीडब्लू, आपका कोड भी काम करता है (जेनरेट किया गया '30') जब मैंने बाहरी 'फॉर' को 'फॉरल' के साथ बदल दिया और इसी तरह के एक कम इरादे से बदल दिया। – Brad

+0

मूल कोड ब्लॉक अब काम करता है जैसा कि आप चैपल 1.16 रिलीज़ में अपेक्षित थे। इस सुझाव के लिए धन्यवाद। – Brad

उत्तर

5

मुझे ऐसा लगता है कि इस चैपल के कम करने के इरादे के डिजाइन में एक निरीक्षण है। विशेष रूप से, जबकि मुझे लगता है कि यह उचित है कि प्रत्येक कार्य मूल चर के मूल्य को अनदेखा करता है ताकि उसकी पहचान की वैरिएबल की पहचान की पहचान प्रतिलिपि में हो (जैसा कि आप वर्तमान में नोट करते हैं), मुझे विश्वास है कि कार्यों के योगदान को वापस जोड़ा जाना चाहिए समांतर लूप के अंत में मूल वैरिएबल का मान उस मूल मान को ओवरराइट करने के बजाए एक दूसरे के साथ संयुक्त होता है। यह अपने मूल प्रयास काम करने के रूप में आप की उम्मीद थी, और यह भी क्या OpenMP, करता है निम्नलिखित सी उदाहरण है जो अपने परिणाम के रूप में 35 हो जाता है द्वारा के रूप में सुझाव का पालन करेगा:

#include <stdio.h> 
#include <omp.h> 

int main(int argc, char* argv[]) { 
    int tot = 5; 
    for (int i=0; i<3; i++) { 
    #pragma omp parallel for reduction(+:tot) 
    for (int j=0; j<10; j++) { 
     tot += 1; 
    } 
    } 
    printf("tot is: %d\n", tot); 
} 

मैं एक बग/सुविधा का अनुरोध दायर करने की सिफारिश करेंगे चैपल GitHub issues page पर इस व्यवहार के लिए वकालत।

config var tot: int = 5; 

for i in 1..3 { 
    var subtot: int; 
    forall j in 1..10 with (+ reduce subtot) do 
    subtot += 1; 
    tot += subtot; 
} 

writeln("tot is: ", tot); 
संबंधित मुद्दे

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