Top Description Fields Constructors Methods
org.lwjgl.vulkan

public Class NVExternalMemoryRdma

extends Object
Class Inheritance
Imports
org.lwjgl.*, org.lwjgl.system.*

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
VK_NV_external_memory_rdma
Name String
VK_NV_external_memory_rdma
Extension Type
Device extension
Registered Extension Number
372
Revision
1
Extension and Version Dependencies
VK_KHR_external_memory
Contact
Other Extension Metadata
Last Modified Date
2021-04-19
IP Status
No known IP claims.
Contributors
  • Carsten Rohde, NVIDIA

Field Summary

Modifier and TypeField and Description
public static final int
VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV

Extends VkExternalMemoryHandleTypeFlagBits.

public static final int
VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV

Extends VkMemoryPropertyFlagBits.

public static final String
public static final int
VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION

The extension specification version.

public static final int
public static final int

Constructor Summary

AccessConstructor and Description
protected

Method Summary

Modifier and TypeMethod and Description
public static int
nvkGetMemoryRemoteAddressNV(VkDevice device, long pMemoryGetRemoteAddressInfo, long pAddress)

Unsafe version of: GetMemoryRemoteAddressNV

public static int
vkGetMemoryRemoteAddressNV(VkDevice
the logical device that created the device memory being exported.
device
,
VkMemoryGetRemoteAddressInfoNV
a pointer to a VkMemoryGetRemoteAddressInfoNV structure containing parameters of the export operation.
pMemoryGetRemoteAddressInfo
,
PointerBuffer
a pointer to a VkRemoteAddressNV value in which an address representing the payload of the device memory object is returned.
pAddress
)

Get an address for a memory object accessible by remote devices.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NVback to summary
public static final int VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV

Extends VkExternalMemoryHandleTypeFlagBits.

VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NVback to summary
public static final int VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV

Extends VkMemoryPropertyFlagBits.

VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAMEback to summary
public static final String VK_NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME

The extension name.

VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSIONback to summary
public static final int VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION

The extension specification version.

VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NVback to summary
public static final int VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV

Extends VkStructureType.

Enum values:
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NVback to summary
public static final int VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV

Extends VkStructureType.

Enum values:

Constructor Detail

NVExternalMemoryRdmaback to summary
protected NVExternalMemoryRdma()

Method Detail

nvkGetMemoryRemoteAddressNVback to summary
public static int nvkGetMemoryRemoteAddressNV(VkDevice device, long pMemoryGetRemoteAddressInfo, long pAddress)

Unsafe version of: GetMemoryRemoteAddressNV

vkGetMemoryRemoteAddressNVback to summary
public static int vkGetMemoryRemoteAddressNV(VkDevice device, VkMemoryGetRemoteAddressInfoNV pMemoryGetRemoteAddressInfo, 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)
  • device must be a valid VkDevice handle
  • pMemoryGetRemoteAddressInfo must be a valid pointer to a valid VkMemoryGetRemoteAddressInfoNV structure
  • pAddress must be a valid pointer to a VkRemoteAddressNV value
Return Codes
On success, this command returns
On failure, this command returns
See Also

VkMemoryGetRemoteAddressInfoNV

Parameters
device:VkDevice

the logical device that created the device memory being exported.

pMemoryGetRemoteAddressInfo:VkMemoryGetRemoteAddressInfoNV

a pointer to a VkMemoryGetRemoteAddressInfoNV structure containing parameters of the export operation.

pAddress:PointerBuffer

a pointer to a VkRemoteAddressNV value in which an address representing the payload of the device memory object is returned.

Annotations
@NativeType:VkResult