2012-07-02 19 views
32

क्लैंग और जी ++ सी ++ 11 कार्यान्वयन स्थिति को देखते हुए मैंने कुछ अजीब देखा:
वे सी ++ 11 परमाणुओं का समर्थन करते हैं, लेकिन वे सी ++ 11 मेमोरी मॉडल का समर्थन नहीं करते हैं।
मैं इस धारणा के तहत था कि आपके पास परमाणुओं का उपयोग करने के लिए सी ++ 11 मेमोरी मॉडल होना चाहिए। तो परमाणु और स्मृति मॉडल के समर्थन के बीच क्या अंतर है?
क्या मेमोरी मॉडल समर्थन की कमी का मतलब है कि std::atomic<T> का उपयोग करने वाले कानूनी सी ++ 11 प्रोग्राम संगत नहीं हैं?सी ++ कंपाइलर्स सी ++ 11 परमाणु का समर्थन कैसे कर सकते हैं, लेकिन सी ++ 11 मेमोरी मॉडल का समर्थन नहीं करते

संदर्भ:
http://clang.llvm.org/cxx_status.html
http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

+0

परमाणुता स्मृति दृश्यता और मेमोरी ऑर्डरिंग के साथ मेमोरी मॉडल की (तीन?) गुणों में से एक है। परमाणुता स्मृति मॉडल का 'पर्याय' नहीं है। – mloskot

उत्तर

15

मुद्दों में से एक मुद्दा "स्मृति स्थान" की परिभाषा है, जो अलग-अलग ताले से अलग संरचना सदस्यों को लॉक करने की अनुमति देता है (और संकलक को समर्थन देता है)। discussion about a RL problem caused by this है।(यह करता है और जाहिरा तौर पर, रिपोर्ट से पहचानने,)

struct x { 
    long a; 
    unsigned int b1; 
    unsigned int b2:1; 
}; 

संकलक b1 भी ओवरराइट करके b2 के लिए लिख लागू करने के लिए नि: शुल्क है:

असल मुद्दा यह है कि हो रही है एक struct इस तरह परिभाषित किया गया है। इसलिए, दोनों क्षेत्रों को एक के रूप में बंद करना होगा। हालांकि, सी ++ 11 मेमोरी मॉडल के परिणामस्वरूप, यह प्रतिबंधित है (ठीक है, वास्तव में वर्जित नहीं है, लेकिन कंपाइलर को b1 और b2 पर एक साथ अपडेट सुनिश्चित करना चाहिए, यह हस्तक्षेप न करें; यह इसे लॉकिंग या सीएएस-आईएनजी द्वारा कर सकता है इस तरह के अद्यतन, अच्छी तरह से, कुछ वास्तुकला पर जीवन मुश्किल है)।

मैं हमारे जीसीसी लोगों के साथ मुद्दा उठाया है और वे मुझे उस से कहा:: रिपोर्ट से हवाला देते हुए 'सी ऐसी गारंटी प्रदान नहीं करता है, और न ही आप मज़बूती से अलग ताले अगर साथ विभिन्न संरचना क्षेत्रों लॉक कर सकते हैं वे शब्द-आकार मेमोरी क्षेत्रों को स्वाभाविक रूप से गठबंधन करते हैं। सी ++ 11 मेमोरी मॉडल इसकी गारंटी देगा, लेकिन यह लागू नहीं हुआ है और न ही आप कर्नेल को सी ++ 11 कंपाइलर के साथ बनाते हैं। "

अच्छी जानकारी wiki में भी मिल सकती है।

+0

मेरे लिए तकनीकी है, लेकिन यह अच्छी जानकारी है: कारण हम C11/C++ 11 मेमोरी मॉडल का उल्लेख करते हैं क्योंकि हम का समर्थन करने की योजना बनाते हैं, संभवतः जीसीसी 4.8 के लिए, जब कुछ विकल्पों द्वारा अनुरोध किया जाता है (या तो डिफ़ॉल्ट चुनते समय उन मानकों ?, या जब स्पष्ट रूप से अनुरोध किया)।यह कुछ ऑप्टिमाइज़ेशन को अक्षम भी करेगा जो एकल-थ्रेडेड ऐप्स, के लिए ठीक हैं, लेकिन उन मेमोरी मॉडल में ठीक नहीं हैं, ओपनएमपी में ठीक नहीं हैं या कई अन्य थ्रेडेड प्रोग्राम्स के लिए ठीक नहीं हैं। जैसे लूप स्टोर गति अगर वैरिएबल की गारंटी नहीं है तो हमेशा लूप में संग्रहीत किया जाता है: – NoSenseEtAl

+0

int x; शून्य foo (int j) { int i; (i = 0; i <100000; i ++) यदि (i> j) x = i; } निष्पादित नहीं किया जा सकता है, क्योंकि अन्यथा यह एक tmp = x प्रस्तुत करता है; ... एक्स = टीएमपी; कोड में जो अन्यथा चर को स्पर्श नहीं करेगा, इसलिए यदि कुछ ... अन्य धागा x को संशोधित करता है, तो यह अप्रत्याशित मूल्य हो सकता है। \t Jakub – NoSenseEtAl

+0

कूल संपादित करें (लिंक बहुत बढ़िया है, अक्सर मुझे आश्चर्य है कि पीपीएल जहां जादू चीजें (कंपाइलर्स) बनाते हैं) रहते हैं और वे जानकारी साझा करने के बारे में इतने शर्मिंदा क्यों हैं। :) तथ्य यह है कि अधिकांश समय की जानकारी वहां है, लेकिन आसानी से googlable नहीं :) – NoSenseEtAl

