2011-03-08 14 views
15

मैं कई फोरम और एनवीडिया मैनुअल के माध्यम से चला गया लेकिन मुझे समझ में नहीं आया कि __threadfence() और इसका उपयोग क्या है?CUDA __threadfence()

धन्यवाद।

उत्तर

40

आम तौर पर, कोई गारंटी नहीं है कि यदि एक ब्लॉक वैश्विक स्मृति में कुछ लिखता है, तो दूसरा ब्लॉक इसे "देख" देगा। ग्लोबल मेमोरी को लिखने के आदेश के बारे में कोई गारंटी नहीं है, जिसमें जारी किए गए ब्लॉक के अपवाद के साथ।

दो अपवाद भी हैं:

  • परमाणु संचालन - उन हमेशा अन्य ब्लॉक से
  • threadfence

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

__threadfence फ़ंक्शन वर्तमान थ्रेड स्टाल करता है जब तक कि वैश्विक मेमोरी को लिखने के लिए ग्रिड में अन्य सभी धागे द्वारा दिखाई देने की गारंटी नहीं दी जाती है। तो, अगर आप की तरह कुछ करना:

  • __threadfence()
  • atomically एक झंडा
  • यह गारंटी है कि अगर अन्य ब्लॉक झंडा देखता है, यह भी देखेंगे निशान

    1. दुकान अपने डेटा आँकड़े।

      अतिरिक्त पठन: CUDA प्रोग्रामिंग गाइड, अध्याय B.2.4 और B.5

    +0

    कैसे __syncthreads(), कि गारंटी नहीं है कि स्मृति ब्लॉक में किसी भी धागा द्वारा पहुँचता ब्लॉक में सभी धागे को दिखाई देगी, करता है के बारे में? –

    +2

    '__syncthreads()' '__threadfence_block()' से अधिक मजबूत है। '__syncthreads() 'के बाद आपके पास गारंटी है कि बाधा के बाद सभी थ्रेड द्वारा बाधा दिखाई देने से पहले सभी साझा/वैश्विक मेमोरी लिखती हैं। हालांकि, '__syncthreads()' का केवल ब्लॉक पर प्रभाव पड़ता है और विभिन्न ब्लॉक के धागे के बीच कोई गारंटी नहीं दी जाती है। अन्य एसएम से – CygnusX1

    +0

    एल 1 संग्रहीत डेटा के साथ सुसंगत होगा? या क्या आपको अभी भी वैश्विक स्कोप लोड (एल 1-गैर-कैशबल) निर्दिष्ट करने की आवश्यकता है? – maxbc