Tôi đang làm việc trên một dự án mà tôi cần thiết bị CUDA của mình để thực hiện tính toán trên cấu trúc chứa con trỏ.Sao chép một cấu trúc có chứa con trỏ đến thiết bị CUDA
Khi tôi cấp phát bộ nhớ cho cấu trúc và sau đó sao chép bộ nhớ vào thiết bị, nó sẽ chỉ sao chép cấu trúc chứ không phải nội dung của con trỏ. Bây giờ tôi đang làm việc xung quanh điều này bằng cách phân bổ con trỏ đầu tiên, sau đó thiết lập cấu trúc máy chủ để sử dụng con trỏ mới (mà nằm trên GPU). Mẫu mã sau đây mô tả phương pháp này sử dụng các cấu trúc từ trên cao:
#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;
}
Câu hỏi của tôi là: Đây có phải là cách để làm điều đó?
Dường như có rất nhiều công việc và tôi nhắc bạn rằng đây là cấu trúc rất đơn giản. Nếu cấu trúc của tôi chứa rất nhiều con trỏ hoặc cấu trúc với con trỏ, mã để phân bổ và sao chép sẽ khá rộng và khó hiểu.
Các bước 7 và 9 là thừa, nhưng nếu không thì đó là khá nhiều.Như câu trả lời dưới đây, bạn được phục vụ tốt nhất bằng cách tránh các cấu trúc dữ liệu phức tạp, dựa trên con trỏ trên GPU. Hiệu suất là trên GPU là tồi tệ hơn, và các API thực sự không được thiết kế cho nó. – talonmies
Tôi có thể thấy rằng bước 7 là thừa, nhưng tại sao bước 9? –
cũng 'h_a' là (hoặc phải là) một" hình ảnh "của cấu trúc thiết bị được giữ trong bộ nhớ máy chủ. Gán nó để giữ một con trỏ trong bộ nhớ máy chủ có lẽ là một sự kết hợp của thực hành xấu/sai/rò rỉ bộ nhớ thiết bị tùy thuộc vào ý định thực sự của bạn là gì. Sau khi bạn đã sao chép nội dung của 'd_a' trở lại' h_a' bạn có "đến vòng tròn đầy đủ" và quay lại nơi bạn bắt đầu. – talonmies