2016-07-26 8 views
6

एक कोडबेस में COMPILER_BARRIER मैक्रो __asm__ volatile("" ::: "memory") के रूप में परिभाषित किया गया है। मैक्रो का इरादा संकलक को फिर से ऑर्डर करने से रोकता है और बाधा में लिखता है। ध्यान दें कि यह स्पष्ट रूप से एक कंपाइलर बाधा है, और प्रोसेसर स्तर मेमोरी बाधा नहीं है।`+` __asm__ अस्थिर ("" ::: "स्मृति" के बराबर सी ++ 11 परमाणु एपीआई क्या है `` `

जैसा कि, यह काफी पोर्टेबल है क्योंकि असेंबलर टेम्पलेट में कोई वास्तविक असेंबली निर्देश नहीं हैं, केवल volatile और memory क्लॉबर। इसलिए, जब तक संकलक जीसीसी के विस्तारित एएसएम वाक्यविन्यास का सम्मान करता है, तो इसे ठीक काम करना चाहिए। फिर भी, मैं उत्सुक हूं कि इसे व्यक्त करने का सही तरीका सी ++ 11 परमाणु एपीआई में होगा, यदि संभव हो तो।

निम्नलिखित प्रतीत होता है कि यह सही विचार हो सकता है: atomic_signal_fence(memory_order_acq_rel);

मेरे जा रहा है कि तर्क:

    <atomic> एपीआई के
  • , केवल atomic_signal_fence और atomic_thread_fence संचालित करने के लिए जो के खिलाफ एक स्मृति पते जरूरत नहीं है।
  • atomic_thread_fence मेमोरी ऑर्डरिंग को प्रभावित करता है, जिसे हमें कंपाइलर बाधा की आवश्यकता नहीं होती है।
  • memory विस्तारित एएसएम संस्करण में क्लॉबर पढ़ने और लिखने के बीच अंतर नहीं करता है, इसलिए ऐसा लगता है कि हम दोनों अर्थशास्त्र प्राप्त करना और रिलीज करना चाहते हैं, इसलिए memory_order_acq_rel न्यूनतम रूप से आवश्यक है।
  • memory_order_seq_cst अनावश्यक लगता है, क्योंकि हमें धागे के कुल क्रम की आवश्यकता नहीं है - हम केवल वर्तमान धागे के भीतर अनुक्रम अनुक्रम में रूचि रखते हैं।

यह __asm__ volatile("" ::: "memory") पूरी तरह portably सी ++ 11 एटोमिक्स एपीआई के साथ के बराबर व्यक्त करने के लिए संभव है? यदि हां, तो atomic_signal_fence उपयोग करने के लिए सही API है? यदि हां, तो मेमोरी ऑर्डर तर्क क्या उचित/आवश्यक है?

या, क्या मैं यहां खरपतवार में हूं और इस तक पहुंचने का एक बेहतर तरीका है?

+1

'atomic_signal_fence' केवल थ्रेड के बीच ऑर्डर करने की गारंटी देता है और उसी थ्रेड में सिग्नल हैंडलर चल रहा है। इसी तरह 'atomic_thread_fence' केवल धागे के बीच क्रम पर लागू होता है। यदि आप दो अन्य संदर्भों के बीच आदेश की गारंटी देने की कोशिश कर रहे हैं तो न तो पोर्टेबल है। उदाहरण के लिए विंडोज 'atomic_signal_fence' पर कुछ भी करने की आवश्यकता नहीं है क्योंकि विंडोज एसिंक्रोनस सिग्नल का समर्थन नहीं करता है। –

+0

@RossRidge - मुझे atomic_signal_fence का उपयोग करने के बारे में थोड़ा अजीब लगा, क्योंकि, जैसा कि आप इंगित करते हैं, यहां कोई सिग्नल नहीं है। लेकिन यह एकमात्र चीज थी जो उपरोक्त मेरी रूपरेखा के अनुसार "काम" करती थी। मुझे मानक में कोई भी भाषा नहीं दिखाई दे रही थी, हालांकि कार्यान्वयन में एसिंक सिग्नल नहीं होने पर कॉल पर atomic_signal_fence को कॉल करने की अनुमति होगी। यह सी ++ 14 मानक के 28.9.7 में राज्य करता है कि "कंपाइलर ऑप्टिमाइज़ेशन और लोड और स्टोर्स की पुनरीक्षण उसी तरह से अवरुद्ध होती है जैसे कि atomic_thread_fence, लेकिन हार्डवेयर बाड़ निर्देश ... उत्सर्जित नहीं होते हैं।" – acm

+0

यह एक सूचनात्मक (गैर-मानक) नोट है, यह कार्यान्वयन पर बाधा नहीं डालता है। मानक ऐसी कोई भी भाषा प्रदान नहीं करता है जो आपको "परमाणु_थ्रेड_फेंस (ऑर्डर) के समतुल्य" पर निर्भर करता है, सिवाय इसके कि परिणामस्वरूप ऑर्डरिंग बाधाएं केवल थ्रेड के बीच स्थापित होती हैं और एक ही थ्रेड में निष्पादित सिग्नल हैंडलर " । ध्यान दें कि 'atomic_thread_fence' को मानक द्वारा परिभाषित अनुसार परमाणु वस्तुओं पर परमाणु संचालन के संदर्भ में परिभाषित किया गया है। तो यदि आप 'std :: परमाणु प्रकारों का उपयोग नहीं कर रहे हैं तो न तो कार्य करने के लिए कार्य की गारंटी है। –

उत्तर

3

__asm__ volatile("" ::: "memory") एक पूर्ण संकलक बाधा भी नहीं है; यह केवल वस्तुओं/वस्तुओं को लोड करने के लिए मजबूर करता है जिनके पते एएसएम ब्लॉक के लिए संभावित रूप से सुलभ हैं, जिसमें स्थानीय चर शामिल नहीं होंगे जिसके लिए संकलक ट्रैक कर सकता है कि पता रिसाव नहीं करता है। उदाहरण के लिए, memset(password, 0, len);__asm__ volatile("" ::: "memory");password[] द्वारा उपयोग की जाने वाली मेमोरी को वास्तव में शून्य करने में असफल हो सकता है।

इस तरह के ऑब्जेक्ट्स के पते को एएसएम ब्लॉक में इनपुट के रूप में पारित किया जा सकता है, लेकिन मुझे atomic_signal_fence के साथ कोई सही समतुल्य नहीं दिखता है। संभवतः आप संभवतः ऑब्जेक्ट का पता बाहरी-लिंक volatile पॉइंटर ऑब्जेक्ट में ऑब्जेक्ट का पता संग्रहीत कर रहे हैं (पॉइंटर बनाने के लिए सावधान रहें, न कि टाइप-टू-टाइप, volatile -क्वॉलीफाइड) और फिर atomic_signal_fence को यह मानना ​​होगा सिग्नल हैंडलर से पहुंचा जा सकता है।

+0

यह एक बहुत ही उपयोगी अवलोकन है। यह मुझे आश्चर्यचकित करता है कि मैक्रो वास्तव में क्या इरादा करता है! – acm

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