2012-11-02 16 views
6

1 डी सरणी का उपयोग होने पर मुझे गतिशील आवंटन के बारे में पता है, लेकिन 2 डी सरणी का उपयोग कब किया जा सकता है?जीपीयू 2 डी साझा स्मृति गतिशील आवंटन

__shared__ float sData[32][32]; 

कैसे यह गतिशील किया जा सकता है:

myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
     .... 

__global__ void myKernerl(){ 
__shared__ float sData[][]; 
    ..... 
} 

मैं एक 2 डी साझा स्मृति सरणी आवंटित करना चाहते हैं? होगा:

myKernel<<< blocks, threads, sizeof(float)*32*32 >>>(); 
+7

आपकी स्थाई रूप से घोषित "2 डी साझा मेमोरी सरणी" दो आयामी नहीं है, यह केवल रैखिक स्मृति है और संकलक पंक्ति-प्रमुख ऑर्डर पहुंच उत्पन्न करता है। बहुआयामी सरणी के बारे में आपके अनगिनत प्रश्नों के आधार पर, शायद कुछ संदर्भ सामग्री के साथ बैठने का समय है और सी ++ में एरे कैसे काम करते हैं, इस बारे में जानें .. – talonmies

उत्तर

4

आप सही तरीके से लिखा है के रूप में (<<<blocks, threads, sizeofSharedMemoryinBytes>>> में) आप प्रत्येक गिरी निष्पादन के विन्यास में कॉल करने से पहले गतिशील आवंटित साझा स्मृति के आकार निर्दिष्ट करना होगा। यह साझा स्मृति में बाइट्स की संख्या निर्दिष्ट करता है कि स्थिर रूप से आवंटित स्मृति के अतिरिक्त इस कॉल के लिए प्रति ब्लॉक गतिशील रूप से आवंटित किया गया है। IMHO को 2 डी सरणी जैसी स्मृति को एक्सेस करने का कोई तरीका नहीं है, आपको 1 डी सरणी का उपयोग करना होगा और इसे 2 डी की तरह उपयोग करना होगा। आखिरी सोचो, क्वालीफायर extern मत भूलना। तो आपका कोड इस तरह दिखना चाहिए:

sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float); 

    myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
    .... 

    __global__ void myKernerl() { 

     extern __shared__ float sData[]; 
     ..... 
     sData[dimX * y + x] = ... 
    } 
+0

यह भी मुझे लगता है। – Ono

संबंधित मुद्दे