| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
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
- Ratification Status
- Not ratified
- Extension and Version Dependencies
- VK_KHR_external_memory or Vulkan Version 1.1
- 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_VERSIONExtending
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 transfersVersion History
Revision 1, 2020-12-15 (Carsten Rohde)
- Internal revisions
See Also
No cross-references are available
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 :: 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 :: Integral a => a
- type NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME = "VK_NV_external_memory_rdma"
- pattern NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME :: (Eq a, IsString a) => a
- type RemoteAddressNV = Ptr ()
Documentation
getMemoryRemoteAddressNV Source #
Arguments
| :: 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. If the application wishes to use a
Device with any features described by
PhysicalDeviceExternalMemoryRDMAFeaturesNV, it must add an instance
of the structure, with the desired feature members set to
TRUE, to the pNext chain of
DeviceCreateInfo when creating the
Device.
Valid Usage (Implicit)
See Also
Constructors
| PhysicalDeviceExternalMemoryRDMAFeaturesNV | |
Fields
| |
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
Constructors
| MemoryGetRemoteAddressInfoNV | |
Fields
| |
Instances
type NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION = 1 Source #
pattern NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION :: Integral a => a Source #
type NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME = "VK_NV_external_memory_rdma" Source #
pattern NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME :: (Eq a, IsString a) => a Source #
type RemoteAddressNV = Ptr () Source #
VkRemoteAddressNV - Remote device address type