2012-11-21 13 views
16

इन तीन कार्यों, विशेष रूप से अंतिम दो के बीच क्या अंतर है? लाइब्रेरी मैनुअल कहता हैcudaStream सिंक्रनाइज़ बनाम CudaDevice सिंक्रनाइज़ बनाम cudaThread सिंक्रनाइज़

ध्यान दें कि यह फ़ंक्शन बहिष्कृत है क्योंकि इसका नाम इसके व्यवहार को प्रतिबिंबित नहीं करता है। इसकी कार्यक्षमता गैर-बहिष्कृत फ़ंक्शन cudaDevice सिंक्रनाइज़() के समान है, जिसका उपयोग के बजाय किया जाना चाहिए।

लेकिन यह सुनिश्चित नहीं है कि इसका क्या अर्थ है।

उत्तर

30

ये सभी अवरोध हैं। बाधाएं बाधा से परे कोड निष्पादन को रोकती हैं जब तक कि कुछ शर्त पूरी नहीं हो जाती।

  1. CPU/मेजबान धागा (कि cudaDeviceSynchronize में जारी किया गया था), जब तक GPU सब पहले से अनुरोध किया CUDA कार्यों (कर्नेल, डेटा प्रतियां, आदि)
  2. आप के रूप में cudaThreadSynchronize() की प्रक्रिया पूरी होने में cudaDeviceSynchronize() हाल्ट निष्पादन ' हमने पाया है, cudaDeviceSynchronize का सिर्फ एक बहिष्कृत संस्करण है। बहिष्कृत सिर्फ इसका मतलब है कि यह अभी भी काम करता है, लेकिन इसकी अनुशंसा की जाती है कि इसका उपयोग न करें (इसके बजाय cudaDevice सिंक्रनाइज़ करें) और भविष्य में, यह असमर्थित हो सकता है। लेकिन cudaThreadSynchronize() और cudaDeviceSynchronize() मूल रूप से समान हैं।
  3. cudaStreamSynchronize() उपर्युक्त दो कार्यों के समान है, लेकिन यह CPU होस्ट थ्रेड में आगे निष्पादन को रोकता है जब तक कि GPU ने पहले से अनुरोध किए गए Cuda कार्यों को संसाधित नहीं किया है जो संदर्भित धारा में जारी किए गए थे। तो cudaStreamSynchronize() एक स्ट्रीम आईडी लेता है क्योंकि यह केवल पैरामीटर है। सीपीयू कोड निष्पादन इस बाधा से परे जारी रहता है जब अन्य धाराओं में जारी cuda कार्य पूरा हो सकता है या नहीं हो सकता है।
संबंधित मुद्दे