2014-03-03 2 views
0

추력 루틴이 차단 중이거나 차단되지 않는다고 말할 수 있습니까? - 2추력 변환 성능 번호

clock_t start,end; 
start = clock(); 
thrust::transform(a.begin(), a.end(), b.begin(), thrust::negate<int>()); 
cudaThreadSynchronize(); 
end = clock(); 

코드 -1

clock_t start,end; 
start = clock(); 
thrust::transform(a.begin(), a.end(), b.begin(), thrust::negate<int>()); 
end = clock(); 

코드 : 나는 그것을 시간이 할 , 여기에 코드 snippets-

코드 -1입니다 코드 스 니펫 -2에 비해 매우 짧은 시간이 걸립니다.왜 이런 일이 발생합니까? 어느 쪽이 추력 루틴을 시간 측정 할 수있는 올바른 방법인지 알기 쉽게 그것을 내 병렬 코드와 비교할 수 있습니다.

답변

4

나는 트러스트가 어떤 API가 블로킹하고 어디서나 블로킹이 문서에 정의되어 있지 않다고 믿지 않는다. 그러나 예제와 같은 변환 호출은 단일 백엔드 클로저 작업 (호스트 장치 데이터 복사본이없는 단일 커널 호출로 변환 됨)에서 실행되어야하며 비동기이어야합니다.

두 번째 코드는 시간 추력 작업에 올바른 방법에 가까운,하지만 낮은 해상도 시간 원본을 사용하여

  1. clock()는 일반적으로 구현되는 점에 유의하고 이러한 유형의 작업 타이밍에 대한 아마도 적합하지 않습니다 . 더 높은 해상도의 호스트 소스 타이머를 찾아야하며, CUDA 이벤트 API를 사용하여 코드를 수행하는 것이 더 좋습니다. 이 API를 사용하는 방법의 예를 볼 수 있습니다 in this question-answer pair.
  2. cudaThreadSynchronize은 CUDA 4.0 릴리스에서 더 이상 사용되지 않는 API입니다. 대신 cudaDeviceSynchronize을 사용해야합니다.