gpt4 book ai didi

c++ - 如何使用 CUDA 驱动程序功能?

转载 作者:太空狗 更新时间:2023-10-29 21:24:11 24 4
gpt4 key购买 nike

我有一个带有生产者线程和 OpenGL 线程的 GUI 应用程序,OpenGL 线程需要调用 CUDA 函数,生产者需要调用 cudaMemcpy 等。

无论我做什么,我似乎都无法让 CUDA 驱动程序 api 工作。每次我尝试使用这些函数时,我都会得到一个 cudaErrorMissingConfiguration

我想使用多线程 CUDA,实现它的典型方法是什么?

原创

void program::initCuda()
{
CUresult a;pctx=0;
cudaSafeCall(cudaSetDevice(0));
cudaSafeCall(cudaGLSetGLDevice(0));
a=cuInit(0);
cudaSafeCall(cudaFree(0));
cout <<"cuInit :" <<a << endl;assert(a == cudaSuccess);
//a=cuCtxGetCurrent(pctx);
a=cuCtxCreate(pctx,CU_CTX_SCHED_AUTO,0);
cout <<"GetContext :" <<a << endl;assert(a == cudaSuccess);
//Fails with cudaErrorMissingConfiguration
a=cuCtxPopCurrent(pctx);
cout <<"cuCtxPopCurrent :" <<a << endl;assert(a == cudaSuccess);
cout <<"Initialized CUDA" << endl;
}

已修订

void glStream::initCuda()
{
CUresult a;
pctx=0;
cudaSafeCall(cudaSetDevice(0));
cudaSafeCall(cudaGLSetGLDevice(0));
cudaFree(0);// From post http://stackoverflow.com/questions/10415204/how-to-create-a-cuda-context seems to indicate that `cudaSetDevice` should make a context.
a=cuCtxGetCurrent(pctx);
cout <<"GetContext :" <<a << endl;assert(a == cudaSuccess);
a=cuCtxPopCurrent(pctx);
cout <<"cuCtxPopCurrent :" <<a << endl;assert(a == cudaSuccess);
cout <<"Initialized CUDA" << endl;
}

最佳答案

第二个代码的最简单版本应如下所示:

#include <iostream>
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>

int main(void)
{
CUresult a;
CUcontext pctx;
cudaSetDevice(0); // runtime API creates context here
a = cuCtxGetCurrent(&pctx);
std::cout << "GetContext : " << a << std::endl;
assert(a == CUDA_SUCCESS);
a = cuCtxPopCurrent(&pctx);
std::cout << "cuCtxPopCurrent : " << a << std::endl;
assert(a == CUDA_SUCCESS);
std::cout << "Initialized CUDA" << std::endl;

return 0;
}

在带有 CUDA 5.0 的 OS X 10.6 上产生以下结果:

$ g++ -I/usr/local/cuda/include -L/usr/local/cuda/lib driver.cc -lcuda -lcudart
$ ./a.out
GetContext :0
cuCtxPopCurrent :0
Initialized CUDA

即。 “只是工作”。这里的上下文是由 cudaSetDevice 调用延迟启动的(注意我错误地断言 cudaSetDevice 没有建立上下文,但至少在 CUDA 5 中它看起来是这样。这种行为在 CUDA 4 中修改运行时 API 时可能已经更改)。

或者,您可以使用驱动程序 API 来启动上下文:

#include <iostream>
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>

int main(void)
{
CUresult a;
CUcontext pctx;
CUdevice device;
cuInit(0);
cuDeviceGet(&device, 0);
std::cout << "DeviceGet : " << a << std::endl;
cuCtxCreate(&pctx, CU_CTX_SCHED_AUTO, device ); // explicit context here
std::cout << "CtxCreate : " << a << std::endl;
assert(a == CUDA_SUCCESS);
a = cuCtxPopCurrent(&pctx);
std::cout << "cuCtxPopCurrent : " << a << std::endl;
assert(a == CUDA_SUCCESS);
std::cout << "Initialized CUDA" << std::endl;

return 0;
}

这也“有效”:

$ g++ -I/usr/local/cuda/include -L/usr/local/cuda/lib driver.cc -lcuda -lcudart
$ ./a.out
DeviceGet : 0
CtxCreate : 0
cuCtxPopCurrent : 0
Initialized CUDA

您不应该像第一个示例那样将两者混合。我所能建议的就是尝试这两种方法并确认它们适合您,然后将调用序列应用于您实际想要实现的目标。

关于c++ - 如何使用 CUDA 驱动程序功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com