2016-07-22 2 views
0

현재 CPU와 GPU의 실행 시간을 비교하기 위해 2 개의 이미지 (크기 : 2560x1706 픽셀)의 픽셀 단위로 간단한 차이를 계산하는 Cuda 코드를 작업 중입니다.이상한 Cudamemcpy 실행 시간

커널의 1000 회 반복 실행에 더 많은 실행 시간이 필요하다는 것을 깨닫고, 계산 된 데이터를 검색하기 위해 루프 다음에 곧바로 cudaMemcpy (장치에서 호스트로)를 수행합니다.

그러나이 cudaMemcpy의 실행 시간은 예상보다 높은 2800 밀리 초가 걸렸습니다. 나는 왜 내가 왜 그런 결과를 얻는 지 스스로에게 묻고 있었다. 여기

cudaProfilerStart(); 

    // Cuda allocation 
    cudaMalloc((void**)&dev_data1, N*sizeof(unsigned char)); 
    cudaMalloc((void**)&dev_data2, N*sizeof(unsigned char)); 
    cudaMalloc((void**)&dev_data_res, N*sizeof(int)); 

    // Cuda memory copy 
    cudaMemcpy(dev_data1, img1->data, N*sizeof(unsigned char), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_data2, img2->data, N*sizeof(unsigned char), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_data_res, imgresult->data, N*sizeof(int), cudaMemcpyHostToDevice); 

    //Simulate nb_loops images 
    for(int m = 0; m < nb_loops ; m++) 
    { 
     diff<<<blck_nb, thrd_nb>>>(dev_data1, dev_data2, dev_data_res); 
     //printf("%4d", m); 
    } 


    printf("WAITING FOR MEMCPY...\n"); 

    clock_t begin = clock(), diff; 

    cudaMemcpy(imgresult_data, dev_data_res, N*sizeof(int), cudaMemcpyDeviceToHost); 

    diff = clock() - begin; 
    float msec = diff*1000/CLOCKS_PER_SEC; 
    printf("\t \nTime of the MEMCPY : %2.3f ms\n", msec); 

    printf("MEMCPY DEVICE TO HOST OK!\n"); 

    cudaProfilerStop(); 

및 실행 시간 결과의 스크린 샷입니다 :

screenshot

+0

커널 시작은 비동기식이므로 타이밍이 잘못되었습니다. – talonmies

답변

2

여기

__global__ void diff (unsigned char *data1 ,unsigned char *data2, int *data_res) 
{ 
    int v = threadIdx.x + blockIdx.x*blockDim.x; 

    if (v < N) 
    { 
    data_res[v] = (int) data2[v] - (int) data1[v]; 
    } 
} 

커널 호출입니다 : 여기

내 커널 코드입니다 CUDA 커널 출시는 비동기이며 cudaMemcpy은 차단 호출입니다. 그래서 memcpy 시간을 호출하는 것은 실제로 커널 실행 + memcpy tiime입니다. 다음과 같이 코드를 변경하십시오.

이시기가 맞아야합니다.

+0

이것은 효과적으로 cudaDeviceSynchronize()를 어설 션한 후 올바른 cudaMemcpy 실행 시간을주었습니다. 그러나 NVIDIA GT720을 사용하며 GPU 실행 시간은 CPU 실행 시간보다 단지 6 배 정도 빠릅니다. 그것에 대해 어떻게 생각하세요? 100 배 빠른 것과 같지 않아야합니까? 그것은 일관되게 보입니까? 도움 주셔서 감사합니다. – Flow

+0

@Flow : NVIDIA가 생산하는 가장 느린 GPU 모델 중 가장 느린 곳에서 코드를 실행하고 있습니다. 6 배의 속도 향상은 전적으로 합리적입니다. 수 백 번은 그렇지 않습니다. – talonmies