पर पॉइंटर्स युक्त संरचना की प्रतिलिपि बनाना मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मुझे पॉइंटर्स युक्त संरचना पर कंप्यूटेशंस बनाने के लिए मेरे CUDA डिवाइस की आवश्यकता है।सीयूडीए डिवाइस
typedef struct StructA {
int* arr;
} StructA;
जब मैं struct के लिए स्मृति को आबंटित और फिर डिवाइस पर प्रतिलिपि, यह केवल struct और नहीं सूचक की सामग्री की नकल करेंगे। अभी मैं पॉइंटर को आवंटित करके इस पर काम कर रहा हूं, फिर उस नए सूचक (जो GPU पर रहता है) का उपयोग करने के लिए होस्ट स्ट्रक्चर सेट करें। निम्नलिखित कोड नमूना ऊपर से इस दृष्टिकोण struct का उपयोग कर का वर्णन करता है:
#define N 10
int main() {
int h_arr[N] = {1,2,3,4,5,6,7,8,9,10};
StructA *h_a = (StructA*)malloc(sizeof(StructA));
StructA *d_a;
int *d_arr;
// 1. Allocate device struct.
cudaMalloc((void**) &d_a, sizeof(StructA));
// 2. Allocate device pointer.
cudaMalloc((void**) &(d_arr), sizeof(int)*N);
// 3. Copy pointer content from host to device.
cudaMemcpy(d_arr, h_arr, sizeof(int)*N, cudaMemcpyHostToDevice);
// 4. Point to device pointer in host struct.
h_a->arr = d_arr;
// 5. Copy struct from host to device.
cudaMemcpy(d_a, h_a, sizeof(StructA), cudaMemcpyHostToDevice);
// 6. Call kernel.
kernel<<<N,1>>>(d_a);
// 7. Copy struct from device to host.
cudaMemcpy(h_a, d_a, sizeof(StructA), cudaMemcpyDeviceToHost);
// 8. Copy pointer from device to host.
cudaMemcpy(h_arr, d_arr, sizeof(int)*N, cudaMemcpyDeviceToHost);
// 9. Point to host pointer in host struct.
h_a->arr = h_arr;
}
मेरा प्रश्न है: इस तरह से यह करने के लिए है?
ऐसा लगता है कि यह बहुत काम करता है, और मैं आपको याद दिलाता हूं कि यह एक बहुत ही सरल संरचना है। यदि मेरे ढांचे में पॉइंटर्स के साथ बहुत सारे पॉइंटर्स या structs शामिल हैं, तो आवंटन और प्रतिलिपि के लिए कोड काफी व्यापक और भ्रमित होगा।
चरण 7 और 9 अनावश्यक हैं, लेकिन अन्यथा यह काफी है कि यह कितना है।जैसा कि नीचे दिया गया जवाब कहता है, आप GPU पर जटिल, सूचक आधारित डेटा संरचनाओं से बचकर सबसे अच्छी सेवा कर रहे हैं। GPU पर प्रदर्शन खराब है, और एपीआई वास्तव में इसके लिए डिज़ाइन नहीं किए गए हैं। – talonmies
मैं देख सकता हूं कि चरण 7 अनावश्यक है, लेकिन क्यों कदम 9? –
अच्छी तरह से 'h_a' होस्ट मेमोरी में रखी गई डिवाइस संरचना की "छवि" है (या होना चाहिए)। होस्ट मेमोरी में पॉइंटर रखने के लिए इसे असाइन करना शायद आपके असली इरादों के आधार पर खराब अभ्यास/गलत/डिवाइस मेमोरी रिसाव का कुछ संयोजन है। 'D_a' की सामग्री को' h_a' पर वापस कॉपी करने के बाद आपके पास "पूर्ण सर्कल आ गया है" और वापस जहां आप से शुरू किया गया है। – talonmies