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