vulkan-3.11.3: Bindings to the Vulkan graphics API.
Safe HaskellNone
LanguageHaskell2010

Vulkan.Extensions.VK_NV_external_memory_rdma

Description

Name

VK_NV_external_memory_rdma - device extension

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
  • Requires Vulkan 1.0
  • Requires VK_KHR_external_memory
Contact

Other Extension Metadata

Last Modified Date
2021-04-19
IP Status
No known IP claims.
Contributors
  • Carsten Rohde, NVIDIA

Description

This extension adds support for allocating memory which can be used for remote direct memory access (RDMA) from other devices.

New Base Types

New Commands

New Structures

New Enum Constants

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

Version History

  • Revision 1, 2020-12-15 (Carsten Rohde)

    • Internal revisions

See Also

MemoryGetRemoteAddressInfoNV, PhysicalDeviceExternalMemoryRDMAFeaturesNV, RemoteAddressNV, getMemoryRemoteAddressNV

Document Notes

For more information, see the Vulkan Specification

This page is a generated document. Fixes and changes should be made to the generator scripts, not directly.

Synopsis

Documentation

getMemoryRemoteAddressNV Source #

Arguments

:: forall io. MonadIO io 
=> Device

device is the logical device that created the device memory being exported.

device must be a valid Device handle

-> MemoryGetRemoteAddressInfoNV

pMemoryGetRemoteAddressInfo is a pointer to a MemoryGetRemoteAddressInfoNV structure containing parameters of the export operation.

pMemoryGetRemoteAddressInfo must be a valid pointer to a valid MemoryGetRemoteAddressInfoNV structure

-> io RemoteAddressNV 

vkGetMemoryRemoteAddressNV - Get an address for a memory object accessible by remote devices

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.

Return Codes

Success
Failure

See Also

Device, MemoryGetRemoteAddressInfoNV, RemoteAddressNV

data PhysicalDeviceExternalMemoryRDMAFeaturesNV Source #

VkPhysicalDeviceExternalMemoryRDMAFeaturesNV - Structure describing the external memory RDMA features supported by the implementation

Members

This structure describes the following feature:

Description

If the PhysicalDeviceExternalMemoryRDMAFeaturesNV structure is included in the pNext chain of the PhysicalDeviceFeatures2 structure passed to getPhysicalDeviceFeatures2, it is filled in to indicate whether each corresponding feature is supported. PhysicalDeviceExternalMemoryRDMAFeaturesNV can also be used in the pNext chain of DeviceCreateInfo to selectively enable these features.

Valid Usage (Implicit)

See Also

Bool32, StructureType

Constructors

PhysicalDeviceExternalMemoryRDMAFeaturesNV 

Fields

Instances

Instances details
Eq PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Show PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Storable PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

FromCStruct PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

ToCStruct PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Zero PhysicalDeviceExternalMemoryRDMAFeaturesNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

data MemoryGetRemoteAddressInfoNV Source #

VkMemoryGetRemoteAddressInfoNV - Structure describing a remote accessible address export operation

Valid Usage (Implicit)

See Also

DeviceMemory, ExternalMemoryHandleTypeFlagBits, StructureType, getMemoryRemoteAddressNV

Constructors

MemoryGetRemoteAddressInfoNV 

Fields

Instances

Instances details
Eq MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Show MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Storable MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

FromCStruct MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

ToCStruct MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

Zero MemoryGetRemoteAddressInfoNV Source # 
Instance details

Defined in Vulkan.Extensions.VK_NV_external_memory_rdma

type NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME = "VK_NV_external_memory_rdma" Source #

pattern NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a Source #