CUDA सी श्रेष्ठ व्यवहार मार्गदर्शिका संस्करण 5.0, धारा 6.1.2 में, यह लिखा है कि:असीमित स्मृति प्रतिलिपि के लिए पेज-सक्षम मेमोरी का उपयोग करने का प्रभाव?
cudaMemcpy(), अतुल्यकालिक अंतरण संस्करण पिन किए गए मेजबान स्मृति (पिन की गई मेमोरी देखें) की आवश्यकता है, और के साथ इसके विपरीत इसमें अतिरिक्त तर्क, एक स्ट्रीम आईडी शामिल है।
इसका मतलब है कि यदि मैं सरल स्मृति का उपयोग करता हूं तो cudaMemcpyAsync
फ़ंक्शन विफल होना चाहिए।
लेकिन ऐसा नहीं हुआ।
कर्नेल::
__global__ void kernel_increment(float* src, float* dst, int n)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if(tid<n)
dst[tid] = src[tid] + 1.0f;
}
मुख्य:
int main()
{
float *hPtr1, *hPtr2, *dPtr1, *dPtr2;
const int n = 1000;
size_t bytes = n * sizeof(float);
cudaStream_t str1, str2;
hPtr1 = new float[n];
hPtr2 = new float[n];
for(int i=0; i<n; i++)
hPtr1[i] = static_cast<float>(i);
cudaMalloc<float>(&dPtr1,bytes);
cudaMalloc<float>(&dPtr2,bytes);
dim3 block(16);
dim3 grid((n + block.x - 1)/block.x);
cudaStreamCreate(&str1);
cudaStreamCreate(&str2);
cudaMemcpyAsync(dPtr1,hPtr1,bytes,cudaMemcpyHostToDevice,str1);
kernel_increment<<<grid,block,0,str2>>>(dPtr1,dPtr2,n);
cudaMemcpyAsync(hPtr2,dPtr2,bytes,cudaMemcpyDeviceToHost,str1);
printf("Status: %s\n",cudaGetErrorString(cudaGetLastError()));
cudaDeviceSynchronize();
printf("Status: %s\n",cudaGetErrorString(cudaGetLastError()));
cudaStreamDestroy(str1);
cudaStreamDestroy(str2);
cudaFree(dPtr1);
cudaFree(dPtr2);
for(int i=0; i<n; i++)
std::cout<<hPtr2[i]<<std::endl;
delete[] hPtr1;
delete[] hPtr2;
return 0;
}
कार्यक्रम सही उत्पादन दिया
बस परीक्षण के लिए, मैं निम्नलिखित कार्यक्रम की कोशिश की। सरणी सफलतापूर्वक बढ़ी।
cudaMemcpyAsync
पृष्ठ लॉक किए गए मेमोरी के बिना निष्पादित कैसे किया गया? क्या मुझे यहां कुछ याद आ रही है?
@ नोल्वेनलेगेन ... वास्तव में शुरुआत से ही इसकी आवश्यकता है। मैंने इसे पिछले सीयूडीए गाइड में भी पढ़ा है। – sgarizvi
@ नोलवेनलेगुएन: यह बिल्कुल अपेक्षित व्यवहार है, कोई "ब्लैक-बॉक्स सामान" शामिल नहीं है। यदि आपके पास चर्चा में जोड़ने के लिए कुछ भी रचनात्मक नहीं है, तो कृपया इसमें शामिल न होने के लिए स्वतंत्र महसूस करें। – talonmies
फ़ंक्शन के लिए प्रलेखन _This फ़ंक्शन अधिकांश उपयोग मामलों के लिए एसिंक्रोनस व्यवहार प्रदर्शित करता है ._।यदि पेजेबल मेमोरी का उपयोग किया जाता है तो ड्राइवर को स्मृति को एक गैर-पेजेबल बफर में कॉपी करना होगा। यदि स्थानांतरण आकार ड्राइवर के गैर-पेजेबल बफर से अधिक है तो ड्राइवर शेष हस्तांतरण को पूरा करने के लिए गैर-पेजेबल बफर के लिए उपलब्ध होने की प्रतीक्षा करता है। –