다음 코드에서는 크기가 200x200 인 3 개의 임의 행렬에 대해 함수 cublasSetMatrix를 사용합니다. 0.000131 - - 0.000141 사실유사한 행렬에서 cublasSetMatrix의 실행 시간이 다릅니다
마다
0.121849 :
이 코드의 출력이 같은clock_t t1,t2,t3,t4; int m =200,n = 200; float * bold1 = new float [m*n]; float * bold2 = new float [m*n]; float * bold3 = new float [m*n]; for (int i = 0; i< m; i++) for(int j = 0; j <n;j++) { bold1[i*n+j]=rand()%10; bold2[i*n+j]=rand()%10; bold3[i*n+j]=rand()%10; } float * dev_bold1, * dev_bold2,*dev_bold3; cudaMalloc ((void**)&dev_bold1,sizeof(float)*m*n); cudaMalloc ((void**)&dev_bold2,sizeof(float)*m*n); cudaMalloc ((void**)&dev_bold3,sizeof(float)*m*n); t1=clock(); cublasSetMatrix(m,n,sizeof(float),bold1,m,dev_bold1,m); t2 = clock(); cublasSetMatrix(m,n,sizeof(float),bold2,m,dev_bold2,m); t3 = clock(); cublasSetMatrix(m,n,sizeof(float),bold3,m,dev_bold2,m); t4 = clock(); cout<<double(t2-t1)/CLOCKS_PER_SEC<<" - "<<double(t3-t2)/CLOCKS_PER_SEC<<" - "<<double(t4-t3)/CLOCKS_PER_SEC; delete []bold1; delete []bold2; delete []bold3; cudaFree(dev_bold1); cudaFree(dev_bold2); cudaFree(dev_bold3);
이다 : 나는 코드에서이 함수의 시간을 측정 모든 행렬의 크기가 동일하고 임의의 숫자로 채워지더라도 첫 번째 행렬에서 cublasSetMatrix를 적용 할 때 코드를 실행하면 다른 두 행렬보다 많습니다.
누구든지이 결과의 원인을 찾아 낼 수 있습니까?
동기화 메서드를 호출하지 않으면 함수를 시작하는 데 걸리는 시간 만 측정됩니다. 작업이 반드시 완료되지는 않습니다. 운전자가 워밍업 중이거나 일부 cuda 커널을 적절한 이진 형식으로 컴파일하는 중이기 때문에 첫 번째 작업은 훨씬 느립니다. –
이것은 cublas 라이브러리 시작 오버 헤드의 대부분 일 가능성이 있습니다. 코드에서 첫 번째 cublas 호출입니까? 당신의 코드에는 아마도 cublas 핸들 초기화가 있습니다. 이러한 핸들 초기화를 cublasSetMatrix 호출 이전의 지점으로 이동 한 다음 타이밍이 바뀌는 지 확인하십시오. –
@RobertCrovella 전 cublasSetMatrix 전에 핸들 초기화를 사용했습니다. 이제는 모든 실행 시간이 매우 비슷합니다. 답으로 답글을 써서 정답으로 표시해주세요. – starrr