2013-12-21 2 views
0

CUDA 타이머 (이벤트)와 일반적인 CPU 타이밍 방법 (Linux의 경우 gettimeofday 등)을 사용하여 타이밍 커널 실행의 차이점을 이해하려고합니다.CUDA 타이머 - CPU 대 GPU?

http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/ 섹션 8.1에서 유일한 차이점은 호출이 비동기이기 때문에 CPU 타이머를 사용할 때 GPU를 동기화하는 것을 기억해야한다는 것입니다. 아마도 CUDA 이벤트 API가이를 수행합니다.

그래서이 정말 문제입니다 : 당신은 본질적으로 플랫폼 독립적 인 타이밍 API를 얻을 명시 적으로 GPU 이벤트와 cudaDeviceSynchronize

  • 를 호출 할 필요는 없다 GPU 이벤트와

    1. 는 CPU와 동안 OS 당 별도의 API를 사용해야합니다.

    ?

    미리 감사드립니다.

  • 답변

    2

    당신은 그것을 가지고 있습니다. GPU는 CPU와 비동기 적으로 작동하기 때문에 GPU 커널을 시작하면 CPU가 즐겁게 계속할 수 있습니다. 타이밍이 맞으면 GPU가 커널에서 복귀하기 전에 타이밍 코드의 끝에 도달 할 수 있습니다 (즉, 기간을 기록). 이것이 우리가 CPU 코드로 전진하기 전에 커널이 완료되었는지를 확인하기 위해 동기화하는 이유입니다. 이는 다음 작업 (예 : 알고리즘의 단계)을 위해 GPU 커널의 결과가 필요할 때 특히 중요합니다.

    도움이된다면 CPU 타이머는 CPU와 GPU 코드에 따라 다르기 때문에 cudaEventSynchronize은 CPU-GPU의 동기화 지점으로 생각할 수 있습니다. 반면 쿠다 타이머 이벤트는 GPU 코드에만 의존합니다. 그리고 이러한 큐다 타이밍 이벤트는 CUDA 플랫폼을 위해 nvcc에 의해 컴파일되기 때문에 CPU 플랫폼에 독립적이지만 GPU 플랫폼에 따라 다릅니다.

    +3

    일반적으로 귀하의 답변에 동의하며 OP가 기본적으로 올바른 개념을 가지고 있다는 데 동의합니다. 그러나 나는이 문장에 동의하지 않는다 : "cuda 타이머 이벤트는 GPU 코드에만 의존하는 반면". 리눅스에서는 적어도 호스트 코드 인 코드 주위에 큐다 타이머 이벤트를 래핑 할 수 있습니다 (심지어 cudaEvents 타이밍 메커니즘 이외에도 내 프로그램에 CUDA가 필요하지 않음). 호스트 코드의 지속 시간을 정확하게 나타납니다. , 내가 말할 수있는 것에서. 따라서 cudaEvents는 경과 시간을 목적으로 발생하는 CPU와 GPU 코드의 상위 집합을 시간이 지날 것입니다. –

    +0

    좋은 지적. 당신이 그 사실을 발견 한 유일한 사람이 아닌 것 같습니다. 해당 SO 질문 [여기] (http://stackoverflow.com/a/5846331/832648)를 참조하십시오. – Justin