- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:问题已更新以解决评论中提出的问题,并强调问题的核心是关于 Runtime- 和 Driver API 之间的相互依赖关系
CUDA 运行时库(如 CUBLAS 或 CUFFT)通常使用“句柄”的概念来概括此类库的状态和上下文。使用模式非常简单:
// Create a handle
cublasHandle_t handle;
cublasCreate(&handle);
// Call some functions, always passing in the handle as the first argument
cublasSscal(handle, ...);
// When done, destroy the handle
cublasDestroy(handle);
cuCtxSetCurrent
而不是
cuCtxPushCurrent
和
cuCtxPopCurrent
?),其中一些似乎来自“Primary上下文”处理是通过驱动程序 API 公开的,有些部分过于简化,因为它们只显示最简单的使用模式,只对多线程做出模糊或不完整的陈述,或者不能应用于运行时库。
CUmodule
对象,并获得
CUfunction
他们的对象。当库应该 - 对于用户 - 表现得像运行时库,但在内部必须使用驱动程序 API 时,会出现一些关于如何“在幕后”实现上下文处理的问题。
class Handle
{
CUcontext context;
boolean usingPrimaryContext;
CUdevice device;
}
Handle createHandle()
{
cuInit(0);
// Obtain the current context
CUcontext context;
cuCtxGetCurrent(&context);
CUdevice device;
// If there is no context, use the primary context
boolean usingPrimaryContext = false;
if (context == nullptr)
{
usingPrimaryContext = true;
// Obtain the device that is currently selected via the runtime API
int deviceIndex;
cudaGetDevice(&deviceIndex);
// Obtain the device and its primary context
cuDeviceGet(&device, deviceIndex);
cuDevicePrimaryCtxRetain(&context, device));
cuCtxSetCurrent(context);
}
else
{
cuCtxGetDevice(device);
}
// Create the actual handle. This might internally allocate
// memory or do other things that are specific for the context
// for which the handle is created
Handle handle = new Handle(device, context, usingPrimaryContext);
return handle;
}
void someLibraryFunction(Handle handle)
{
cuCtxSetCurrent(handle.context);
callMyKernel(...);
}
cuDevicePrimaryCtxRelease
必须被调用,但仅当上下文是主要上下文时:
void destroyHandle(Handle handle)
{
if (handle.usingPrimaryContext)
{
cuDevicePrimaryCtxRelease(handle.device);
}
}
最佳答案
很抱歉我没有早点注意到这个问题——因为我们可能在这方面有所合作。另外,我不太清楚这个问题是属于这里的,在 codereview.SX 上还是在程序员.SX 上,但让我们忽略所有这些。
我现在已经完成了你想要做的事情,而且可能更普遍。因此,我可以提供一个如何处理“句柄”的示例,此外,我还提出了根本不必实现这一点的前景。
该库是 cuda-api-wrappers 的扩展还包括驱动程序 API 和 NVRTC;它尚未发布级,但处于测试阶段,在 this branch .
现在,回答你的具体问题:
围绕原始“句柄”编写类的模式
Are there any established patterns for implementing such a "Handle"?
Are there any usage patterns (e.g. with multiple devices and one context per device) that could not be covered with the approach that is sketched above, but would be covered with the "handle" implementations of CUBLAS?
More generally: Are there any recommendations of how to improve the current "Handle" implementation?
Rhetorical: Is the source code of the CUBLAS handle handling available somewhere?
关于cuda - 如何为 CUDA 驱动程序 API 库实现句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48676001/
我是一名优秀的程序员,十分优秀!