मेरे पास एक CUDA कर्नेल है जिसे मैं कई GPU में चलाना चाहता हूं। प्रत्येक GPU पर, यह एक खोज कार्य कर रहा है, इसलिए मैं इसे प्रत्येक GPU पर लॉन्च करना चाहता हूं और फिर होस्ट कोड में कोई भी GPU के वापस आने तक प्रतीक्षा करना चाहता हूं (यह दर्शाता है कि यह वही मिला जो वह देख रहा था के लिये)।

मुझे cudaDeviceSynchronize() के बारे में पता है, लेकिन वह वर्तमान GPU के समाप्त होने तक ब्लॉक करता है। क्या ऐसा कुछ है जो मुझे तब तक ब्लॉक करने देगा जब तक कि एन अलग-अलग जीपीयू में से कोई एक खत्म न हो जाए?

1
Brendan Dolan-Gavitt 24 नवम्बर 2020, 04:40

1 उत्तर

सबसे बढ़िया उत्तर

CUDA इसे सीधे पूरा करने के लिए कोई अंतर्निहित कार्य प्रदान नहीं करता है।

मेरा मानना ​​है कि आपको मतदान के माध्यम से कुछ करने की आवश्यकता होगी, और फिर यदि आप परिणामों का सर्वेक्षण करना चाहते हैं, तो आप कर सकते हैं। यदि आप कुछ ऐसा बनाना चाहते हैं जो सीपीयू थ्रेड को ब्लॉक करे, तो मुझे लगता है कि पोलिंग ऑपरेशन पर एक स्पिन ऐसा करेगा। (cudaDeviceSynchronize() डिफ़ॉल्ट रूप से हुड के नीचे एक स्पिन ऑपरेशन है)

आप विभिन्न विचारों का उपयोग करके एक मतदान प्रणाली बना सकते हैं:

  • cudaEvent - प्रत्येक कर्नेल लॉन्च के बाद एक ईवेंट लॉन्च करें, फिर मतदान के लिए cudaEventQuery() संचालन का उपयोग करें
  • cudaHostAlloc - होस्ट-पिन की गई मेमोरी का उपयोग करें जिसे प्रत्येक कर्नेल स्थिति के साथ अपडेट कर सकता है - मेमोरी को सीधे पढ़ें
  • cudaLaunchHostFunc - प्रत्येक कर्नेल लॉन्च के बाद कॉलबैक रखें। कॉलबैक होस्ट फ़ंक्शन सामान्य होस्ट मेमोरी को अपडेट करेगा, जिसे आप स्थिति के लिए मतदान कर सकते हैं।

कॉलबैक विधि (कम से कम) आपको (शायद परमाणु के माध्यम से) एक स्मृति स्थान पर मतदान को ध्वस्त करने की अनुमति देगी, अगर यह किसी कारण से महत्वपूर्ण थी। आप शायद सिस्टम के लिए होस्ट-पिन की गई मेमोरी विधि का उपयोग करके कुछ इसी तरह लागू कर सकते हैं जिनके पास CUDA सिस्टम परमाणु समर्थन है।

2
Robert Crovella 24 नवम्बर 2020, 01:56