예, 장치에 사용할 개체를 장치에 복사 할 수 있습니다. 개체에 동적으로 할당 된 영역에 대한 포인터가 포함되어 있으면 프로세스에 몇 가지 추가 단계가 필요합니다.
관련 내용에 대한 설명은 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 오류 검사가 필요하지 않습니다.
질문에 답하면 장치 기반 클래스의 포인터를 사용하여 호스트에서 직접 저장소를 할당 할 수 없습니다. 누구의 저장 장치에 이미 포인터 작동하지 않을 수
int *hostdata;
cudaMalloc : cudaMalloc은 당신이 무엇을 얻을 같은 일반 호스트 기반 포인터 저장을 기대하기 때문이다. 이 작동하지 않습니다
cudaMalloc(&(d_c->data), sizeof(int));
을가 허용되지 않는 호스트 코드에서 장치 포인터 (D_C)를 역 참조 필요하기 때문이다.
ok 하나만 더 질문 : 내가보기 엔 장치에 메모리를 할당 한 다음 포인터 값을 개체 내부의 배열에 복사한다는 것입니다. 왜 "중간"변수를 사용하여 데이터를 보유하고 포인터를 myobject.array에 복사하는 대신 myobject.array에 직접 할당 할 수 없습니까? –
내 대답을 편집하여이 질문에 응답했습니다. 나는 이미이 질문을 연계 된 대답들 중 하나 후에 게시 된 질문들에서도 언급했다고 믿는다. –
정말 고맙습니다. 내가 할 수있는 한 가지 더 질문 : 이유는 무엇입니까 CudaMalloc ((void **) & data, 100 * sizeof (int)) 대신 data = new int [100] 대신 생성자에서? 나는 장치 대신 호스트에 직접 할당하고 장치에 복사해야한다고 생각했습니다. 건배 –