2013-04-15 5 views
8

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); 
} 

지금 어떻게 장치 메모리 및 출시 커널 "useClass"을 "C"를 복사합니까?

답변

14

예, 장치에 사용할 개체를 장치에 복사 할 수 있습니다. 개체에 동적으로 할당 된 영역에 대한 포인터가 포함되어 있으면 프로세스에 몇 가지 추가 단계가 필요합니다.

관련 내용에 대한 설명은 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)를 역 참조 필요하기 때문이다.

+0

ok 하나만 더 질문 : 내가보기 엔 장치에 메모리를 할당 한 다음 포인터 값을 개체 내부의 배열에 복사한다는 것입니다. 왜 "중간"변수를 사용하여 데이터를 보유하고 포인터를 myobject.array에 복사하는 대신 myobject.array에 직접 할당 할 수 없습니까? –

+0

내 대답을 편집하여이 질문에 응답했습니다. 나는 이미이 질문을 연계 된 대답들 중 하나 후에 게시 된 질문들에서도 언급했다고 믿는다. –

+0

정말 고맙습니다. 내가 할 수있는 한 가지 더 질문 : 이유는 무엇입니까 CudaMalloc ((void **) & data, 100 * sizeof (int)) 대신 data = new int [100] 대신 생성자에서? 나는 장치 대신 호스트에 직접 할당하고 장치에 복사해야한다고 생각했습니다. 건배 –

관련 문제