Я использую следующий код:
cuCtxCreate(&context, CU_CTX_SCHED_YIELD, device);
int driverVersion = -1;
int driverVersionRt = -1;
int rtVersion = -1;
unsigned int ctxVersion = 1;
cuDriverGetVersion(&driverVersion);
cudaDriverGetVersion(&driverVersionRt);
cudaRuntimeGetVersion(&rtVersion);
cuCtxGetApiVersion(context, &ctxVersion);
std::cout << "cuDriverGetVersion: " << driverVersion << std::endl;
std::cout << "cudaDriverGetVersion: " << driverVersionRt << std::endl;
std::cout << "cudaRuntimeGetVersion: " << rtVersion << std::endl;
std::cout << "cuCtxGetApiVersion: " << ctxVersion << std::endl;
Вот вывод:
cuDriverGetVersion: 10010
cudaDriverGetVersion: 10010
cudaRuntimeGetVersion: 10000
cuCtxGetApiVersion: 3020
Из документации видно, что cudaDriverGetVersion
, cuDriverGetVersion
,и cudaRuntimeGetVersion
возвращаемые значения формы (1000 * мажор + 10 * минор).В документации не указано, что cuCtxGetApiVersion
должно возвращать, но я предполагаю, что оно должно совпадать с тремя другими функциями.
Мой вопрос: почему номер версии для контекста 3020, когда все остальные?используя 10000 и 10010?Это так и должно быть?
У меня возникла еще одна проблема, из-за которой создаваемые мною новые потоки должны обмениваться своим контекстом вручную, в противном случае я получаю ошибку 201 (недопустимый контекст).Это странно, потому что я знаю, что в CUDA 4.0 все процессы имеют один контекст на устройство на процесс.Поэтому мне не нужно устанавливать контекст для новых потоков, которые я создаю в рамках того же процесса.Поскольку cuCtxGetApiVersion
производит 3020, это заставляет меня поверить, что созданный мною контекст использует старую неверную версию, которая не будет функционировать для совместного использования между потоками.
Возможно ли это?