2014-04-01 2 views
0

저는 Java 프로그래머이며 C++ 및 Cuda를 처음 사용합니다. CudaRun.cu분할 오류 C++ Cuda

void mainRun(Input in) { 
    Input *deviceIn; 
    deviceIn = new Input(NULL, NULL, NULL, NULL, 0.0, NULL,0.0,0.0,NULL,0.0,NULL,0.0); 
    //line-a 

    printf("Started. Just abt to call cuda \n"); 
    int size = sizeof(Input); 
    cudaMalloc((void**) &deviceIn, size); 
    cudaMemcpy(deviceIn, &in, size, cudaMemcpyHostToDevice); 

    cudaMalloc((void**) deviceIn->sellingPrice, 4 * sizeof(LucyDecimal)); 
    //line-b 
     .... 
} 

내가 세그먼트 오류에서 얻을 내 지금

Input.h 클래스 입력 {

public: 
    const LucyDecimal * sellingPrice; //Ri 
    const LucyDecimal qc; 

public: 
    Input(
      const LucyDecimal * _sellingPrice, 
      const LucyDecimal _qc); 

    virtual ~Input(); 

}; 

Input::Input(
     const LucyDecimal * _sellingPrice, //Ri 
     const LucyDecimal _qc):sellingPrice(_sellingPrice),qc(_qc) 
{}; 

Input::~Input() { 
} 

: 나는 다음 일을 세그먼트 오류를 ​​얻고있다 line-b. line-a 초기화와 관련이 있습니까?

답변

3

당신은 장치 메모리에 대한 포인터를 만들 수 없습니다 :

cudaMalloc((void**) &deviceIn, size); 

그리고를 다음 호스트 코드에서 그 포인터 역 참조 :

cudaMalloc((void**) deviceIn->sellingPrice, 4 * sizeof(LucyDecimal)); 

실제로 sellingPrice 포인터의 값 내에서 설정하는 방법 deviceIn 구조체에서 컴파일러는 할당 된 포인터 값을 쓰려면 기본 포인터 (deviceIn)에서 계산 된 포인터를 역 참조해야하며이 역 참조는 호스트 코드에서 올바르지 않습니다.

포인터가 들어있는 구조체를 복사하는 것을 "딥 복사본"이라고하며 다소 지루합니다.

대신 별도의 포인터를 할당해야합니다

LucyDecimal * sellingPrice_temp; 
cudaMalloc((void**) &sellingPrice_temp, 4 * sizeof(LucyDecimal)); 

을 그리고 적절한 위치에 장치 호스트에서 포인터를 할당 것을 복사 :

cudaMemcpy(&(deviceIn->sellingPrice), &sellingPrice_temp, sizeof(LucyDecimal *), cudaMemcpyHostToDevice); 

참고하는의 주소를 찾는 구조체의 특정 위치 (&(deviceIn->sellingPrice))는 기본 포인터 (deviceIn)를 참조 해제하지 않고 컴파일러에서 계산할 수 있습니다.

임베디드 포인터 영역의 데이터를 어느 시점에서 다시 호스트로 복사하려면 sellingPrice_temp을 다시 사용해야합니다.

이 주제는 몇 가지 빈도로 나타나며 예를 들어 검색하면 여러 가지 다른 예가 있습니다. "CUDA 복사 구조 임베디드 포인터". 방법론은 동적으로 할당 된 행렬을 호스트에서 장치로 복사하는 것과 유사합니다.

이 경우에는별로 도움이되지 않지만 proper cuda error checking도 권장합니다.

+0

그러나'sellingPrice_temp'는 어떻게 값을 얻을 것입니까? – Jatin

+0

'sellingPrice_temp'의 포인터 값은 다음과 같은 'cudaMalloc' 연산에 의해 설정됩니다 (http://stackoverflow.com/questions/12936986/why-does-cudamalloc-use-pointer-to-pointer/12937162#12937162). 호스트 코드 에서처럼'sellingPrice_temp'의 선언 바로 뒤에 나의 대답에 나열된'malloc' 연산은 포인터 값을 반환합니다. –

+0

당신의 대답이 도움이되었습니다 : http://stackoverflow.com/questions/22156536/cudamalloc-of-a-structure-and-an-element-of-same-structure 하지만 그 대답은'cudeMemcpy'입니다. 구조.그래서'foo' 값을 어떻게 얻을 수 있습니까? – Jatin