현재 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();
및 실행 시간 결과의 스크린 샷입니다 :
커널 시작은 비동기식이므로 타이밍이 잘못되었습니다. – talonmies