2016-06-21 2 views
-1

정상 CUDA 프로그램 :cudaDeviceSynchronize가 memcopy 시간을 줄일 수 있습니까?

  1. 콜 커널
  2. 메모리 복사 장치는
  3. 호스트 장치에 호스트에서 CUDA 장치에
  4. 메모리 복사본을 메모리 공간을 할당 ... 등

그래서 호스트를 장치 시간으로 측정 할 경우

time = clock(); 
    2. mem host to device; 
    cudaDeviceSynchronize; 
    time = clock() - time ; 

그리고 필자의 경우 0.1 초의 값을 얻습니다. 내 PCI ​​버스 속도는 실제로는 24GB/s로 1000 시간보다 작은 시간 값을 산출한다고 가정하기 때문에 PCI 버스를 활성화하는 데 사용되는 시간은 0.1 초라고 가정합니다.

그래서 나는 1000 시간의 장치 시간에 호스트를 루프하려고 시도했다. 처음에는 0.1 초를 보여 주었고 나머지 시간은 단지 0.000 초 (밀리 초를 초과 할 수 없다)였다. 1000 루프의 시간은 단지 0.12 초입니다.

그래서 장치 시간까지 호스트를 줄이기 위해 내 장치 PCI 버스를 활성화해야합니다. 다음과 같이 전 cudaDeviceSynchronize 사용하여 시도 :

cudaDeviceSynchronize; //---to keep PCI bus activate 
    time = clock(); 
    2. mem host to device; 
    cudaDeviceSynchronize; 
    time = clock() - time ; 

내가 얻는 시간은 호스트 장치에 소요되는 시간을 최소화 0.000s이다. 그 맞습니까? 0.1s = PCI 버스를 "활성화"할 시간입니까?

+2

0.1 초는 아마도 CUDA 초기화 시간입니다. –

답변

1

Robert Crovella과 같이 CUDA 기능에 대한 첫 번째 호출로 측정하는 시간은 CUDA 초기화와 관련이 있습니다.

매우 작은 기간을 측정하는 경우 함수 호출의 오버 헤드를 측정하는 것이 가장 좋습니다. 보다 중요한 숫자를 얻으려면 복사중인 메모리의 크기를 늘려야합니다.

CPU와 GPU 간의 복사 시간을 측정하려면 documentation에 설명 된 고정 된 메모리로 확실히 재생해야합니다.