CudaMemcpy от хоста к устройству выполняется параллельно? - PullRequest
5 голосов
/ 13 января 2012

Мне интересно, выполняется ли cudaMemcpy на процессоре или графическом процессоре при копировании с хоста на устройство?

Иными словами, это копия последовательного процесса или это делается параллельно?

Позвольте мне объяснить, почему я спрашиваю это: у меня есть массив из 5 миллионов элементов. Теперь я хочу скопировать 2 набора из 50 000 элементов из разных частей массива. Итак, я подумал, будет ли быстрее сначала сформировать большой массив всех элементов, которые я хочу скопировать на ЦП, а затем выполнить только одну большую передачу или мне нужно просто вызвать 2 cudaMemcpy, по одному для каждого набора.

Если cudaMemcpy выполняется параллельно, то я думаю, что второй подход будет быстрее, так как вам не нужно сначала копировать 100000 элементов последовательно на ЦП

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Мне интересно, выполняется ли cudaMemcpy на процессоре или графическом процессоре при копировании с хоста на устройство?

В случае синхронного вызова API с обычной страницей, выделенной пользователем, выделенной памятиответ он работает на обоих .Драйвер должен сначала скопировать данные из исходной памяти в исходный буфер, сопоставленный с DMA на хосте, а затем сообщить GPU, что данные ожидают передачи.Затем графический процессор выполняет передачу.Процесс повторяется столько раз, сколько необходимо для полного копирования из исходной памяти в графический процессор.

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

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

0 голосов
/ 13 января 2012

Я считаю, что перевод с хоста на память GPU является блокирующим вызовом.Он использует всю шину и, как таковой, на самом деле не имеет смысла (даже если это было физически возможно) запускать несколько операций параллельно.

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

...