CUDA потоки и контекст - PullRequest
       6

CUDA потоки и контекст

5 голосов
/ 25 июля 2011

В настоящее время я использую приложение, которое порождает кучу pthreads (linux), и каждое из них создает свой собственный контекст CUDA.(используя cuda 3.2 прямо сейчас).

Проблема, с которой я сталкиваюсь, заключается в том, что кажется, что каждый поток, имеющий свой собственный контекст, стоит много памяти на GPU.Что-то вроде 200 МБ на поток, так что это действительно ограничивает меня.

Могу ли я просто создать потоки в потоке хоста, передать ссылку на поток рабочим потокам, которые затем смогут передать моей библиотеке CUDAномер потока, и все они работают в одном и том же контексте?

Знает ли рабочий поток автоматически тот же контекст CUDA, что и его родительский поток?

Спасибо

1 Ответ

7 голосов
/ 26 июля 2011

Каждый контекст CUDA стоит совсем немного памяти устройства, а их ресурсы строго отделены друг от друга. Например, память устройства, выделенная в контексте A, не может быть доступна контексту B. Потоки также действительны только в том контексте, в котором они были созданы.

Рекомендуется создавать один контекст CUDA для каждого устройства. По умолчанию доступ к этому контексту CUDA возможен только из потока ЦП, который его создал. Если вы хотите получить доступ к контексту CUDA из других потоков, вызовите cuCtxPopCurrent (), чтобы извлечь его из потока, который его создал. Затем контекст может быть помещен в текущий стек контекста любого другого потока ЦП, и последующие вызовы CUDA будут ссылаться на этот контекст.

Контекстное push / pop - это легковесные операции, а в CUDA 3.2 их можно выполнять в приложениях времени выполнения CUDA. Поэтому я предлагаю инициализировать контекст CUDA, а затем вызвать cuCtxPopCurrent (), чтобы сделать контекст «плавающим», если только некоторые потоки не захотят им управлять. Считайте «плавающее» состояние естественным - всякий раз, когда поток хочет манипулировать контекстом, заключите его в скобки с помощью cuCtxPushCurrent () / cuCtxPopCurrent ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...