2011-08-07 2 views
2

내 질문은 다음과 같습니다 :커널 내에서 포인터를 사용하는 CUDA 4.0 - 오류

두 가지 방법으로 커널을 사용하고 싶습니다.

cutilSafeCall(cudaMemcpy(d_array, array, 100*sizeof(double), 
         cudaMemcpyHostToDevice)); 

또는

  • I 입력 통해 cudaMemcpy을 이용하여 복사 된 배열 d_array, 즉을 사용하여 이중 mydouble 직접 즉 double mydouble = 3;

I는 입력 배열은 단순히 (잘 작동하는)를 사용하는 경우 :

kernel<<<1, 100>>>(d_array, 100, output); 

I 입력 (하지 잘 작동을 수행하는 !!) 내가 사용하는 이중 경우 :

kernel<<<1, 100>>>(&mydouble, 1, output); 
내 커널은 아래와 같습니다

:

___global___ void kernel(double * d_array, int size_d_array, double * output) 
{ 
    double a; 

    if (size_d_array == 100) 
    {output[threadIdx.x] = d_array[threadIdx.x];} 

    else 
    {output a[threadIdx.x] = d_array[0];} 
} 
+0

정확한 코드입니까? '커널 (d_array, 100) <<<1, 100> >>;은 최소한 커널 <<<1, 100> >> (d_array, 100); – Bart

+0

롤, 죄송합니다 가짜 코드 ...하지만 질문이 남아 있기 때문에. – gamma123

+2

실제 코드를 실제 커널 호출 및 메모리 할당과 함께 게시하십시오. – Bart

답변

2
double aDouble = 3; 
double *myDouble = &double; 

호스트 코드에서 위의 작업을 수행하면 myDouble은 호스트 메모리에 대한 포인터입니다. 따라서 장치 커널에 직접 전달할 수 없습니다 (포인터는 배열 또는 스칼라 값을 가리키는 지 여부와 관계없이 포인터입니다).

그러나 CUDA 4.0에서는 호스트 포인터에서 cudaHostRegister를 호출 할 수 있으며 시스템이 unified virtual addressing을 지원하면 커널에 전달할 수 있습니다. 그렇지 않다면 cudaHostRegister을 적절한 플래그로 호출 한 다음 cudaHostGetDevicePointer 포인터를 사용하여 을 장치 커널에 전달할 수 있습니다.

에 대한 CUDA 설명서를 참조하십시오.
관련 문제