__global__ void add(int *c, const int* a, const int* b)
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
c[offset] = a[offset] + b[offset];
}
उपरोक्त उदाहरण में, मुझे लगता है कि x
, y
, offset
रजिस्टरों में जबकिसीयूडीए में किस प्रकार के चर रजिस्ट्रार का उपभोग करते हैं?
NVCC -Xptxas -v देता
4 registers, 24+16 bytes smem
प्रोफाइलर शो 4 रजिस्टरों
सहेजे जाते हैंऔर सिर PTX फ़ाइल:
.reg .u16 %rh<4>; .reg .u32 %r<9>; .reg .u64 %rd<10>; .loc 15 21 0 $LDWbegin__Z3addPiPKiS1_: .loc 15 26 0
किसी रजिस्टरों का उपयोग स्पष्ट कर सकता हूँ? फर्मि में, प्रत्येक धागे के लिए रजिस्टरों की अधिकतम संख्या 63 है। मेरे प्रोग्राम में मैं इस मामले का परीक्षण करना चाहता हूं जब एक कर्नेल बहुत सारे रजिस्टरों का उपभोग करता है (इसलिए वैरिएबल को स्वचालित रूप से स्थानीय मेमोरी में संग्रहीत किया जाना चाहिए और इस प्रकार प्रदर्शन में कमी आती है)। फिर इस बिंदु पर मैं एक कर्नेल को दो में विभाजित कर सकता हूं ताकि प्रत्येक धागे में पर्याप्त रजिस्ट्रार हो। मान लें कि एसएम संसाधन समवर्ती कर्नेल के लिए पर्याप्त हैं।
मुझे यकीन नहीं है कि मैं सही हूं या नहीं।
क्या आपका प्रश्न है "यह कोड 3 के बजाय 4 रजिस्टरों का उपयोग क्यों करता है?" यदि ऐसा है, तो जवाब यह है: 'एक [ऑफ़सेट]' और 'बी [ऑफ़सेट] 'जोड़ने के लिए, उन दोनों मानों को प्राप्त किया जाना चाहिए। इसे किसी अन्य को लाने के दौरान इसे पहले से कहीं भी लाया जाना चाहिए। तो एक और रजिस्टर की जरूरत है। –
आपके उत्तर के लिए धन्यवाद, तो क्या हम कह सकते हैं कि मध्यवर्ती चर रजिस्टरों में सहेजे जाएंगे? – user1525320
जब आवश्यक हो, हाँ। यह जरूरी नहीं है कि यह कब आवश्यक हो और यह हार्डवेयर लक्ष्य के आधार पर भी भिन्न हो सकता है। –