无法将 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::eHostAllocationEXTeHostMappedForeignMemoryEXT 之间的区别是什么,但我一直无法工作。 (我正在使用 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的主要内容,如果未能解决你的问题,请参考以下文章

无法为cufftComplex数据类型分配CUDA设备内存

如何通过 Vulkan 使用 Nvidia Tensor Cores

Vulkan 演示无法在 Nvidia Jetson TX2 上编译

Android Studio Emulator:无法添加库 vulkan-1.dll:失败

CUDA内存问题

Vulkan Tutorial 21 Staging buffer