Я пытаюсь выяснить, имеет ли смысл копировать данные в закрепленную память перед их передачей на устройство, поскольку я не имею никакого влияния на распределение моих входных данных (это библиотека).
std::vector<int> idata(WORK_SIZE);
int *idata_aligned = NULL;
int *d1 = NULL;
int *d2 = NULL;
for (int i = 0; i < WORK_SIZE; ++i)
idata[i] = i;
CUDA_CHECK_RETURN(cudaMalloc((void**) &d1, sizeof(int) * WORK_SIZE));
CUDA_CHECK_RETURN(cudaMalloc((void**) &d2, sizeof(int) * WORK_SIZE));
printf("unpinned:\n");
{
boost::timer::auto_cpu_timer t;
CUDA_CHECK_RETURN(cudaMemcpy(d1, &idata[0], sizeof(int) * WORK_SIZE, cudaMemcpyHostToDevice));
}
printf("copy to pinned:\n");
{
boost::timer::auto_cpu_timer t;
CUDA_CHECK_RETURN(cudaHostAlloc((void**) &idata_aligned, sizeof(int) * WORK_SIZE,cudaHostAllocDefault));
memcpy(idata_aligned, &idata[0], sizeof(int) * WORK_SIZE);
CUDA_CHECK_RETURN(cudaMemcpy(d2, idata_aligned, sizeof(int) * WORK_SIZE, cudaMemcpyHostToDevice));
}
Вывод для 10 000 000 элементов:
unpinned:
0.018919s wall, 0.020000s user + 0.000000s system = 0.020000s CPU (105.7%)
copy to pinned:
0.045428s wall, 0.020000s user + 0.020000s system = 0.040000s CPU (88.1%)
Основная проблема, по-видимому, заключается в cudaHostAlloc (даже без memcpy второй подход намного медленнее).
Я сделал что-то неправильно? Есть ли другой способ использовать закрепленную память для уже выделенной памяти?