В следующем коде я использую функцию 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 на первой матрице больше, чем две другие матрицы, хотя размер всех матриц одинаковый, и они заполняются случайными числами.
Может кто-нибудь, пожалуйста, помогите мне узнать, в чем причина этого результата?
Если вы не вызываете метод синхронизации, вы измеряете только время, необходимое для * запуска * функции. Операция не обязательно завершена. Первая операция намного медленнее, потому что драйвер либо разогревает, либо компилирует ядра куды «на лету» в соответствующий двоичный формат. –
Это, скорее всего, часть служебных ресурсов библиотеки cublas. Являются ли они первыми вызовами cublas в вашем коде? Возможно, ваш код также имеет инициализацию дескриптора cublas. Попробуйте переместить инициализацию дескриптора в точку перед этими вызовами cublasSetMatrix, а затем посмотрите, меняется ли синхронизация. –
@RobertCrovella Я использовал инициализацию дескриптора перед cublasSetMatrix, теперь все время работы очень похоже. Пожалуйста, напишите свой комментарий как ответ, чтобы я мог отметить его как правильный ответ. – starrr