Для устройств с UVA, вы можете использовать описанный вами механизм. This doc section может представлять интерес (как описывающий передачу устройства на устройство, так и последующий раздел по последствиям UVA). В противном случае имеется cudaMemcpyPeer()
API, который имеет несколько другую семантику.
Как отличаются указатели на память на разных устройствах? Использует ли он специфику механизма единого виртуального адресного пространства?
Да, см. Разделы с предшествующими ссылками.
Почему вообще существуют флагов H2D, D2H, D2D для cudaMemcpy? Не нужно ли проверять, какое устройство ему нужно адресовать?
cudaMemcpyDefault
является передача флага, который был добавлен, когда УФА впервые появилась, чтобы позволить использование в общем-помеченных переводах, где направление выводятся посредством среды выполнения после проверки поставляемых указателей.
Нельзя ли использовать версию cudaMemcpy без флага, используя cuGetPointerAttribute() из низкоуровневого драйвера CUDA?
Я предполагаю, что описанный выше описанный выше общий метод соответствует всем вашим потребностям (или, возможно, я не понимаю этот вопрос).
Такие обсуждения могут породить вопрос «Почему я когда-либо использовал ничего, кроме cudaMemcpyDefault
»?
Одна из возможных причин я могу думать, чтобы использовать явный флаг будет то, что во время выполнения API будет делать явную проверку ошибок, если вы укажете явный флаг.Если вы уверены, что данный вызов cudaMemcpy
всегда будет в направлении передачи H2D, например, тогда явным образом использование cudaMemcpyHostToDevice
приведет к тому, что API среды выполнения вызовет ошибку, если указанные указатели не соответствуют указанному направлению. Прилагаете ли вы какую-либо ценность к такой концепции, вероятно, это вопрос мнения.
По сути меньшего значения коды (ИМО), которая использует явные флаги не зависит от UVA в наличии, но такое выполнение сценариев «исчезают» с новыми средами
Так просто быть ясно, - 'cudaMemcpy (... cudaMemcpyDefault)' будет делать одноранговую копию и внутриуровневое копирование, когда устройства поддерживают UVA? – einpoklum
внутри устройство, да. между отдельными устройствами, да. Чтобы включить GPUDirect v2 P2P, вы должны явно включить P2P перед выполнением переноса. См. Коды образцов P2P. –