2016-02-01 6 views
0

У меня не было необходимости использовать данные memcpy между двумя графическими процессорами. Теперь, я предполагаю, что я собираюсь сделать это с cudaMemcpy() и cudaMemcpyDeviceToDevice флагом, но:cudaMemcpy D2D флаг - семантика w.r.t. несколько устройств, и это необходимо?

  • является cudaMemcpyDeviceToDevice флагом, используемым как для копирования данных в пространстве памяти одном устройства и между пространствами памяти все устройства?

Если,

  • Как указатели на память на разные устройства отличаются? Используется ли специфика механизма Unified Virtual Address Space?

И если это так, то

  • Почему даже есть H2D, D2H, D2D флаги на всех для cudaMemcpy? Не нужно ли проверять, какое устройство ему нужно адресовать?
  • Нельзя ли использовать версию cudaMemcpy без флага, используя cuGetPointerAttribute() от низкоуровневого драйвера CUDA?

ответ

2

Для устройств с UVA, вы можете использовать описанный вами механизм. This doc section может представлять интерес (как описывающий передачу устройства на устройство, так и последующий раздел по последствиям UVA). В противном случае имеется cudaMemcpyPeer()API, который имеет несколько другую семантику.

Как отличаются указатели на память на разных устройствах? Использует ли он специфику механизма единого виртуального адресного пространства?

Да, см. Разделы с предшествующими ссылками.

Почему вообще существуют флагов H2D, D2H, D2D для cudaMemcpy? Не нужно ли проверять, какое устройство ему нужно адресовать?

cudaMemcpyDefault является передача флага, который был добавлен, когда УФА впервые появилась, чтобы позволить использование в общем-помеченных переводах, где направление выводятся посредством среды выполнения после проверки поставляемых указателей.

Нельзя ли использовать версию cudaMemcpy без флага, используя cuGetPointerAttribute() из низкоуровневого драйвера CUDA?

Я предполагаю, что описанный выше описанный выше общий метод соответствует всем вашим потребностям (или, возможно, я не понимаю этот вопрос).

Такие обсуждения могут породить вопрос «Почему я когда-либо использовал ничего, кроме cudaMemcpyDefault»?

  1. Одна из возможных причин я могу думать, чтобы использовать явный флаг будет то, что во время выполнения API будет делать явную проверку ошибок, если вы укажете явный флаг.Если вы уверены, что данный вызов cudaMemcpy всегда будет в направлении передачи H2D, например, тогда явным образом использование cudaMemcpyHostToDevice приведет к тому, что API среды выполнения вызовет ошибку, если указанные указатели не соответствуют указанному направлению. Прилагаете ли вы какую-либо ценность к такой концепции, вероятно, это вопрос мнения.

  2. По сути меньшего значения коды (ИМО), которая использует явные флаги не зависит от UVA в наличии, но такое выполнение сценариев «исчезают» с новыми средами

+0

Так просто быть ясно, - 'cudaMemcpy (... cudaMemcpyDefault)' будет делать одноранговую копию и внутриуровневое копирование, когда устройства поддерживают UVA? – einpoklum

+2

внутри устройство, да. между отдельными устройствами, да. Чтобы включить GPUDirect v2 P2P, вы должны явно включить P2P перед выполнением переноса. См. Коды образцов P2P. –