CUDA导出句柄导入DirectX12失败:OpenSharedHandle支持性及替代方案咨询
CUDA共享句柄导入DirectX12的问题
在CUDA中创建GPU缓冲区后,使用cuMemExportToShareableHandle()导出并获取HANDLE,将该CUDA句柄传入ID3D12Device::OpenSharedHandle()时,出现“Access violation writing location”错误。请问:
(A) OpenSharedHandle()是否支持打开CUDA句柄?
(B) OpenSharedHandle()是否仅支持打开CreateSharedHandle()创建的句柄?
若为(A)则我的句柄存在问题;若为(B),是否有其他方法将CUDA句柄导入DirectX12?
问题解答
针对(A)(B)的明确结论
ID3D12Device::OpenSharedHandle()不直接支持cuMemExportToShareableHandle()导出的CUDA共享句柄。- 该方法仅适配DirectX体系内生成的共享句柄:比如DirectX 12的
ID3D12Device::CreateSharedHandle()、或DXGI规范下的共享句柄,CUDA导出的句柄不符合其直接兼容要求,直接传入会触发内存访问错误。
跨API共享的正确实现方式
要完成CUDA与DirectX12的资源共享,必须遵循DXGI共享资源规范,具体流程分两种场景:
- 从DirectX12侧发起共享
创建资源时设置D3D12_RESOURCE_FLAGS::D3D12_RESOURCE_FLAG_ALLOW_SHARED标志,通过ID3D12Device::CreateSharedHandle()生成共享句柄;之后CUDA通过cuD3D12CtxCreate()关联DX12设备,再用cuMemImportFromShareableHandle()导入该资源。 - 从CUDA侧发起共享
创建CUDA资源时指定CU_MEM_CREATE_FLAGS_GRAPHICS_SHARED标志,确保资源格式、内存布局与DX12兼容;导出共享句柄后,通过DXGI的IDXGIResource1::CreateSharedHandle()接口中转,再转换为DX12可识别的资源,而非直接调用OpenSharedHandle()。 - 通用注意事项
跨API共享必须保证资源的像素格式、内存布局(线性/纹理布局)、访问权限(读写/渲染目标等)在CUDA与DX12两侧完全匹配,否则即使句柄导入成功也会出现异常。
内容的提问来源于stack exchange,提问作者porente
相关产品推荐
相关产品推荐

