में 2 डी साझा मेमोरी की व्यवस्था कैसे की जाती है मैंने हमेशा रैखिक साझा मेमोरी (लोड, स्टोर, पड़ोसियों तक पहुंच) के साथ काम किया है, लेकिन मैंने बैंक संघर्षों का अध्ययन करने के लिए 2 डी में एक सरल परीक्षण किया है जिसके परिणामस्वरूप मुझे भ्रमित कर दिया गया है।सीयूडीए
अगला कोड एक आयामी वैश्विक मेमोरी सरणी से साझा स्मृति में डेटा पढ़ता है और इसे साझा स्मृति से वैश्विक स्मृति में कॉपी करता है।
__global__ void update(int* gIn, int* gOut, int w) {
// shared memory space
__shared__ int shData[16][16];
// map from threadIdx/BlockIdx to data position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
// calculate the global id into the one dimensional array
int gid = x + y * w;
// load shared memory
shData[threadIdx.x][threadIdx.y] = gIn[gid];
// synchronize threads not really needed but keep it for convenience
__syncthreads();
// write data back to global memory
gOut[gid] = shData[threadIdx.x][threadIdx.y];
}
दृश्य प्रोफाइलर साझा स्मृति में संघर्ष की सूचना दी। अगले कोड से बचने के thouse संघर्ष (केवल अंतर दिखाने)
// load shared memory
shData[threadIdx.y][threadIdx.x] = gIn[gid];
// write data back to global memory
gOut[gid] = shData[threadIdx.y][threadIdx.x];
यह व्यवहार मुझे क्योंकि प्रोग्रामिंग व्यापक समानांतर प्रोसेसर में उलझन में है। एक हाथ से दृष्टिकोण हम पढ़ सकते हैं:
सी और सीयूडीए में मैट्रिक्स तत्व पंक्ति प्रमुख सम्मेलन के अनुसार रैखिक रूप से संबोधित स्थानों में रखा गया है। यही है, मैट्रिक्स की पंक्ति 0 के तत्वों को पहले लगातार स्थानों में क्रमशः रखा जाता है।
क्या यह साझा स्मृति व्यवस्था से संबंधित है? या धागे इंडेक्स के साथ? शायद मैं कुछ याद कर रहा हूँ?
गिरी विन्यास इस प्रकार है:
// kernel configuration
dim3 dimBlock = dim3 (16, 16, 1);
dim3 dimGrid = dim3 (64, 64);
// Launching a grid of 64x64 blocks with 16x16 threads -> 1048576 threads
update<<<dimGrid, dimBlock>>>(d_input, d_output, 1024);
अग्रिम धन्यवाद।
क्या आप ब्लॉक आयाम जोड़ रहे हैं जो आप उपयोग कर रहे हैं। मुझे लगता है कि यह (16,16,1) है, लेकिन जवाब देने से पहले यह पुष्टि करना अच्छा होता है। – talonmies
@talonmies मैंने प्रश्न में कर्नेल कॉन्फ़िगरेशन/लॉन्च जोड़ा। जैसा कि आपने टिप्पणी की है कि मैं एक (16, 16, 1) ब्लॉक का उपयोग कर रहा हूं – pQB