Използвам cudaMemcpy()
веднъж, за да копирам точно 1 GB данни на устройството. Това отнема 5,9 секунди. Обратно отнема 5.1s. Това нормално ли е?
Самата функция има ли толкова много допълнителни разходи преди копиране? Теоретично трябва да има пропускателна способност от най-малко 4 GB/s за PCIe шината.
Няма припокриващи се прехвърляния на памет, защото Tesla C870 просто не го поддържа. Някакви съвети?
РЕДАКТИРАНЕ 2: моята тестова програма + актуализирани времена; Надявам се, че не е твърде много за четене!
Функциите cutCreateTimer()
няма да се компилират за мен: 'грешка: идентификаторът "cutCreateTimer" е недефиниран' - това може да е свързано със старата версия на cuda (2.0), инсталирана на машината
__host__ void time_int(int print){
static struct timeval t1; /* var for previous time stamp */
static struct timeval t2; /* var of current time stamp */
double time;
if(gettimeofday(&t2, 0) == -1) return;
if(print != 0){
time = (double) (t2.tv_sec - t1.tv_sec) + ((double) (t2.tv_usec - t1.tv_usec)) / 1000000.0;
printf(...);
}
t1 = t2;
}
main:
time(0);
void *x;
cudaMallocHost(&x,1073741824);
void *y;
cudaMalloc(&y, 1073741824);
time(1);
cudaMemcpy(y,x,1073741824, cudaMemcpyHostToDevice);
time(1);
cudaMemcpy(x,y,1073741824, cudaMemcpyDeviceToHost);
time(1);
Показаните времена са:
0,86 s разпределение
0,197 s първо копие
5,02 s второ копие
Странното е: въпреки че показва 0,197 s за първо копие, отнема много повече време, ако гледам как програмата работи .