Package org.lwjgl.vulkan
Class NVExternalMemoryRdma
java.lang.Object
org.lwjgl.vulkan.NVExternalMemoryRdma
This extension adds support for allocating memory which can be used for remote direct memory access (RDMA) from other devices.
Examples
VkPhysicalDeviceMemoryBudgetPropertiesEXT memoryBudgetProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };
VkPhysicalDeviceMemoryProperties2 memoryProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, &memoryBudgetProperties };
vkGetPhysicalDeviceMemoryProperties2(physicalDevice, &memoryProperties2);
uint32_t heapIndex = (uint32_t)-1;
for (uint32_t memoryType = 0; memoryType < memoryProperties2.memoryProperties.memoryTypeCount; memoryType++) {
if (memoryProperties2.memoryProperties.memoryTypes[memoryType].propertyFlags & VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV) {
heapIndex = memoryProperties2.memoryProperties.memoryTypes[memoryType].heapIndex;
break;
}
}
if ((heapIndex == (uint32_t)-1) ||
(memoryBudgetProperties.heapBudget[heapIndex] < size)) {
return;
}
VkPhysicalDeviceExternalBufferInfo externalBufferInfo = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO };
externalBufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
externalBufferInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
VkExternalBufferProperties externalBufferProperties = { VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES };
vkGetPhysicalDeviceExternalBufferProperties(physicalDevice, &externalBufferInfo, &externalBufferProperties);
if (!(externalBufferProperties.externalMemoryProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT)) {
return;
}
VkExternalMemoryBufferCreateInfo externalMemoryBufferCreateInfo = { VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO };
externalMemoryBufferCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
VkBufferCreateInfo bufferCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, &externalMemoryBufferCreateInfo };
bufferCreateInfo.size = size;
bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
VkMemoryRequirements mem_reqs;
vkCreateBuffer(device, &bufferCreateInfo, NULL, &buffer);
vkGetBufferMemoryRequirements(device, buffer, &mem_reqs);
VkExportMemoryAllocateInfo exportMemoryAllocateInfo = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO };
exportMemoryAllocateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
// Find memory type index
uint32_t i = 0;
for (; i < VK_MAX_MEMORY_TYPES; i++) {
if ((mem_reqs.memoryTypeBits & (1 << i)) &&
(memoryProperties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV)) {
break;
}
}
VkMemoryAllocateInfo memAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, &exportMemoryAllocateInfo };
memAllocInfo.allocationSize = mem_reqs.size;
memAllocInfo.memoryTypeIndex = i;
vkAllocateMemory(device, &memAllocInfo, NULL, &mem);
vkBindBufferMemory(device, buffer, mem, 0);
VkMemoryGetRemoteAddressInfoNV getMemoryRemoteAddressInfo = { VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV };
getMemoryRemoteAddressInfo.memory = mem;
getMemoryRemoteAddressInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
VkRemoteAddressNV rdmaAddress;
vkGetMemoryRemoteAddressNV(device, &getMemoryRemoteAddressInfo, &rdmaAddress);
// address returned in 'rdmaAddress' can be used by external devices to initiate RDMA transfers
- Name String
VK_NV_external_memory_rdma- Extension Type
- Device extension
- Registered Extension Number
- 372
- Revision
- 1
- Extension and Version Dependencies
VK_KHR_external_memoryor Version 1.1- Contact
- Carsten Rohde crohde
Other Extension Metadata
- Last Modified Date
- 2021-04-19
- IP Status
- No known IP claims.
- Contributors
- Carsten Rohde, NVIDIA
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intExtendsVkExternalMemoryHandleTypeFlagBits.static final intExtendsVkMemoryPropertyFlagBits.static final StringThe extension name.static final intThe extension specification version.static final intExtendsVkStructureType.static final intExtendsVkStructureType. -
Method Summary
Modifier and TypeMethodDescriptionstatic intnvkGetMemoryRemoteAddressNV(org.lwjgl.vulkan.VkDevice device, long pMemoryGetRemoteAddressInfo, long pAddress) Unsafe version of:GetMemoryRemoteAddressNVstatic intvkGetMemoryRemoteAddressNV(org.lwjgl.vulkan.VkDevice device, VkMemoryGetRemoteAddressInfoNV pMemoryGetRemoteAddressInfo, org.lwjgl.PointerBuffer pAddress) Get an address for a memory object accessible by remote devices.
-
Field Details
-
VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION
public static final int VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSIONThe extension specification version.- See Also:
-
VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME
The extension name.- See Also:
-
VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV
public static final int VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NVExtendsVkStructureType.Enum values:
- See Also:
-
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV
public static final int VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NVExtendsVkStructureType.Enum values:
- See Also:
-
VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV
public static final int VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NVExtendsVkMemoryPropertyFlagBits.- See Also:
-
VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV
public static final int VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NVExtendsVkExternalMemoryHandleTypeFlagBits.- See Also:
-
-
Method Details
-
nvkGetMemoryRemoteAddressNV
public static int nvkGetMemoryRemoteAddressNV(org.lwjgl.vulkan.VkDevice device, long pMemoryGetRemoteAddressInfo, long pAddress) Unsafe version of:GetMemoryRemoteAddressNV -
vkGetMemoryRemoteAddressNV
public static int vkGetMemoryRemoteAddressNV(org.lwjgl.vulkan.VkDevice device, VkMemoryGetRemoteAddressInfoNV pMemoryGetRemoteAddressInfo, org.lwjgl.PointerBuffer pAddress) Get an address for a memory object accessible by remote devices.C Specification
To export an address representing the payload of a Vulkan device memory object accessible by remote devices, call:
VkResult vkGetMemoryRemoteAddressNV( VkDevice device, const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo, VkRemoteAddressNV* pAddress);Description
More communication may be required between the kernel-mode drivers of the devices involved. This information is out of scope of this documentation and should be requested from the vendors of the devices.
Valid Usage (Implicit)
devicemust be a validVkDevicehandlepMemoryGetRemoteAddressInfomust be a valid pointer to a validVkMemoryGetRemoteAddressInfoNVstructurepAddressmust be a valid pointer to aVkRemoteAddressNVvalue
Return Codes
- On success, this command returns
- On failure, this command returns
See Also
- Parameters:
device- the logical device that created the device memory being exported.pMemoryGetRemoteAddressInfo- a pointer to aVkMemoryGetRemoteAddressInfoNVstructure containing parameters of the export operation.pAddress- a pointer to aVkRemoteAddressNVvalue in which an address representing the payload of the device memory object is returned.
-