是的,您可以將對象複製到設備以供在設備上使用。當對象嵌入指向動態分配區域的指針時,該過程需要一些額外的步驟。
請參閱my answer here以瞭解涉及的內容。這個答案也有一些與它相關的代碼答案。另外,在您的類定義中,如果您希望某些功能可以在設備上使用,您應該適當修飾這些功能(也許可以使用__device__ __host__
);
編輯:在回答問題(現已刪除),這裏是最簡單的示例代碼,我可以拿出根據所提供的代碼:
#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;
}
在簡潔的利益/清晰度我有省去了通常的cuda錯誤檢查。
回答這個問題,您不能直接使用基於設備的類中的指針從主機分配存儲空間。這是因爲cudaMalloc期待一個普通的基於主機的指針存儲,比如你會得到什麼:
int *hostdata;
cudaMalloc不能用指針,其存儲已經在設備上工作。這將無法工作:
cudaMalloc(&(d_c->data), sizeof(int));
因爲它需要在解引用主機代碼的裝置指針(d_c),這是不允許的。
確定只有一個問題:我看到的是,您在設備上分配一些內存,然後將指針值複製到對象內的數組。爲什麼我不能直接爲myobject.array分配而不是使用「中間」變量來保存數據並將其指針複製到myobject.array中? –
回覆這個問題,並編輯我的答案。我相信我已經解決了這個問題,並且在其中一個鏈接答案後發佈了問題。 –
非常感謝,非常明確的答案! 還有一個問題,如果我可以:爲什麼我不能做 CudaMalloc((void **)&data,100 * sizeof(int)) 在構造函數中而不是data = new int [100] ? 我認爲應該直接在設備上分配,而不是在主機上,然後複製到設備。 乾杯 –