CudaMemcpy и cublas блокируются в одноранговом режиме?

Я хотел бы скопировать память между двумя устройствами CUDA (с поддержкой UVA), вызвав cudaMemcpy, Мне было интересно, если вызов является синхронным по отношению к хосту? Я знаю что cudaMemcpy внутри одного устройства происходит асинхронность, но как насчет копирования между различными устройствами? Мне нужно позвонить cudaDeviceSynchronize чтобы убедиться, что копирование завершено или оно обеспечено автоматически?

У меня также есть подобный вопрос о cublas. Я хотел бы добавить вектор, хранящийся на одном устройстве, к вектору, хранящемуся на другом, поэтому я звоню cublasSaxpy для этого. Будет ли он блокировать хост до завершения операции, или мне нужно явно синхронизировать?

1 ответ

Я знаю, что cudaMemcpy в том же устройстве является асинхронным

В документации сказано: "Эта функция демонстрирует синхронное поведение в большинстве случаев". (мой акцент). Однако, хотя cudaMemcpy() действительно демонстрирует асинхронное поведение в некоторых угловых случаях, те же самые угловые случаи имеют поведение, которое отрицает это поведение. Конечным результатом является то, что вы можете положиться на cudaMemcpy() будучи синхронным, также при выполнении одноранговых копий.

Если вам нужно асинхронное поведение, вы должны позвонить cudaMemcpyAsync(),

API CUBLAS является асинхронным по большей части, в том числе cublasSaxpy, Исключением являются некоторые из вызовов, которые возвращают скаляры.

Другие вопросы по тегам