Как я могу определить, является ли контекст CUDA основным - дешево?

Вы можете (?) Определить, является ли контекст CUDA основным, вызвав cuDevicePrimaryCtxRetain() и сравнивая возвращенный указатель с имеющимся у вас контекстом. Но - что, если первичный контекст еще никто не создал? Тогда есть ли более дешевый способ получить отрицательный ответ? Или - не может ли неосновной контекст существовать, в то время как основной нет?

1 ответ

Вы можете проверить, был ли создан первичный контекст («активирован») или нет:

      inline bool primary_context_is_active(int device_id)
{
    unsigned flags;
    int is_active;
    CUresult status = cuDevicePrimaryCtxGetState(device_id, &flags, &is_active);
    if (status != CUDA_SUCCESS) { /* error handling here */ }
    return is_active;
}

Теперь, если основной контекст не активен, вы знаете, что ваш контекст не является основным; если он активен , вы можете использовать, и - если вы не делаете что-то многопоточное или используете сопрограммы и т. д. - вы знаете, что это будет дешевый звонок.

Это, конечно, зависит от предположения, что ваш контекст не является недопустимым первичным дескриптором контекста после деактивации.

Другие вопросы по тегам