Заполнение параметров перед запуском функции.

Здравствуйте.
Использую Куду на паскале. Поэтому приходится юзать чистый API.
Уже портировал несколько примеров из SDK.
Разобрасля как компилировать модули не запуская VC++ (cu -> cubin).
Теперь делаю небольшой фреймворк.
Интересует такой ворос:
Обязательно ли заполнять все параметры, ссылки на текстуры, размер разделяемой памяти и размер блока перед каждым запуском функции? Достаточно ли один раз установить постояные параметры (по аналогии с шейдерами)?
Можно канешно попробовать, но сталкивался с тем что при неправильной установке параметров машина просто намертво зависает. Потом долгая перезагрузка и т.д.

Forums: 

Ладно, это вопрос

Ладно, это вопрос второстепенный.
А вот другой, который я задал на forums.nvidia.com но из 80-просмотревших никто не ответил (но и не обругал):
Указатели на объекты CUmodule, CUfunction, CUarray, CUtexref, CUevent, CUstream принадлежат конкретному контексту (CUcontext), наподобие как в OpenGL?
Если я делаю надстройку на этими объектами, тогда при всякий операциях с ними нужно ли проверять какому контексту они пренадлежат?

Небольшая шпаргалка

cuCtxCreate (CUcontext * pctx, unsigned int flags, CUdevice dev)
Создает новый CUDA контекст и асоциирует его с текущим потоком (тредом).
Флаг не буду описывать.
Контекст создается со значением счетчика использования равного 1 и вызывающий cuCtxCreate() должен вызвать cuCtxDestroy() или cuCtxDetach() когда закончит использование контекста. Если у потока уже есть контекст, то он вытесняется новым созданым контекстом и может быть возвращен вызовом cuCtxPopCurrent().

cuCtxAttach (CUcontext * pctx, unsigned int flags)
Увеличивает счетчик использования и возвращает хендл контекста в * pctx который потом будет использоваться в cuCtxDetach() когд приложение закончит работу с контекстом.
cuCtxAttach() несрабатывает если нет контекста подключоного к текущему потоку (треду).
flags - может быть только 0.

cuCtxDestroy (CUcontext ctx)
Уничтожает CUDA контекст ctx.
Если счетчик использования контекста не равен 1, или контекст является текущим и для другого потока CPU, эта функция несрабатывает. Плавающий контекст (открепленный от потока CPU функцией cuCtxPopCurrent() ) может быть удален этой фунцией.

cuCtxDetach (CUcontext ctx)
Уменьшает счетчик использования контекста ctx, и уничтожает контекст если счетчик равен 0.
Контекст должен быть текущим для потока CPU.

cuCtxPopCurrent (CUcontext * pctx)
Забирает из стека текущий CUDA контекст потока CPU в * pctx. Счетчик использования должен быть равен 1.
Этот контекст может быть сделан текущим для другого потока CPU вызовом cuCtxPushCurrent().

cuCtxPushCurrent (CUcontext ctx)
Помещает ctx контекст в стек CPU потока. Указаный контекст становится текущим контекстом потока CPU, поэтому это затрагивает все CUDA функции в текущем потоке.

Последняя туманная фраза наводит на мысль о необходимости проверки.

Нашел ответ тут

Нашел ответ тут http://www.sdsc.edu/us/training/assets/docs/NVIDIA-02-BasicsOfCUDA.pdf
Each context has its own address space - каждый контекст имеет свое адресное пространство.
Тоесть CUmodule, CUfunction, CUarray, CUtexref, CUevent, CUstream будут "пустым" место для другого контекста.
Теперь останется придумать проверку.