2012-08-28 2 views
3

내 문제는 다음과 같습니다. one. 가장 간단한 CUDA 프로그램을 실행했지만 커널이 실행되지 않습니다. 그러나 문제가없는 여러 파일 (다른 사람으로부터 가져온 파일)로 구성된 복잡한 CUDA 프로젝트를 실행할 수 있으므로 내 CUDA 설치가 괜찮은 것으로 확신합니다. 이 프로젝트에서, 컴파일과 링크는 많은 플래그를 가진 메이크 파일을 통해 수행됩니다. 문제는 컴파일하는 동안 사용할 올바른 플래그라고 생각합니다. 이러한 프로그램 nvcc -arch=sm_20 -lcudart test.cu (리눅스 시스템에서 실행) :CUDA 커널이 실행되지 않습니다.

__global__ void myKernel() 
{ 

    cuPrintf("Hello, world from the device!\n"); 


} 
int main() 
{ 
    cudaPrintfInit(); 
    myKernel<<<1,10>>>(); 
    cudaPrintfDisplay(stdout, true);  
    cudaPrintfEnd(); 
} 

프로그램이 제대로 컴파일 단순히이 같은 명령을 사용합니다. cudaMemcpy() 작업을 추가하면 오류가 반환되지 않습니다. 커널이 시작되지 않는 이유에 대한 제안?

+1

나는 계산 기능 2의 장치에 대해 그렇게 믿습니다.0 이상이면 간단히'printf'를 호출 할 수 있습니다. 또한 전화에서 오류 메시지가 있는지 확인하기 위해 오류 검사를 수행하려고 할 수 있습니다. – Bart

+0

참고 : http://stackoverflow.com/questions/6565759/cuda-cuprintf-causes-unspecified-launch-failure –

+1

또한 링크 된 질문의 첫 번째 메모를 기록해 두십시오. http://stackoverflow.com/ 질문/9519272/cuda-kernel-not-launching - 위의 코드에서 오류를 전혀 검사하지 않았습니다. 이러한 함수는 이유에 따라 상태를 반환합니다. –

답변

3

CUDA 장치가 SM_20 아키텍처를 지원합니까?

nvcc 명령 줄에서 arch = 옵션을 제거하고 모든 것을 다시 작성하십시오. 이것은 모든 CUDA 장치에서 지원 될 1.0 CUDA 아키텍처 용으로 컴파일됩니다. 그래도 실행되지 않으면 빌드를 정리하고 아무 곳이나 남겨진 오브젝트 파일이 없는지 확인하십시오. 그런 다음 재건하고 실행하십시오.

또한 arch =는 가상 아키텍처를 나타내며 compute_10과 유사해야합니다. sm_20은 실제 아키텍처이고 나는 arch =가 아닌 code = 스위치와 함께 사용해야한다고 생각합니다.

+0

감사합니다. 나는 그것을 제거하고 커널은 cuPrintf를 사용하여 마침내 출력했다. – Tarek

+0

이제 float 변수에 대해 atomicAdd 작업을 수행하기 때문에 처음에는 '-arch = sm_20'을 사용해야한다는 것을 기억했습니다.이 작업은 sm_10을 사용하여 수행 할 수 없습니다. 어떤 대안이 있습니까? – Tarek

+2

하드웨어에서 가능한 기능을 확인하십시오. 하드웨어가 지원하지 않는 코드를 실행하는 것은 어렵습니다. ;> – dthorpe

11

printf을 사용할 때 인쇄되지 않는 이유는 커널 시작이 비동기이며 printf 버퍼가 플러시되기 전에 프로그램이 종료되기 때문입니다. CUDA (5.0) C 프로그래밍 가이드의 B.16 절에서이를 설명합니다.

커널을 시작하기 전에 printf()의 출력 버퍼를 고정 크기로 설정합니다 (연결된 호스트 측 API 참조). 원형이고 커널 실행 중 더 많은 출력이 버퍼에 들어갈 수있는 것보다 많으면 이전 출력을 덮어 씁니다. 다음 작업 중 하나가 수행 될 때 그것은 단지 플러시 :

  • 커널 출시 < <이 >>> 또는 cuLaunchKernel()가 (발사의 시작, 그리고 CUDA_LAUNCH_BLOCKING 환경 변수로 설정되어있는 경우 <를 통해 1 웰 )로 실행의 끝 cudaDeviceSynchronize() cuCtxSynchronize()를 통해
  • 동기화 cudaStreamSynchronize() cuStreamSynchronize() cudaEventSynchronize() 또는 cuEventSynchronize()
  • 메모리 복사에cudaDeviceReset() 또는 cuCtxDestroy 통해 어떤 블로킹 cuModuleLoad() 또는 cuModuleUnload()를 통해 cudaMemcpy *() 또는 cuMemcpy *()의 버전
  • 모듈 로딩/언 로딩,
  • 컨텍스트 파괴 비아(). 이러한 이유로

,이 프로그램을 인쇄 아무것도 : "장치에서 안녕하세요, 세계 \ n"

#include <stdio.h> 

__global__ void myKernel() 
{ 
    printf("Hello, world from the device!\n"); 
} 

int main() 
{ 
    myKernel<<<1,10>>>(); 
} 

그러나이 프로그램을 인쇄 열 번.

#include <stdio.h> 

__global__ void myKernel() 
{ 
    printf("Hello, world from the device!\n"); 
} 

int main() 
{ 
    myKernel<<<1,10>>>(); 
    cudaDeviceSynchronize(); 
} 
+1

'cudaPrintfDisplay'는 컨텍스트를 암시 적으로 동기화하므로 원래 코드에서는 문제가되지 않습니다. – talonmies

+0

감사합니다. 답안에서 마지막 줄을 제거하여 더 이상 그렇지 않다는 것을 나타내지 않습니다. – harrism

관련 문제