2013-09-22 2 views
1

Я делаю асинхронную memcpy от gpu0 до gpu1 с помощью cudaMemcpyPeerAsync().Как определить поток целевого устройства в cudaMemcpyPeerAsync()?

cudaMemcpyAsync() предоставляет возможность использования потока для gpu0, но не для gpu1. Могу ли я каким-то образом определить поток принимающего устройства?

Я использую потоки OpenMP для управления каждым из устройств (поэтому они находятся в отдельном контексте).

Визуальная Profiler показывает поток для отправки устройства, но и для принимающего устройства, это тетср просто показана в тетсру (PTOP), а не в каком-либо из потоков (даже в потоке по умолчанию)

PS: Мой текущая реализация работает нормально. Я просто хочу перекрывать отправку и получение сообщения.

+0

Чтобы определить целевой поток, вы должны иметь некоторую синхронизацию между потоками в отдельных графических процессорах, что, по моему мнению, не является возможным и противоречило бы «асинхронному» характеру API. Возможно, вы достигнете перекрытия между отправкой и получением сообщений в зависимости от используемых вами графических процессоров и, в частности, если у них есть два механизма копирования. – JackOLantern

+0

Привет, Джек. Спасибо за ваш ответ. Да, у них есть два механизма копирования (я использую 4 К10 графических процессоров). Во время серфинга я обнаружил, что событие/поток одного графического процессора можно запросить у другого графического процессора. Попытка реализовать это, вернется с результатами. –

+0

Что означает «Я просто хочу перекрывать отправку и получение связи» в этом контексте? Что такое отправка и что получает, и как они могут пересекаться? – talonmies

ответ

1

Нет вызова API для одноранговой копии cuda, которая позволяет указывать потоки с обоих концов. Простой ответ на ваш вопрос - нет.

Потоки - это способ организации деятельности. Вызов cudaMemcpyPeerAsync будет отображаться в потоке (и устройстве), которому он назначен. Это уровень контроля, который у вас есть с API.

Поскольку потоки диктуют (то есть контролируют, регулируют) поведение, будучи в состоянии назначить задачу cuda для разделения потоков (в этом случае на более чем одном устройстве) это уровень управления, который не отображается в CUDA. Устройства (и потоки) предназначены для работы асинхронно и требуют, чтобы конкретная задача cuda удовлетворяла требованиям двух отдельных потоков (на двух отдельных устройствах в этом случае) вводила бы тип синхронизации, которая не подходит, и может привести к различные виды деятельности киосков и, возможно, даже тупик.

Ничто из описания здесь, ни поведение cudaMemcpyPeerAsync не должно препятствовать дублированию операций копирования в разных направлениях. На самом деле, на мой взгляд, назначение задачи cuda более чем одному потоку затруднит достижение гибкого перекрытия.

Если у вас возникли трудности с достижением определенного перекрытия, вы должны, вероятно, описать проблему (то есть предоставить простой регенератор полный компилируемый код SSCCE.org) и показать текущий сценарий перекрытия, который показывает визуальный профайлер, и описать желаемое перекрытие сценарий.

Смежные вопросы