2013-04-15 36 views
8

Tôi có thể sao chép đối tượng C++ vào thiết bị không?Sao chép một đối tượng vào thiết bị?

nói rằng tôi có:

class CudaClass 
{ 
public: 
int* data; 
CudaClass(int x) { 
    data = new int[1]; data[0] = x; 
} 
}; 

__global__ void useClass(CudaClass cudaClass) 
{ 
    printf("%d" cudaClass.data[0]); 
}; 


int main() 
{ 
    CudaClass c(1); 
} 

Bây giờ làm thế nào để sao chép "c" để bộ nhớ điện thoại và khởi động hạt nhân "useClass"?

Trả lời

14

Có, bạn có thể sao chép một đối tượng vào thiết bị để sử dụng trên thiết bị. Khi đối tượng đã nhúng con trỏ đến các vùng được cấp động, quá trình này yêu cầu một số bước bổ sung.

Xem my answer here để thảo luận về những gì có liên quan. Câu trả lời đó cũng có một vài mẫu mã câu trả lời liên quan đến nó.

Ngoài ra, trong định nghĩa lớp học của bạn, nếu bạn muốn các chức năng nhất định có thể sử dụng được trên thiết bị, bạn nên trang trí các chức năng đó một cách thích hợp (tức là với __device__ __host__);

EDIT: Để đáp lại câu hỏi (nay đã bị xóa) đây là đoạn code mẫu đơn giản nhất tôi có thể đưa ra dựa trên mã cung cấp:

#include <stdio.h> 

class CudaClass 
{ 
public: 
int* data; 
CudaClass(int x) { 
    data = new int[1]; data[0] = x; 
} 
}; 

__global__ void useClass(CudaClass *cudaClass) 
{ 
    printf("%d\n", cudaClass->data[0]); 
}; 




int main() 
{ 
    CudaClass c(1); 
    // create class storage on device and copy top level class 
    CudaClass *d_c; 
    cudaMalloc((void **)&d_c, sizeof(CudaClass)); 
    cudaMemcpy(d_c, &c, sizeof(CudaClass), cudaMemcpyHostToDevice); 
    // make an allocated region on device for use by pointer in class 
    int *hostdata; 
    cudaMalloc((void **)&hostdata, sizeof(int)); 
    cudaMemcpy(hostdata, c.data, sizeof(int), cudaMemcpyHostToDevice); 
    // copy pointer to allocated device storage to device class 
    cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice); 
    useClass<<<1,1>>>(d_c); 
    cudaDeviceSynchronize(); 
    return 0; 
} 

Vì lợi ích ngắn gọn/rõ ràng tôi có phân phối với kiểm tra lỗi cuda thông thường.

Trả lời câu hỏi, bạn không thể cấp phát lưu trữ trực tiếp từ máy chủ bằng cách sử dụng con trỏ trong lớp dựa trên thiết bị. Điều này là do cudaMalloc hy vọng một máy chủ lưu trữ dựa trên con trỏ bình thường, chẳng hạn như những gì bạn nhận được với:

int *hostdata; 

cudaMalloc không thể làm việc với một con trỏ có lưu trữ là đã có trên thiết bị. Điều này sẽ không hoạt động:

cudaMalloc(&(d_c->data), sizeof(int)); 

vì yêu cầu dereferencing con trỏ thiết bị (d_c) trong mã máy chủ không được phép.

+0

ok chỉ một câu hỏi nữa: Tôi thấy là bạn phân bổ một số bộ nhớ trên thiết bị, sau đó sao chép giá trị con trỏ vào mảng bên trong đối tượng. Tại sao tôi không thể cấp phát myobject.array trực tiếp thay vì sử dụng biến "ở giữa" để giữ dữ liệu và sao chép con trỏ của nó vào myobject.array? –

+0

Đã trả lời câu hỏi này với bản chỉnh sửa cho câu trả lời của tôi. Tôi tin rằng tôi đã giải quyết câu hỏi này cũng như trong các câu hỏi được đăng sau một trong các câu trả lời được liên kết. –

+0

Cảm ơn bạn rất nhiều, câu trả lời rất rõ ràng! Một câu hỏi nữa nếu tôi có thể: Tại sao tôi không thể làm CudaMalloc ((void **) & data, 100 * sizeof (int)) Trong hàm tạo thay vì dữ liệu = new int [100] ? Tôi nghĩ rằng nên phân bổ trực tiếp trên thiết bị thay vì trên máy chủ, sau đó sao chép vào thiết bị. Chúc mừng –

Các vấn đề liên quan