Как определить поток устройства назначения в cudaMemcpyPeerAsync()?
Я делаю асинхронный memcpy от gpu0 до gpu1 с помощью cudaMemcpyPeerAsync ().
cudaMemcpyAsync () предоставляет возможность использования потока для gpu0, но не для gpu1. Можно ли как-то определить поток принимающего устройства тоже?
Я использую потоки OpenMP для управления каждым из устройств (поэтому они находятся в отдельном контексте).
Visual Profiler показывает поток для отправляющего устройства, но для принимающего устройства, этот memcpy только что показан в MemCpy (PtoP), а не в каком-либо из потоков (даже в потоке по умолчанию)
PS: моя текущая реализация работает нормально. Я просто хочу перекрывать отправку и получение сообщения.
1 ответ
Нет вызова API для копии cuda peer, которая позволяет вам определять потоки на обоих концах. Простой ответ на ваш вопрос - нет.
Потоки - это способ организации деятельности. Вызов cudaMemcpyPeerAsync будет отображаться в потоке (и устройстве), которому он назначен. Это уровень контроля, который вы имеете с API.
Поскольку потоки диктуют (то есть управляют, регулируют) поведение, возможность назначать задачу cuda отдельным потокам (в данном случае более чем на одном устройстве) является уровнем управления, который не представлен в CUDA. Устройства (и потоки) предназначены для асинхронной работы, и требование, чтобы конкретная задача cuda удовлетворяла требованиям двух отдельных потоков (в данном случае на двух отдельных устройствах), привело бы к типу синхронизации, который не подходит и может привести к различные виды деятельности киосков, и, возможно, даже тупик.
Ни приведенное здесь описание, ни поведение cudaMemcpyPeerAsync не должны препятствовать перекрытию операций копирования в разных направлениях. На самом деле, на мой взгляд, назначение задачи cuda более чем одному потоку затруднит достижение гибкого перекрытия.
Если у вас возникают трудности с достижением определенного перекрытия, вам, вероятно, следует описать проблему (т. Е. Предоставить простой воспроизводимый полный код SSCCE.org) и показать текущий сценарий перекрытия, который показывает визуальный профилировщик, и описать желаемый сценарий перекрытия.