संक्षिप्त उत्तर है, आप नहीं कर सकते हैं। cudaMallocPitch()
फ़ंक्शन वास्तव में इसका नाम बताता है, यह पिक्चर रैखिक मेमोरी आवंटित करता है, जहां पिच को GPU मेमोरी कंट्रोलर और बनावट हार्डवेयर के लिए इष्टतम होने के लिए चुना जाता है।
हैं आप कर्नेल में संकेत के एरे उपयोग करना चाहता था, कर्नेल कोड इस तरह देखना होगा:
__global___ void add(int *dev_a[] ,int *dev_b[], int* dec_c[])
{
for i=0;i<2;i++) {
for j=0;j<2;j++) {
dev_c[i][j]=dev_a[i][j]+dev_b[i][j];
}
}
}
और फिर आप मेजबान पक्ष पर नेस्ट cudaMalloc
कॉल की जरूरत है निर्माण करने के लिए होगा पॉइंटर्स की सरणी और इसे डिवाइस मेमोरी में कॉपी करें। अपने नहीं बल्कि तुच्छ 2x2 उदाहरण के लिए, कोड आवंटित करने के लिए एक सारिणी इस प्रकार दिखाई देगा:
int ** h_a = (int **)malloc(2 * sizeof(int *));
cudaMalloc((void**)&h_a[0], 2*sizeof(int));
cudaMalloc((void**)&h_a[1], 2*sizeof(int));
int **d_a;
cudaMalloc((void ***)&d_a, 2 * sizeof(int *));
cudaMemcpy(d_a, h_a, 2*sizeof(int *), cudaMemcpyHostToDevice);
कौन सा d_a में संकेत के आवंटित डिवाइस सरणी छोड़ना होगा, और आप अपने कर्नेल में है कि पास चला जाएगा।
कोड जटिलता और प्रदर्शन कारणों के लिए, आप वास्तव में ऐसा नहीं करना चाहते हैं, सीयूडीए कोड में पॉइंटर्स के सरणी का उपयोग करके कठोर और रैखिक स्मृति का उपयोग करके वैकल्पिक से धीमा है।
#include <cstdio>
__global__ void add(int * dev_a[], int * dev_b[], int * dev_c[])
{
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
dev_c[i][j]=dev_a[i][j]+dev_b[i][j];
}
}
}
inline void GPUassert(cudaError_t code, char * file, int line, bool Abort=true)
{
if (code != 0) {
fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code),file,line);
if (Abort) exit(code);
}
}
#define GPUerrchk(ans) { GPUassert((ans), __FILE__, __LINE__); }
int main(void)
{
const int aa[2][2]={{1,2},{3,4}};
const int bb[2][2]={{5,6},{7,8}};
int cc[2][2];
int ** h_a = (int **)malloc(2 * sizeof(int *));
for(int i=0; i<2;i++){
GPUerrchk(cudaMalloc((void**)&h_a[i], 2*sizeof(int)));
GPUerrchk(cudaMemcpy(h_a[i], &aa[i][0], 2*sizeof(int), cudaMemcpyHostToDevice));
}
int **d_a;
GPUerrchk(cudaMalloc((void ***)&d_a, 2 * sizeof(int *)));
GPUerrchk(cudaMemcpy(d_a, h_a, 2*sizeof(int *), cudaMemcpyHostToDevice));
int ** h_b = (int **)malloc(2 * sizeof(int *));
for(int i=0; i<2;i++){
GPUerrchk(cudaMalloc((void**)&h_b[i], 2*sizeof(int)));
GPUerrchk(cudaMemcpy(h_b[i], &bb[i][0], 2*sizeof(int), cudaMemcpyHostToDevice));
}
int ** d_b;
GPUerrchk(cudaMalloc((void ***)&d_b, 2 * sizeof(int *)));
GPUerrchk(cudaMemcpy(d_b, h_b, 2*sizeof(int *), cudaMemcpyHostToDevice));
int ** h_c = (int **)malloc(2 * sizeof(int *));
for(int i=0; i<2;i++){
GPUerrchk(cudaMalloc((void**)&h_c[i], 2*sizeof(int)));
}
int ** d_c;
GPUerrchk(cudaMalloc((void ***)&d_c, 2 * sizeof(int *)));
GPUerrchk(cudaMemcpy(d_c, h_c, 2*sizeof(int *), cudaMemcpyHostToDevice));
add<<<1,1>>>(d_a,d_b,d_c);
GPUerrchk(cudaPeekAtLastError());
for(int i=0; i<2;i++){
GPUerrchk(cudaMemcpy(&cc[i][0], h_c[i], 2*sizeof(int), cudaMemcpyDeviceToHost));
}
for(int i=0;i<2;i++) {
for(int j=0;j<2;j++) {
printf("(%d,%d):%d\n",i,j,cc[i][j]);
}
}
return cudaThreadExit();
}
मैं सुझाव है कि आप आप जब तक यह अध्ययन:
दिखाने के लिए क्या मूर्खता संकेत के एरे उपयोग कर रहा है CUDA में, यहाँ अपने नमूना समस्या का एक पूरा काम कर उदाहरण जो ऊपर दो विचारों को जोड़ती है समझें कि यह क्या करता है, और रैखिक स्मृति का उपयोग करने की तुलना में यह इतना खराब विचार क्यों है।
कृपया कोड - इंडेंट को 4 रिक्त स्थान से प्रारूपित करें। – sje397