2013-10-09 2 views
2

Я понимаю, что когда операция копирования между хостом и устройством начинается с использования cudaMemcpy, указатель узла закрепляется автоматически. Тогда в чем смысл и необходимость наличия отдельного API cudAHostAlloc() для выделения закрепленной памяти хоста?Прикрепленная память в CUDA и cudamemcpy()

+3

Я думаю, что ваше понимание неверно. Копирование в нерастянутую память включает в себя промежуточный буфер, управляемый драйверами, поэтому он медленнее. – talonmies

+0

Значит, вы имеете в виду от хоста, данные сначала помещаются в управляемый драйвер (закрепленный) буфер, а затем оттуда он переносится на устройство? – gpuguy

+0

@gpuguy: да. Вы можете выделить свой собственный буфер хранения cudaMallocHost() и использовать события CUDA для написания своей собственной подпрограммы memcpy. http://cudahandbook.to/GH9evr – ArchaeaSoftware

ответ

2

Две операции не совпадают, и указатель хоста, который вы проходите до cudaMemcpy, не «закреплен автоматически».

Для передачи из доступной памяти памяти устройства host memory is copied to a staging buffer. Затем промежуточным буфером является цель любых передач.

Это делает переносимую для переносимой памяти память медленнее (обычно), чем перенос с закрепленных буферов памяти. Использование закрепленной памяти также allows for other possibilities, например, наличие сопоставленной памяти, которая напрямую доступна устройству, без явной (API-уровня) передачи.

Смежные вопросы