Хобрук: Ваш путь к мастерству в программировании

Какой номер устройства следует использовать (0 или 1) для копирования P2P (GPU0->GPU1)?

Какое количество устройств я должен установить 0 или 1 в cudaSetDevice();, чтобы скопировать P2P (GPU0->GPU1) с помощью cudaStreamCreate(stream); cudaMemcpyPeerAsync(p1, 1, p0, 0, size, stream);?

Код:

// Set device 0 as current
cudaSetDevice(0); 
float* p0;
size_t size = 1024 * sizeof(float);
// Allocate memory on device 0
cudaMalloc(&p0, size); 
// Set device 1 as current
cudaSetDevice(1); 
float* p1;
// Allocate memory on device 1
cudaMalloc(&p1, size); 
// Set device 0 as current
cudaSetDevice(0);
// Launch kernel on device 0
MyKernel<<<1000, 128>>>(p0); 

// What number do I must to set 0 or 1?
cudaSetDevice(1); // cudaSetDevice(0); 
cudaStream_t stream;
cudaStreamCreate(stream);

// Copy p0 to p1
cudaMemcpyPeerAsync(p1, 1, p0, 0, size, stream); 
cudaStreamSynchronize(stream);

// Launch kernel on device 1
cudaSetDevice(1); 
MyKernel<<<1000, 128>>>(p1);

ОБНОВЛЕНИЕ 31.03.2014: Или текущий контекст важен только для __global__ kernel_function(), но не для cudaMemcpyPeerAsync()? А для cudaMemcpyAsync() и cudaMemcpyPeerAsync() важно только то, что поток был создан для устройства, из (исходного указателя) которого копируются данные, не так ли?

29.03.2014

  • Я не думаю, что это имеет значение. Вы устанавливаете как srcDevice, так и destDevice в аргументах функции, чтобы не было двусмысленности в отношении того, в каком контексте устройства работать. 30.03.2014
  • Я думаю, что этот момент уже обсуждался в В чем разница между cudaMemcpy() и cudaMemcpyPeer() для P2P-копирования? после явного комментария OP. 30.03.2014
  • @JackOLantern Вы сказали, что мне не нужно указывать устройство и в этом случае. Но, как сказано здесь, если я использую поток в контексте (в примере 1), который создан в другом контексте (в примере 0), я получу ошибку: stackoverflow.com/a/22444170/1558037 30.03.2014
  • @Alex Вы должны видеть вещи с другой стороны. По упомянутой вами причине вы должны убедиться, что stream, который вы используете в качестве аргумента для вызова cudaMemcpyPeerAsync, был создан для устройства, которое является источником передачи. 30.03.2014

Ответы:


1

В вызове cudaMemcpyPeerAsync вы можете указать не по умолчанию stream. Итак, ваш первый вопрос: какое устройство я должен установить с помощью cudaSetDevice перед вызовом cudaMemcpyPeerAsync?

Ответ заключается в том, что вы должны установить cudaSetDevice устройство, для которого было создано stream. Вы можете использовать stream, созданный для исходного или целевого устройства. Хотя, насколько мне известно, явно не упоминается в документация, об этой возможности можно судить по ответу Роберта Кровелла на Как определить поток целевого устройства в cudaMemcpyPeerAsync()?. Обратите внимание, что по состоянию на 2011 год и согласно При программировании производительность максимальна, когда stream принадлежит исходному графическому процессору.

Напомню некоторые важные моменты при использовании streams в рамках multi-GPU, позаимствованные из Программирование для нескольких графических процессоров и которые поддерживают приведенные выше утверждения:

  1. CUDA streams на устройство;
  2. streams определяются GPU, который был текущим на момент их создания;
  3. Звонки на stream могут выполняться только тогда, когда его устройство активно.
01.04.2014
Новые материалы

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

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..