2012-10-29 17 views
5

पढ़ता है मैं एक बनावट से मूल्यों को पढ़ने की कोशिश करता हूं और उन्हें वापस वैश्विक स्मृति में लिखता हूं। मुझे यकीन है कि लेखन हिस्सा है, काम करता है beause मैं कर्नेल में स्थिर मान डाल सकते हैं और मैं उन्हें उत्पादन में देख सकते हैं हूँ:बाउंड CUDA बनावट शून्य

__global__ void 
bartureKernel(float* g_odata, int width, int height) 
{ 
    unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; 
    unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; 

    if(x < width && y < height) { 
      unsigned int idx = (y*width + x); 
      g_odata[idx] = tex2D(texGrad, (float)x, (float)y).x; 

    } 
} 

बनावट मैं उपयोग करना चाहते हैं दो चैनलों के साथ एक 2 डी नाव बनावट है, इसलिए

texture<float2, 2, cudaReadModeElementType> texGrad; 

और कोड जो कर्नेल कॉल कुछ निरंतर ग़ैर शून्य मान के साथ बनावट initializes:: मैं के रूप में परिभाषित

float* d_data_grad = NULL; 

cudaMalloc((void**) &d_data_grad, gradientSize * sizeof(float)); 
CHECK_CUDA_ERROR; 

texGrad.addressMode[0] = cudaAddressModeClamp; 
texGrad.addressMode[1] = cudaAddressModeClamp; 
texGrad.filterMode = cudaFilterModeLinear; 
texGrad.normalized = false; 

cudaMemset(d_data_grad, 50, gradientSize * sizeof(float)); 
CHECK_CUDA_ERROR; 

cudaBindTexture(NULL, texGrad, d_data_grad, cudaCreateChannelDesc<float2>(), gradientSize * sizeof(float)); 

float* d_data_barture = NULL; 
cudaMalloc((void**) &d_data_barture, outputSize * sizeof(float)); 
CHECK_CUDA_ERROR; 

dim3 dimBlock(8, 8, 1); 
dim3 dimGrid(((width-1)/dimBlock.x)+1, ((height-1)/dimBlock.y)+1, 1); 

bartureKernel<<< dimGrid, dimBlock, 0 >>>(d_data_barture, width, height); 

मुझे पता है, टी की स्थापना सभी "50" के लिए बाइट बाइट फ्लोट के संदर्भ में ज्यादा समझ नहीं लेता है, लेकिन कम से कम मुझे कुछ गैर-शून्य मान पढ़ने के लिए देना चाहिए।

मैं केवल शून्य हालांकि पढ़ सकते हैं ...

+0

शून्य और जेरो के रूप में बाहर आने वाले मूल्यों को आप कैसे और कैसे प्रदर्शित कर रहे हैं? – talonmies

उत्तर

7

आप cudaBindTexture उपयोग कर रहे हैं स्मृति cudaMalloc द्वारा आवंटित करने के लिए अपने बनावट बाध्य करने के लिए। कर्नेल में आप बनावट से मूल्य पढ़ने के लिए tex2D फ़ंक्शन का उपयोग कर रहे हैं। यही कारण है कि यह शून्य पढ़ रहा है।

यदि आप cudaBindTexture का उपयोग कर रैखिक स्मृति में बनावट को बांधते हैं, तो इसे कर्नेल के अंदर tex1Dfetch का उपयोग करके पढ़ा जाता है।

tex2D समारोह cudaBindTextureToArray

का उपयोग करने वालों बनावट या उन बनावट जो cudaArray करने के लिए बाध्य कर रहे हैं जो पिच रैखिक स्मृति (जो cudaMallocPitch द्वारा आवंटित किया जाता है) करने के लिए बाध्य कर रहे हैं समारोह cudaBindTexture2D, का उपयोग करने से केवल पढ़ने के लिए प्रयोग किया जाता है

यहाँ बुनियादी तालिका है, आराम आप प्रोग्रामिंग गाइड से पढ़ सकते हैं:

मेमोरी प्रकार ----------------- अल का उपयोग कर स्थित ----------------- का उपयोग कर बाउंड ----------------------- पढ़ें

रैखिक मेमोरी ................... cudaMalloc .................... .... cudaBindTexture ............................. tex1Dfetch

पिच रैखिक मेमोरी ........ cudaMallocPitch ............. cudaBindTexture2D ........................ tex2D

cudaArray .... ........................ cudaMallocArray ............. cudaBindTextureToArray ............. tex1D या tex2D

3 डी cudaArray ............. ......... cudaMalloc3DArray ........ cudaBindTextureToArray ............. tex3D

+0

धन्यवाद! बस –

2

जोड़ने के लिए, tex1Dfetch का उपयोग करके एक्सेस पूर्णांक अनुक्रमण पर आधारित है। हालांकि, बाकी को फ़्लोटिंग पॉइंट के आधार पर अनुक्रमित किया गया है, और आपको सटीक मूल्य प्राप्त करने के लिए +0.5 जोड़ना होगा।

मुझे उत्सुकता है कि आप फ्लोट 2 बनावट क्यों बनाते हैं? यह संदिग्ध परिणाम दे सकता है। फ्लोट 2 2 डी फ्लोट बनावट नहीं है। इसका उपयोग वास्तव में जटिल संख्या के प्रतिनिधित्व के लिए किया जा सकता है।

typedef struct {float x; float y;} float2; 

मुझे लगता है कि यह ट्यूटोरियल आपको समझने में मदद करेगा कि कैसे cuda में बनावट स्मृति का उपयोग करना है। http://www.drdobbs.com/parallel/cuda-supercomputing-for-the-masses-part/218100902

आपके द्वारा दिखाए गए कर्नेल को बनावट का उपयोग करने से बहुत फायदा नहीं होता है। हालांकि, अगर इलाके का शोषण करके सही ढंग से उपयोग किया जाता है, तो बनावट मेमोरी प्रदर्शन को काफी सुधार कर सकती है। इसके अलावा, यह इंटरपोलेशन के लिए उपयोगी है।

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