2016-08-19 2 views
0

다음 코드에서는 크기가 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를 적용 할 때 코드를 실행하면 다른 두 행렬보다 많습니다.

누구든지이 결과의 원인을 찾아 낼 수 있습니까?

+0

동기화 메서드를 호출하지 않으면 함수를 시작하는 데 걸리는 시간 만 측정됩니다. 작업이 반드시 완료되지는 않습니다. 운전자가 워밍업 중이거나 일부 cuda 커널을 적절한 이진 형식으로 컴파일하는 중이기 때문에 첫 번째 작업은 훨씬 느립니다. –

+3

이것은 cublas 라이브러리 시작 오버 헤드의 대부분 일 가능성이 있습니다. 코드에서 첫 번째 cublas 호출입니까? 당신의 코드에는 아마도 cublas 핸들 초기화가 있습니다. 이러한 핸들 초기화를 cublasSetMatrix 호출 이전의 지점으로 이동 한 다음 타이밍이 바뀌는 지 확인하십시오. –

+0

@RobertCrovella 전 cublasSetMatrix 전에 핸들 초기화를 사용했습니다. 이제는 모든 실행 시간이 매우 비슷합니다. 답으로 답글을 써서 정답으로 표시해주세요. – starrr

답변

2

일반적으로 CUDA 프로그램의 첫 번째 CUDA API 호출은 시작 오버 헤드가 발생합니다. CUDA 런타임은 모든 것을 초기화하는 데 시간이 필요합니다.

CUDA 라이브러리가 사용될 때마다 라이브러리 초기화와 관련하여 일회성 추가 시작 오버 헤드가 발생합니다. 이 오버 헤드는 첫 번째 라이브러리 호출의 타이밍에 영향을주기 위해 종종 관찰됩니다.

여기에 무슨 일이 일어나고있는 것 같습니다. 다른 cuBLAS API를 처음 측정하기 전에 호출하면 시작 비용이 이전 호출로 옮겨 졌으므로 더 이상 cublasSetMatrix() 호출에서 측정하지 않습니다.

관련 문제