Виды передачи cudaMemcpy: по умолчанию против HostToDevice / DeviceToHost - PullRequest
2 голосов
/ 02 апреля 2019

cudaMemcpy позволяет программистам явно указывать направление передачи памяти.

Есть ли преимущество ручного указания направления передачи памяти (cudaMemcpyDeviceToHost / cudaMemcpyHostToDevice / cudaMemcpyDeviceToDevice) вместо того, чтобы позволить cuda автоматически выводить (cudaMemcpyDefault) из значений указателя?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

tl; dr: Почти наверняка нет преимущества.

cudaMemcpyDefault был добавлен IIRC, когда графические процессоры стали легко идентифицировать пространство памяти путем проверки адреса («Унифицированная виртуальная адресация»). Перед этим вам нужно было указать направление. См., Например, документацию CUDA 3, доступную здесь . Ищите cudaMemcpyKind в справочнике по API - нет по умолчанию, просто H2H, H2D, D2H и H2H.

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

Я не уверен на 100%, что нет никакой разницы, это просто очень разумно; и, судя по анекдотическому личному опыту, я не видел никаких преимуществ / различий. Конечно, копирование не происходит быстрее.

1 голос
/ 02 апреля 2019

Из документов cudaMemcpy():

[...] Рекомендуется пропуск cudaMemcpyDefault, и в этом случае тип передачи определяется по значениям указателя.Однако cudaMemcpyDefault разрешено только в системах, которые поддерживают унифицированную виртуальную адресацию.[...]

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

Вы можете запроситьесли ваша система поддерживает это с

cudaGetDeviceProperties() со свойством устройства cudaDeviceProp::unifiedAddressing.

...