Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
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
- Ratification Status
- Not ratified
- 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
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
NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION
Extending
ExternalMemoryHandleTypeFlagBits
:Extending
MemoryPropertyFlagBits
:Extending
StructureType
:
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
- getMemoryRemoteAddressNV :: forall io. MonadIO io => Device -> MemoryGetRemoteAddressInfoNV -> io RemoteAddressNV
- data PhysicalDeviceExternalMemoryRDMAFeaturesNV = PhysicalDeviceExternalMemoryRDMAFeaturesNV {}
- data MemoryGetRemoteAddressInfoNV = MemoryGetRemoteAddressInfoNV {}
- type NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION = 1
- pattern NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION :: forall a. Integral a => a
- type NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME = "VK_NV_external_memory_rdma"
- pattern NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
- type RemoteAddressNV = Ptr ()
Documentation
getMemoryRemoteAddressNV Source #
:: forall io. MonadIO io | |
=> Device |
|
-> MemoryGetRemoteAddressInfoNV |
|
-> 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
See Also
VK_NV_external_memory_rdma,
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
PhysicalDeviceExternalMemoryRDMAFeaturesNV | |
|
Instances
data MemoryGetRemoteAddressInfoNV Source #
VkMemoryGetRemoteAddressInfoNV - Structure describing a remote accessible address export operation
Valid Usage (Implicit)
See Also
VK_NV_external_memory_rdma,
DeviceMemory
,
ExternalMemoryHandleTypeFlagBits
,
StructureType
,
getMemoryRemoteAddressNV
MemoryGetRemoteAddressInfoNV | |
|
Instances
type NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION = 1 Source #
pattern NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION :: forall a. Integral a => a Source #
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 #
type RemoteAddressNV = Ptr () Source #
VkRemoteAddressNV - Remote device address type