Возможно ли совместное использование контекста Cuda между приложениями?

#linux #cuda #gpu #interprocess #cuda-context

#linux #cuda #графический процессор #межпроцессный #cuda-context

Вопрос:

Я хотел бы передать контекст Cuda между двумя независимыми процессами Linux (используя очереди сообщений POSIX, которые я уже настроил).

Используя cuCtxPopCurrent() и cuCtxPushCurrent() , я могу получить указатель контекста, но на этот указатель есть ссылка в памяти процесса, в котором я вызываю функцию, и передавать его между процессами бессмысленно.

Я ищу другие решения. Мои идеи на данный момент таковы:

  1. Попробуйте глубоко скопировать CUcontext структуру, а затем передать копию.
  2. Посмотрим, смогу ли я найти решение с общей памятью, где все мои указатели Cuda размещены там, чтобы оба процесса могли получить к ним доступ.
  3. Объедините процессы в одну программу.
  4. Возможно, что в Cuda 4.0 есть лучшее совместное использование контекста, на которое я мог бы переключиться.

Я не уверен, что вариант (1) возможен, и если (2) доступен или возможен. (3) на самом деле это не вариант, если я хочу сделать вещи универсальными (это в рамках оболочки hijack). (4) Я посмотрю на Cuda 4.0, но я не уверен, будет ли это работать и там.

Спасибо!

Ответ №1:

Одним словом, нет. Контексты неявно привязаны к потоку и приложению, которые их создали. Нет возможности переноса между отдельными приложениями. Это практически то же самое с OpenGL и различными версиями Direct3D — совместное использование памяти между приложениями не поддерживается.

CUDA 4 делает API потокобезопасным, так что один поток хоста может одновременно содержать более 1 контекста (т. Е. более 1 графического процессора) и использовать canonical device selection API для выбора, с каким графическим процессором он работает. Здесь это не поможет, если я правильно понимаю ваш вопрос / приложение.

Комментарии:

1. Понял — спасибо! Мне нужно будет выяснить, как объединить мои приложения, или попросить кого-нибудь позаботиться о вызовах Cuda.