2015-01-31 2 views
-1

printf은 지원되지 않았으며 에뮬레이터를 사용하여 CUDA 프로그램을 실행하거나 변수를 앞뒤로 복사하여 호스트 측에서 인쇄합니다.CUDA에서 printf가 어떻게 작동합니까?

이제 CUDA (아치 2 이상)는 printf을 지원합니다. 어떻게 작동하는지 알고 싶어합니까? 내부적으로 화면에 GPU가 printf 인 것을 어떻게 의미합니까? 컴퓨팅 기능 1의 제한 요소는 무엇입니까? CUDA C Programming Guide 가입일

+3

'printf()'에는 ABI가 필요하다는 것을 알고 있습니다. sm_1x 장치에 대한 ABI가 없었기 때문에 장치에 일반 포인터가있는 플랫 주소 공간이 부족한 것 같습니다 (sm_1x는 공유, 전역, 상수 등의 주소 공간에 대해서만 지원되는 주소 공간의 특정 포인터 임). 현재 장치 측'printf()'는 GPU의 전역 메모리에있는 링 버퍼로 출력하며, 그 내용은 커널이 완료되면 호스트로 전송됩니다. 링 버퍼가 분명히 오버플로 될 수 있습니다. 사용자가 구성 할 수있는 크기 인 경우 프로그래밍 가이드를 확인하십시오. – njuffa

+1

'cudaDeviceSetLimit (cudaLimitPrintfFifoSize, sizeInBytes)'로 장치 크기'printf()'에 링 버퍼의 크기를 설정할 수 있습니다. [CUDA 런타임 API 문서] 참조 (http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gb8a22e29cc297634b0702db0b69f59e7) – njuffa

+1

장치 측'printf()'의 작동에 대해 자세히 설명합니다 [섹션 B.17. C 프로그래밍 가이드] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output) – njuffa

답변

2

: 호스트 측 출력 스트림 커널에서 출력 포맷

의 printf 인쇄물.

printf()의 출력 버퍼는 커널을 시작하기 전에 고정 크기로 설정됩니다 (연관된 호스트 측 API 참조). 원형이며 커널 실행 중에 버퍼에 저장할 수있는 출력보다 더 많은 출력이 생성되면 이전 출력을 덮어 씁니다. 다음 작업 중 하나가 수행되는 경우에만 플러시 :

...

내부의 printf()는 공유 데이터 구조를 사용하고, 그래서의 printf()를 호출하면 스레드의 실행 순서를 변경 될 가능성이있다 . 특히, printf()를 호출하는 쓰레드는 printf()를 호출하지 않는 쓰레드보다 긴 실행 경로를 취할 수 있고, 그 경로 길이는 printf()의 매개 변수에 의존한다. 그러나 CUDA는 명시 적 __syncthreads() 경계를 제외하고 스레드 실행 순서를 보장하지 않으므로 printf() 또는 하드웨어의 다른 예약 동작에 의해 실행 순서가 수정되었는지 여부를 알 수 없습니다.

  • cudaDeviceGetLimit(size_t* size,cudaLimitPrintfFifoSize)
  • cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size_t size)
  • :

    다음 API 함수하세요 호스트로의 printf() 인자 및 내부 메타 데이터를 전송하기 위해 사용되는 버퍼의 크기를 설정 (디폴트 1 메가 바이트)

관련 문제