2016-08-19 3 views
0

В следующем коде я использую функцию cublasSetMatrix для 3 случайных матриц размером 200x200. Я измерил время этой функции в коде:Различное время работы для cublasSetMatrix на аналогичных матрицах

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); 

Вывод этого кода является то вроде этого:

0,121849 - 0,000131 - 0,000141

На самом деле, каждый раз, Я запускаю код, время применения cublasSetMatrix на первой матрице больше, чем две другие матрицы, хотя размер всех матриц одинаковый, и они заполняются случайными числами.

Может кто-нибудь, пожалуйста, помогите мне узнать, в чем причина этого результата?

+0

Если вы не вызываете метод синхронизации, вы измеряете только время, необходимое для * запуска * функции. Операция не обязательно завершена. Первая операция намного медленнее, потому что драйвер либо разогревает, либо компилирует ядра куды «на лету» в соответствующий двоичный формат. –

+3

Это, скорее всего, часть служебных ресурсов библиотеки cublas. Являются ли они первыми вызовами cublas в вашем коде? Возможно, ваш код также имеет инициализацию дескриптора cublas. Попробуйте переместить инициализацию дескриптора в точку перед этими вызовами cublasSetMatrix, а затем посмотрите, меняется ли синхронизация. –

+0

@RobertCrovella Я использовал инициализацию дескриптора перед cublasSetMatrix, теперь все время работы очень похоже. Пожалуйста, напишите свой комментарий как ответ, чтобы я мог отметить его как правильный ответ. – starrr

ответ

2

Обычно первый вызов API CUDA в любой программе CUDA будет нести некоторые накладные расходы на запуск - время выполнения CUDA требует времени для инициализации всего.

Всякий раз, когда используются библиотеки CUDA, при инициализации библиотеки будут появляться дополнительные однократные начальные служебные данные. Эти накладные расходы часто будут влиять на время первого вызова библиотеки.

Это похоже на то, что происходит здесь. Помещая еще один вызов cuBLAS API перед первым, который вы измеряете, вы перевели начальную стоимость запуска на предыдущий вызов, и поэтому вы больше не измеряете его по вызову cublasSetMatrix().

Смежные вопросы