0

यह इतना है कि वे स्मृति मॉडल का समर्थन नहीं करते नहीं है, लेकिन है कि वे नहीं है (अभी तक) स्मृति के साथ बातचीत के लिए मानक में एपीआई का समर्थन आदर्श। उस एपीआई में कई म्यूटेक्स शामिल हैं।

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

+1

वह उत्तर वास्तव में असंतोषजनक है; प्रश्न में जुड़े विशेषताओं की सूची * विशेष रूप से * मेमोरी मॉडल (और इसके प्रस्ताव) के बारे में वार्ता, कोई एपीआई, लाइब्रेरी, म्यूटेक्स और व्हाट्नॉट नहीं। इसके अलावा, पुस्तकालय में कम से कम gcc 4.7 * करता है * mutexes है। "औपचारिक मानक के बिना जितना संभव हो उतना थ्रेड के रूप में बात करें" बस बुलशिट है; इसका मतलब कुछ भी नहीं है। थ्रेड जागरूक आपको कंपाइलर के बारे में कुछ भी नहीं बताता है और "परमाणु संचालन के गलत पक्ष में चीजों को स्थानांतरित करने" के मुकाबले निश्चित रूप से इसके लिए कुछ भी है। – jpalecek

+1

@jpalecek जबकि मैं मानता हूं कि उत्तर इतना महान नहीं है कि बीएस कहने की कोई आवश्यकता नहीं है। :) और हाँ mutexes कम से कम 4.6 से g ++ में हैं, हालांकि अगर मुझे सही ढंग से atomic_thread_fence याद नहीं है। :) अब जांचें, (वीएस एटीएम पर आईएम)। – NoSenseEtAl

+0

@NoSenseEtAl: atomic_thread_fence gcc-4.7 में है। मैंने अस्पष्ट विपणन वाक्यांशों को संदर्भित करने के लिए बीएस शब्द का प्रयोग किया, जैसे "मूल समर्थन ...", जो महत्वपूर्ण प्रतीत होता है, लेकिन थोड़ी सी सोच के बाद, उनका कोई मतलब नहीं है। – jpalecek

11

मुझे लगता है कि इन मामलों में "मेमोरी मॉडल की कमी" का मतलब है कि ऑप्टिमाइज़र सी ++ 11 मेमोरी मॉडल प्रकाशित होने से पहले लिखे गए थे, और अब अमान्य अनुकूलन कर सकते हैं। मेमोरी मॉडल के खिलाफ ऑप्टिमाइज़ेशन को सत्यापित करना बहुत मुश्किल और समय लेने वाला है, इसलिए यह कोई आश्चर्य की बात नहीं है कि क्लैंग/जीसीसी टीमों ने अभी तक इसे समाप्त नहीं किया है।

क्या स्मृति मॉडल समर्थन की कमी का मतलब है कि कानूनी सी ++ 11 प्रोग्राम जो std :: atomic का उपयोग करते हैं, लगातार नहीं हैं?

हाँ, यह एक संभावना है। यह और भी बदतर है: संकलक डेटा रेस (सी ++ 11 मानक के अनुसार) रेस-फ्री प्रोग्राम, उदाहरण के लिए पेश कर सकता है सट्टा लिखने के द्वारा।

उदाहरण के लिए, कई सी ++ इस अनुकूलन प्रदर्शन किया compilers:

register int r1 = count; 
for (p = q; p = p -> next; ++p) { 
    if (p -> data > 0) ++r1; 
} 
count = r1; 

सभी p->data गैर नकारात्मक हैं, तो मूल स्रोत कोड नहीं लिखा था:

for (p = q; p = p -> next; ++p) { 
    if (p -> data > 0) ++count; 
} 

में अनुकूलित मिल सकता है count पर, लेकिन अनुकूलित कोड करता है। यह अन्यथा रेस-फ्री प्रोग्राम में डेटा रेस पेश कर सकता है, इसलिए सी ++ 11 विनिर्देश इस तरह के अनुकूलन को अस्वीकार करता है। मौजूदा कंप्यूटर्स को अब सभी अनुकूलन को सत्यापित करना है (और यदि आवश्यक हो तो समायोजित करें)।

विवरण के लिए Concurrency memory model compiler consequences देखें।

+0

आप जानते हैं कि मजाकिया क्या है? एमएस वीसी ++ 11 के लिए कहता है: मेमोरी मॉडल: N2429 कोर भाषा को मल्टीथ्रेडिंग के अस्तित्व को पहचानता है, लेकिन ऐसा करने के लिए एक कंपाइलर कार्यान्वयन के लिए कुछ भी नहीं प्रतीत होता है (कम से कम, जो पहले से ही मल्टीथ्रेडिंग का समर्थन करता है)। तो यह तालिका में एन/ए है। – NoSenseEtAl

+0

@NoSenseEtAl: यह संपूर्ण स्मृति मॉडल का केवल एक बहुत ही विशिष्ट हिस्सा है। एक ही तालिका में "डेटा-निर्भरता ऑर्डरिंग" (एन 2664) भी है जिसके लिए काम की आवश्यकता होती है। आमतौर पर, हम उस सी ++ 11 मेमोरी मॉडल के हिस्से के रूप में भी गिनेंगे। – MSalters

+0

ठीक है .. तो वे आलसी हैं। बिल्कुल यही मैने सोचा। –