2012-04-24 2 views
4

내가 아래와 같이 작동하는 CUDA 코드가이상한 오류 :</p> <pre><code>cpyDataGPU --> CPU while(nsteps){ cudaKernel1<<<,>>> function1(); cudaKernel2<<<,>>> } cpyDataGPU --> CPU </code></pre> <hr> <p>그리고 기능 1가 같다 : cudaErrorLaunchFailure

cudaMemcpy documentation에 따르면
function1{ 

    cudaKernel3<<<,>>> 
    cudaKernel4<<<,>>> 

    cpyNewNeedDataCPU --> GPU // Error line 
    cudaKernel5<<<,>>> 
} 

,이 기능을 "cudaSuccess", "cudaErrorInvalidValue", "cudaErrorInvalidDevicePointer"및 "cudaErrorInvalidMemcpyDirection"의 4 가지 오류 코드를 생성 할 수 있습니다.

"cudaErrorLaunchFailure": "커널을 실행하는 동안 장치에서 예외가 발생했습니다. 일반적인 원인으로 잘못된 장치 포인터를 역 참조하고 공유 메모리를 초과하여 액세스하는 경우가 있습니다. 장치를 untilcudaThreadExit()가 호출됩니다. 기존의 모든 장치 메모리 할당은 유효하지 않으며 프로그램이 CUDA를 계속 사용하려면 재구성해야합니다. "

아무에게도 왜 내가이 오류가 발생하는지에 대한 생각이 있습니까? 내가 뭘 잘못하고 있니?

이전의 커널 호출 후 데이터를 CPU-> GPU로 복사 하시겠습니까? 문제는 각 "while"단계에서 변경 될 수 있으므로 각 단계에서 해당 데이터를 복사해야한다는 것입니다.

탁월한 사전!

답변

3

당신은 또한 링크 된 문서는 말한다 :

Note that this function may also return error codes from previous, asynchronous launches.

당신이 프로그램은, (커널 출시 비동기 것을 기억) 완료하기 위해 모든 이전의 GPU 작업 대기하고 상태를 확인하고 방어 적이기를 실행 cudaMemcpy()를 호출 할 때 모든 것이 괜찮 으면. 그러나이 경우 커널 중 하나가 실패했습니다.

이 오류의 가장 일반적인 원인은 x86 영역의 segfault와 같은 범위를 벗어난 액세스입니다.

cudaErrorLaunchFailure : An exception occurred on the device while executing a kernel. Common causes include dereferencing an invalid device pointer and accessing out of bounds shared memory. The device cannot be used until cudaThreadExit() is called. All existing device memory allocations are invalid and must be reconstructed if the program is to continue using CUDA.

가장 쉬운 방법은 cuda-memcheck를 사용하는 것입니다. 또는 각 커널을 시작하고 반환 값을 확인한 후 cudaDeviceSynchronize()을 호출하여 어떤 커널이 실패했는지 식별 할 수 있습니다.

+0

당신이'cudaDeviceSynchronize()'라고 내게 말했던 것처럼 코드를 debuged했고 이전 커널에서 오류가있었습니다. 마지막으로 나는 버그를 발견하고 그것을 고쳤다. 도움을 주셔서 대단히 감사합니다! – horstmann

1

커널을 호출 한 후 오류 상태를 확인하고 있습니까? (거의?) 모든 cuda 호출은 실패한 이전 호출 또는 커널에서 오류를 반환 할 수 있습니다. 실행 실패가 발생하기 때문에 복사하기 전에 커널 중 하나가 오류의 실제 원인이라고 의심됩니다.

관련 문제

 관련 문제