无法将 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::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
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
那么vkGetMemoryHostPointerPropertiesEXT
returnsResult::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 两次,但我想这并不重要。
我正在尝试使用 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
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
那么vkGetMemoryHostPointerPropertiesEXT
returnsResult::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 两次,但我想这并不重要。