2012-11-01 3 views
1

많은 변수와 메서드가 포함 된 내 cuda 장치에서 큰 클래스를 복제하려고합니다. 클래스 정의를 .cuh 파일에 넣었습니다. 객체를 만들어 내 장치 코드에서 사용할 수 있습니다.장치에 대한 Cuda 호스트 개체

질문은 지금 호스트에서 장치로 이미 존재하는 개체를 가져 오는 방법이 있습니까? 나는 아직도 나의 코드의 시리얼 버전을 사용하여 어떤 기하학과 물리적 인 데이터를 읽는다. 중간 배열 등을 사용하지 않고 장치로 복사 할 수 있다면 sizeof를 사용하지 않고 장치가 크기를 어떻게 처리합니까?

다음과 같이 할당 할 때 사용합니까?

MyClass *MyObject; 
int size = sizeog(MyClass); 
cudaMalloc((void**)&MyObject_device, size); 
cudaMemCpy(Myobject_device, MyObject, size, cudaMemcpyHostToDevice); 

어떤 조언을 주시면 감사하겠습니다.

답변

1

CUDA 컴파일러는 호스트 컴파일러에서 사용되는 데이터 구조 정렬 및 패킹과 일치하도록 설계되었습니다. 따라서 장치와 호스트간에 개체를 안전하게 전달하고 정렬 요구 사항에 관계없이 멤버에 액세스 할 수 있습니다.

커널 매개 변수로 개체를 직접 전달할 수 있습니다. 예를 들어 :

호스트 :

MyKernel<<<grid_dim, block_dim>>>(my_object); 

장치 : 당신이 객체의 배열을 전달해야하는 경우

__global__ void MyKernel(MyObject my_object) { 

, 쉬운 방법이 thrust::device_vector을 사용하는 것입니다. 예를 들어 :

호스트 :

#include <thrust/device_vector.h> 
device_vector<MyObject> my_objects; 
... 
MyObject* my_objects_d = thrust::raw_pointer_cast(&my_objects[0]); 
MyKernel<<<grid_dim, block_dim>>>(my_objects_d); 

장치 :

__global__ void MyKernel(MyObject* my_objects) { 
+0

감사 로저 나는 그것을 시도 줄 것이다 –

관련 문제