2010-10-21 15 views
6

मैं सिर्फ ऑनलाइन ट्यूटोरियल और संसाधनों से ओपनएमपी सीख रहा हूं। मैं parallel for लूप का उपयोग करके एक मैट्रिक्स (इसे स्वयं से गुणा करें) को स्क्वायर करना चाहता हूं। IBM compiler documentation में, मुझे आवश्यकता मिली कि "पुनरावृत्ति चर signed पूर्णांक होना चाहिए।" क्या यह जीसीसी कार्यान्वयन में भी सच है? क्या यह ओपनएमपी मानक में निर्दिष्ट है? यदि हां, तो क्या इस आवश्यकता का कोई कारण है?लूप चर के समानांतर में क्यों हस्ताक्षर किए जाने चाहिए?

(यह करता है ज्यादा बात नहीं के रूप में की उम्मीद आयाम INT_MAX की तुलना में कहीं छोटे होते हैं, लेकिन यह मुझे कुछ डाले खर्च करता है।)

+0

यह प्रश्न [इस] [http://stackoverflow.com/questions/2820621) की एक डुप्ली के रूप में चिह्नित किया गया था, लेकिन इसमें कोई अंतर है, जो कि मुझे विशेष रूप से जीसीसी के ओपनएमपी में रूचि थी। –

उत्तर

5

ओपनएमपी 3.0 विनिर्देश के अनुसार: http://www.openmp.org/mp-documents/spec30.pdf, चर के लिए एक हस्ताक्षरित या हस्ताक्षरित पूर्णांक प्रकार का हो सकता है, देखें 2.5.1 लूप निर्माण। सवाल यह है कि क्या ओपनएमपी कार्यान्वयन दिया गया है इस नवीनतम विनिर्देश से मेल खाता है।

+0

स्वीकार किया गया क्योंकि 3.0 में प्रतिबंध हटा लिया गया है, इसलिए शायद पहले स्थान पर इसका कोई अच्छा कारण नहीं था। कारण के लिए –

8

Why aren't unsigned OpenMP index variables allowed? से हवाला देते हुए:

OpenMP 2.0 C/C++ API विनिर्देश के अनुसार (पीडीएफ), सेक्शन 2.4.1, यह लूप के प्रतिबंधों में से एक है। कोई कारण नहीं इसके लिए दिया जाता है, लेकिन मुझे लगता है कि यह सिर्फ करने के लिए आसान बनाने मान्यताओं कोड और संकलक करना है, के बाद से वहाँ यह सुनिश्चित करें कि रेंज प्रकार की अधिकतम मूल्य अतिप्रवाह नहीं करता है विशेष कोड है ।

ओपनएमपी 3.0 स्पष्ट रूप से बिना हस्ताक्षर किए गए प्रकारों की अनुमति देता है, लेकिन मैंने अभी तक को कार्रवाई में नहीं देखा है।

संक्षेप में, यह मानक का हिस्सा है और अगला संस्करण हस्ताक्षरित पूर्णांक की अनुमति देगा।

+0

मैं जीसीसी 4.3 के साथ फंस गया हूं, जो ओपनएमपी 2.5 लागू करता है। मैं अब के लिए अपना 'size_t'' int 'डाल दूंगा। –

7

इसके पीछे एक संभावित कारण है। same article का कहना है कि

  • b, ub, incr पाश अपरिवर्तनीय पर हस्ताक्षर किए पूर्णांक अभिव्यक्ति कर रहे हैं और
  • exit_cond रूप ले लेता है: के बाद से iv <= ub या iv < ub या iv >= ub या iv > ub (जहां iv यात्रा चर रहा है आप के बारे में पूछने)

exit_cond स्थिति में तुलना शामिल है और तुलना हस्ताक्षरित ub परिवर्तनीय लूप चर iv के विरुद्ध की जाती है हस्ताक्षरित/हस्ताक्षरित तुलना के साथ संभावित समस्याओं से बचने के लिए हस्ताक्षर किए जाने हैं।

+1

+1। यह जानना हमेशा अच्छा होता है ** ** ** वे किस तरह से हैं। – pmg

+2

जो सवाल पूछता है कि अन्य अभिव्यक्तियों को 'हस्ताक्षरित' क्यों होना चाहिए। –

+0

एचएम, यह कोई वास्तविक कारण नहीं है। यदि कारण होगा, तो आपको हस्ताक्षर सहित, समान प्रकार के सीमा और काउंटर होना होगा। वह मैं खरीदूंगा। –

1

gcc के बारे में अपने पहले प्रश्न का उत्तर देने के लिए। नहीं है, ऐसा लगता है कि gcc आसानी से

#pragma omp parallel for 
for (size_t i = 0; i < N; ++i) { 
    /* do it */ 
} 

की तरह कुछ में unsigned या size_t पाश चर स्वीकार करता है कम से कम मेरा (जीसीसी v 4.4 एक 64 बिट ubuntu पर) शिकायत नहीं है और सही काम करता है।

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