无法将 Cuda 内存导入 Vulkan
Posted
技术标签:
【中文标题】无法将 Cuda 内存导入 Vulkan【英文标题】:Failing to Import Cuda memory into Vulkan 【发布时间】:2021-11-29 08:45:11 【问题描述】:我正在尝试使用 VK_EXT_external_memory_host 扩展 https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_external_memory_host.html。我不确定vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT
和eHostMappedForeignMemoryEXT
之间的区别是什么,但我一直无法工作。 (我正在使用 VulkanHpp)。
void* data_ptr = getTorchDataPtr();
uint32_t MEMORY_TYPE_INDEX;
auto EXTERNAL_MEMORY_TYPE = vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT;
// or vk::ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT;
vk::MemoryAllocateInfo memoryAllocateInfo(SIZE_BYTES, MEMORY_TYPE_INDEX);
vk::ImportMemoryHostPointerInfoEXT importMemoryHostPointerInfoEXT(
MEMORY_FLAG,
data_ptr);
memoryAllocateInfo.pNext = &importMemoryHostPointerInfoEXT;
vk::raii::DeviceMemory deviceMemory( device, memoryAllocateInfo );
当DeviceMemory
的构造函数调用vkAllocateMemory
如果EXTERNAL_MEMORY_TYPE = eHostAllocationEXT
和内存中的零如果EXTERNAL_MEMORY_TYPE = eHostMappedForeignMemoryEXT
时我得到Result::eErrorOutOfDeviceMemory
(我已经检查了我要导入的py/libtorch 张量是非-zero,并且我的代码成功地复制和回读了不同的缓冲区)。
MEMORY_TYPE_INDEX
的所有值都会产生相同的行为(MEMORY_TYPE_INDEX 溢出时除外)。
getMemoryHostPointerPropertiesEXT
返回的位掩码的设置位假定为MEMORY_TYPE_INDEX
提供有效值。
auto pointerProperties = device.getMemoryHostPointerPropertiesEXT(
EXTERNAL_MEMORY_TYPE,
data_ptr);
std::cout << "memoryTypeBits " << std::bitset<32>(pointerProperties.memoryTypeBits) << std::endl;
但如果EXTERNAL_MEMORY_TYPE = eHostMappedForeignMemoryEXT
,则vkGetMemoryHostPointerPropertiesEXT
返回Result::eErrorInitializationFailed
,如果EXTERNAL_MEMORY_TYPE = eHostAllocationEXT
,则设置第8 位和第9 位。但是不管data_ptr
是cuda指针0x7ffecf400000
还是cpu指针0x2be7c80
都是一样的,所以我感觉出了点问题。
我也无法获得VK_KHR_external_memory
所需的扩展名VK_KHR_external_memory_capabilities
,这是我们使用的扩展名VK_EXT_external_memory_host
的要求。我正在使用 vulkan 版本 1.2.162.0。
eErrorOutOfDeviceMemory
很奇怪,因为我们不应该分配任何内存,如果有人能推测一下,我会很高兴。
【问题讨论】:
【参考方案1】:我认为主机内存是cpu内存,因此:
vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT
不起作用,因为指针指向设备内存 (gpu)。
vk::ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT
无法工作,因为内存没有被主机 (cpu) 映射。
是否有将本地设备内存导入 vulkan 的方法?它必须是主机映射的吗?
可能不是https://***.com/a/54801938/11998382。
我认为对我来说最好的选择是映射一些 vulkan 内存,并复制 pytorch cpu 张量。相同的数据会被上传到 gpu 两次,但我想这并不重要。
【讨论】:
这真的是一个答案吗?如果是这样,您是否愿意接受它,以便这个问题从 CUDA 标记的未回答队列中消失,并使其在未来访问者的搜索结果中更加突出以上是关于无法将 Cuda 内存导入 Vulkan的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Vulkan 使用 Nvidia Tensor Cores
Vulkan 演示无法在 Nvidia Jetson TX2 上编译