Лимитирующим фактором в любых вычислениях на видеокарте является передача данных из ОЗУ в видеокарту и обратно. Попробуем оценить это время.

Скорость передачи ОЗУ ↔ видеопамять

Попробуем измерить скорость передачи данных «в» и «из» видеопамяти. Код очень прост — используем только функцию cudaMemcpy.

int count = 65536 * 1024 * 4;
int size = sizeof(int) * count;

int *cpu_a = (int *)malloc(size);	int *gpu_a; cudaMalloc((void**)&gpu_a, size);

for(int i = 0; i < count; i++) cpu_a[i]=1;

printf("size: %.3f GBn", size/1024.0/1024.0/1024.0);

long long tm1 = -gettimeus();
cudaMemcpy(gpu_a, cpu_a, size, cudaMemcpyHostToDevice);
tm1 += gettimeus();	
printf("DRAM -> GDRAM: %lld ms. speed: %.3f GB/sn", tm1/1000, size/tm1/1000.0);

long long tm2 = -gettimeus();
cudaMemcpy(cpu_a, gpu_a, size, cudaMemcpyDeviceToHost);
tm2 += gettimeus();
printf("DRAM <- GDRAM: %lld ms. speed: %.3f GB/sn", tm2/1000, size/tm2/1000.0);

free(cpu_a);	cudaFree(gpu_a);

Скорость копирования между памятью компьютера и видеокарты

Как видим, скорость примерно равна 4 гигабайтам в секунду или 32 гигабитам/с (при измерении скорости интерфейсов всегда используют только десятичные приставки). Много это или мало? Да честно говоря, не очень много. Однако, на пути данных есть несколько интерфейсов, и какой-то из них может оказаться бутылочным горлышком. Перечислим их все:

Видеопамять GDDR5 имеет скорость 80 Гб/с;

Интерфейс PCI-Express 3.0 x16 — 128 Гб/с;

Измеренная скорость передачи DRAM -> DRAM составила 27 Гб/с;

Похоже, производительность упёрлась в скорость ОЗУ.

UPD:

Очень большую роль играет выбор порта PCI-Express. Эксперименты проводились на чипсете Z77 и видеокарте GTX650. Если вставить её в «PCI-Express1″ — скорость обмена будет около 4 ГБ/с и выше. Если же использовать порт «PCI-Express2″ — скорость упадёт до 1.5-1.7 ГБ/с. Для работы с CUDA используйте только PCI-Express1!