2013-01-02 4 views
7

커널 함수에 객체를 전달할 수 있습니까? 클래스 객체를 커널에 전달

내가 클래스

class MyClass 
    { 
     public : 
       int value; 
       float rate; 
       MyClass() 
       { 
        value = 0; rate = 0; 
       } 
       MyClass(int v,float r) 
       { 
        value = v; rate = r; 
       } 
    }; 

을 내 커널 내가 배열을 전달 할 수 MyClass에

__global__ void MyKernel(MyClass * mc) 
    { 
    //Some Calculation 
    } 

의 객체의 배열을 고려? 메모리를 할당하는 방법 ?? 지금은 다음과 같은 코드가 모두 직접보고있는 어떤 오류와 관련이없는 CudaMemcpy 오류

cudaError_t cudaStatus; 

    MyClass darr[10] ; 
    cudaStatus = cudaMalloc((void**)&darr, size * sizeof(MyClass)); 

    if (cudaStatus != cudaSuccess) { 
      fprintf(stderr, "cudaMalloc failed!"); 
    goto label1; 
    } 

    cudaStatus = cudaMemcpy(darr, arr, size * sizeof(MyClass), cudaMemcpyHostToDevice); 
    //arr is a host array 
+1

무엇이 오류입니까? –

답변

14

몇 가지 문제가 여기에있다을 가지고 함께 노력했다.

먼저 호스트와 장치에서 클래스 메서드를 정의하여 클래스가 두 메모리 공간에서 인스턴스화 될 수 있도록해야합니다 (복사본을 만들 때 각 인스턴스의 데이터 멤버 만 복사됩니다). 따라서 클래스 선언은 다음과 같아야합니다.

class MyClass 
{ 
    public : 
     int value; 
     float rate; 
     __device__ __host__ MyClass() 
     { 
      value = 0; rate = 0; 
     } 
     __device__ __host__ MyClass(int v,float r) 
     { 
      value = v; rate = r; 
     } 
     __device__ __host__ ~MyClass() {}; 
} 

그러면 장치 메모리를 올바르게 할당해야합니다. 당신은 장치 (10 개) 회원 MyClass의 배열을 원하는 경우, 할당하고이 같은 장치에 복사합니다

MyClass arr[10]; 
MyClass *darr; 
const size_t sz = size_t(10) * sizeof(MyClass); 
cudaMalloc((void**)&darr, sz); 
cudaMemcpy(darr, &arr[0], sz, cudaMemcpyHostToDevice); 

[면책 조항 : 브라우저에 기록 된 모든 코드가 준수하거나 테스트 결코 자신의 위험에 사용]

그런 다음 darr을 인수로 호스트의 커널에 전달할 수 있습니다.