2012-02-22 15 views
5

मैंने एक साधारण बनावट 3 डी परीक्षण किया है और डिवाइस पर डेटा कॉपी करते समय एक अजीब व्यवहार पाया है। फ़ंक्शन cudaMemcpy3D एक 'अमान्य तर्क' लौटाता है।बाइट्स में चौड़ाई का उपयोग कर cudaMemcpy3D में अमान्य तर्क?

मुझे पता चला कि समस्या cudaExtent से संबंधित है। CUDA टूलकिट संदर्भ मैनुअल 4.0 के अनुसार, cudaExtent पैरामीटर निम्न हैं: - बाइट में चौड़ाई

  • h - तत्वों में ऊंचाई
  • घ -

    • डब्ल्यू तत्वों में गहराई

    इसलिए, मैंने बनावट को निम्नानुसार तैयार किया:

    // prepare texture 
    cudaChannelFormatDesc t_desc = cudaCreateChannelDesc<baseType>(); 
    // CUDA extent parameters w - Width in bytes, h - Height in elements, d - Depth in elements 
    cudaExtent t_extent = make_cudaExtent(NCOLS*sizeof(baseType), NROWS, DEPTH); 
    // CUDA arrays are opaque memory layouts optimized for texture fetching 
    cudaArray *i_ArrayPtr = NULL; 
    // allocate 3D 
    status = cudaMalloc3DArray(&i_ArrayPtr, &t_desc, t_extent); 
    

    और कॉन्फ़िगर किया गया इस प्रकार 3 डी पैरामीटर:

    // prepare input data 
    cudaMemcpy3DParms i_3DParms = { 0 }; 
    i_3DParms.srcPtr = make_cudaPitchedPtr((void*)h_idata, NCOLS*sizeof(baseType), NCOLS, NROWS); 
    i_3DParms.dstArray = i_ArrayPtr; 
    i_3DParms.extent = t_extent; 
    i_3DParms.kind  = cudaMemcpyHostToDevice; 
    

    और अंत में डिवाइस स्मृति के लिए डेटा की प्रतिलिपि:

    // copy input data from host to device 
    status = cudaMemcpy3D(&i_3DParms); 
    

    अगर मैं केवल एक्स आयाम में तत्व की संख्या निर्दिष्ट समस्या हल हो जाता है के रूप में:

    cudaExtent t_extent = make_cudaExtent(NCOLS, NROWS, DEPTH); 
    

    जो किसी भी ई का उत्पादन नहीं करता और अपेक्षित परीक्षण कार्य।

    मुझे आश्चर्य है कि अगर मुझे cudaExtent फ़ंक्शन या कुछ और चीज़ याद आती है। बाइट्स में व्यक्त करने के लिए चौड़ाई पैरामीटर की आवश्यकता क्यों नहीं है?

  • उत्तर

    6

    सीयूडीए सरणी के लिए, सीमा सरणी तत्वों में दी गई चौड़ाई के साथ निर्दिष्ट है। रैखिक स्मृति आवंटित करने के लिए, सीमा बाइट्स में दी गई चौड़ाई के साथ निर्दिष्ट है। चूंकि आप cudaMalloc3DArray के साथ सरणी आवंटित कर रहे हैं, तत्वों में चौड़ाई का उपयोग करें। यदि आप cudaMalloc3D का उपयोग कर रहे थे, तो सीमा में बाइट्स की चौड़ाई होगी।

    +0

    यह निष्कर्ष है कि मैं आ रहा हूं। संदर्भ मैनुअल में दस्तावेज है, या आपकी विशेषज्ञता के आधार पर? – pQB

    +1

    इसे एपीआई संदर्भ में दस्तावेज किया गया है, लेकिन हो सकता है कि आपने देखा न हो। 'CudaMalloc3Darray' पृष्ठ पर "3 डी सरणी के लिए, वैध सीमा सीमाएं हैं {(1, maxTexture3D [0]), (1, maxTexture3D [1]), (1, maxTexture3D [2])}"। 'Make_cudaExtent' दस्तावेज थोड़ा अस्पष्ट है क्योंकि यह केवल 3 डी रैखिक मामले पर लागू होने पर तर्कों को दस्तावेज करता है, न कि 3 डी सरणी मामले में। – talonmies

    +0

    स्पष्टीकरण के लिए धन्यवाद। – pQB

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