无法将 Cuda 内存导入 Vulkan

Failing to Import Cuda memory into Vulkan

我正在尝试使用 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 if EXTERNAL_MEMORY_TYPE = eHostAllocationEXT 时我得到 Result::eErrorOutOfDeviceMemory 并且如果 EXTERNAL_MEMORY_TYPE = eHostMappedForeignMemoryEXT 则在内存中归零(我已经检查了我正在导入的 py/libtorch 张量是否为非零,并且我的代码成功地复制并读回了不同的缓冲区)。

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那么vkGetMemoryHostPointerPropertiesEXTreturnsResult::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 很奇怪,因为我们不应该分配任何内存,如果有人能对此进行推测,我会很高兴。

我认为主机内存是 cpu 内存,因此:

vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT 将无法工作,因为指针指向设备内存 (gpu)。

vk::ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT 无法工作,因为内存未被主机映射 (cpu)。

有没有办法将本地设备内存导入vulkan?是否必须进行主机映射?

可能不会

我认为对我来说最好的选择是映射一些 vulkan 内存,然后复制 pytorch cpu 张量。同样的数据会被上传到 gpu 两次,但我想这并不重要。