2013-08-21 1 views
1

컴파일하고 실행할 수 있지만 처음 실행을 완료 할 수없는 Nsight에 코드를 작성했습니다.은 cuda를 사용하여 __global__ 함수를 입력 할 수 없습니다

이상한 점은 디버그 모드에서 실행할 때 완벽하게 작동하지만 너무 느리다는 것입니다.

void parallelAction (int * dataReturned, char * data, unsigned char * descBase, int range, int cardBase, int streamIdx) 
{ 
    size_t inputBytes = range*128*sizeof(unsigned char); 
    size_t baseBytes = cardBase*128*sizeof(unsigned char); 
    size_t outputBytes = range*sizeof(int); 

    unsigned char * data_d; 
    unsigned char * descBase_d; 
    int * cardBase_d; 
    int * dataReturned_d; 

    cudaMalloc((void **) &data_d, inputBytes); 
    cudaMalloc((void **) &descBase_d, baseBytes); 
    cudaMalloc((void **) &cardBase_d, sizeof(int)); 
    cudaMalloc((void **) &dataReturned_d, outputBytes); 

    int blockSize = 196; 
    int nBlocks = range/blockSize + (range%blockSize == 0?0:1); 

    cudaMemcpy(data_d, data, inputBytes, cudaMemcpyHostToDevice); 
    cudaMemcpy(descBase_d, descBase, baseBytes, cudaMemcpyHostToDevice); 
    cudaMemcpy(cardBase_d, &cardBase, sizeof(int), cudaMemcpyHostToDevice); 

    FindClosestDescriptor<<< nBlocks, blockSize >>>(dataReturned_d, data_d, descBase_d, cardBase_d); 

    cudaMemcpy(dataReturned, dataReturned_d, outputBytes, cudaMemcpyDeviceToHost); 

    cudaFree(data_d); 
    cudaFree(descBase_d); 
    cudaFree(cardBase_d); 
    cudaFree(dataReturned_d); 
} 

그리고 GPU를 입력 기능 (I 돈 : 여기

은 (내가 찾을 수 없다는 오류가 있다고 생각)을 GPU에 액세스하는 기능을 입력하기 전에 코드의 일부이다 오류가 여기에 있다고 생각하지 마십시오.) :

__global__ void FindClosestDescriptor(int * dataReturned, unsigned char * data, unsigned char * base, int *cardBase) 
{ 
    int idx = blockDim.x * blockIdx.x + threadIdx.x; 
    unsigned char descriptor1[128], descriptor2[128]; 
    int part = 0; 
    int result = 0; 
    int winner = 0; 
    int minDistance = 0; 
    int itelimit = *cardBase; 
    for (int k = 0; k < 128; k++) 
    { 
     descriptor1[k] = data[idx*128+k]; 

    } 
    // initialize minDistance 
    for (int k = 0; k < 128; k++) 
    { 
     descriptor2[k] = base[k]; 
    } 

    for (int k = 0; k < 128; k++) 
    { 
     part = (descriptor1[k]-descriptor2[k]); 
     part *= part; 
     minDistance += part; 
    } 

    // test all descriptors in the base : 
    for (int i = 1; i < itelimit; i++) 
    { 
     result = 0; 
     for (int k = 0; k < 128; k++) 
     { 
      descriptor2[k] = base[i*128+k]; 
      // Calculate squared l2 distance : 
      part = (descriptor1[k]-descriptor2[k]); 
      part *= part; 
      result += part; 
     } 

     // Compare to minDistance 
     if (result < minDistance) 
     { 
      minDistance = result; 
      winner = i; 
     } 
    } 

    // Write the result in dataReturned 
    dataReturned[idx] = winner; 
} 

도와 주시면 감사하겠습니다.

EDIT : 마지막 cudaMemcpy가 "launched timed out and was terminated"오류를 반환합니다.

+0

@UchiaItachi 그것은 void **를 취하므로 포인터의 주소를 보냅니다. – doctorlove

+0

아니요'void *'만 사용합니다. 포인터 인'cardBase_d '가 아니라 함수 인자의 정수 인'cardBase'입니다. 그것을 잘못 읽었습니다. –

+0

@ user2682877 : 기능 통화까지 도달합니까? –

답변

0

리눅스에는 감시 메커니즘이 있습니다. 커널이 오랫동안 (디버그 모드에서 느린다고) 말하면 리눅스 워치 독을 치고 "launched timed out and was terminated"오류를받을 수 있습니다.

이 경우에는 시도 할만한 여러 가지 사항이 있습니다. 옵션은 here에 있습니다.

관련 문제