#linux #cuda #gpu #interprocess #cuda-context
#linux #cuda #графический процессор #межпроцессный #cuda-context
Вопрос:
Я хотел бы передать контекст Cuda между двумя независимыми процессами Linux (используя очереди сообщений POSIX, которые я уже настроил).
Используя cuCtxPopCurrent()
и cuCtxPushCurrent()
, я могу получить указатель контекста, но на этот указатель есть ссылка в памяти процесса, в котором я вызываю функцию, и передавать его между процессами бессмысленно.
Я ищу другие решения. Мои идеи на данный момент таковы:
- Попробуйте глубоко скопировать
CUcontext
структуру, а затем передать копию. - Посмотрим, смогу ли я найти решение с общей памятью, где все мои указатели Cuda размещены там, чтобы оба процесса могли получить к ним доступ.
- Объедините процессы в одну программу.
- Возможно, что в 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.