मेरे पास CUDA सिंक्रनाइज़ करने के बारे में कोई प्रश्न है। विशेष रूप से, मुझे बयानों में सिंक्रनाइज़ करने के बारे में कुछ स्पष्टीकरण की आवश्यकता है। मेरा मतलब है, अगर मैं ब्लॉक के अंदर धागे के एक अंश द्वारा हिट किए गए एक कथन के दायरे में __syncthreads() डालता हूं, तो क्या होता है? मैंने सोचा कि कुछ थ्रेड "हमेशा के लिए" अन्य थ्रेड के लिए इंतजार करेंगे जो सिंक्रनाइज़िंग पॉइंट को नहीं दबाएंगे। तो, मैं ने लिखा है और निरीक्षण करने के लिए कुछ नमूना कोड निष्पादित:CUDA: __syncthreads() अगर बयान
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
index += gridSize;
}
}
हैरानी की बात है पर्याप्त, मैंने देखा कि उत्पादन एक बहुत "सामान्य" था (64 तत्वों, 32 blocksize):
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
तो मैं संशोधित थोड़ा निम्नलिखित तरीके से मेरी कोड:
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
vett[index] = 3;
__syncthreads();
index += gridSize;
}
}
और उत्पादन किया गया था:
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
फिर से, मैं गलत था: मैंने सोचा था कि वेक्टर के तत्व को संशोधित करने के बाद, अगर कथन के अंदर धागे, प्रतीक्षा स्थिति में बने रहेंगे और कभी भी दायरे से बाहर नहीं निकलेंगे। तो ... क्या आप कृपया यह स्पष्ट कर सकते हैं कि क्या हुआ? क्या एक थ्रेड जो सिंक्रनाइज़िंग पॉइंट के बाद हो जाता है, अवरोध पर प्रतीक्षा करने वाले धागे को अनवरोधित करता है? यदि आपको मेरी स्थिति को पुन: उत्पन्न करने की आवश्यकता है, तो मैंने एसडीके 4.2 के साथ सीयूडीए टूलकिट 5.0 आरसी का इस्तेमाल किया। आपका अग्रिम रूप से बोहोत धन्यवाद।
अपने प्रश्न का उत्तर देने वाले लोगों को चेकमार्क (स्वीकृत उत्तर दें) दें। – Yakk