0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用DirectX 12在分布式系统上的应用程序之间同步当前调用

星星科技指导员 来源:NVIDIA 作者:Nico Marniok 2022-10-10 15:06 次阅读

交换组和交换屏障是分别在同一系统和分布式系统上的不同窗口之间同步缓冲区交换的众所周知的方法。最初是为 OpenGL 引入的,后来通过公共 NvAPI 接口进行扩展,并在 DirectX 9 到 12 中得到支持。

NVIDIA 现在引入了当前障碍的概念。它们结合了交换组和交换障碍,并提供了一种在系统内和系统之间设置同步当前调用的简单方法。

当应用程序请求加入当前障碍时,驱动程序会根据当前系统配置尝试设置交换组或交换组与交换障碍的组合。这些函数再次通过公共 NvAPI 接口提供。

目前的障碍只有在应用程序处于全屏状态,没有窗口边框,也没有桌面缩放或任务栏组合时才有效。如果这些要求中至少有一项未得到满足,则当前的安全栅将断开并恢复到挂起状态,直到所有要求都得到满足。当当前屏障处于挂起状态时,显示器之间不会发生同步。

类似地,只有当显示器连接到相同的 GPU 并设置为相同的定时时,当前屏障才能正常工作。显示器也可以与 Quadro Sync 卡或 NVLink 连接器同步。

显示同步通过以下两种方式之一进行:

显示器已配置为使用 Quadro sync 插件板形成同步组或同步到外部同步源,或两者兼而有之。

通过创建跨越显示器的马赛克显示表面,实现了显示器的同步。

当通过其中一种方法同步显示定时时,则可以使用 DX12 显示屏障。

NvAPI 接口

要通过 NvAPI 中的 present barrier 扩展设置同步 present 调用,应用程序必须确保完全支持 present barrier 。如果是这种情况,它必须创建一个当前 barrier 客户端,注册所需的 DirectX 资源,并加入当前 barrier 。

查询当前屏障支持

在尝试同步当前调用之前,应用程序应首先检查当前操作系统、驱动程序和硬件配置是否支持当前屏障同步。这是通过使用所需的 D3D12 设备作为参数调用相应的函数来实现的。

ID3D12Device* device;
... // initialize the device
bool supported;
assert(NvAPI_D3D12_QueryPresentBarrierSupport(device, &supported) == NVAPI_OK);
if(supported) { LOG("D3D12 present barrier is supported on this system."); ...
}

创建当前屏障客户端句柄

如果系统提供当前屏障支持,应用程序可以通过提供 D3D12 设备和 DXGI 交换链来创建当前屏障客户端。句柄用于注册所需的资源、加入或离开当前障碍以及查询帧统计信息

IDXGISwapChain swapChain;
... // initialize the swap chain
NvPresentBarrierClientHandle pbClientHandle = nullptr;
assert(NvAPI_D3D12_CreatePresentBarrierClient(device, swapChain, &pbClientHandle) == NVAPI_OK);

注册现有障碍资源

创建客户端后,当前障碍需要访问交换链的缓冲区资源和围栏对象,以实现适当的帧同步。围栏值由每帧的当前屏障增加,应用程序不得更改。然而,应用程序可以使用它来同步主机和设备之间的命令分配器使用。每当交换链的缓冲区发生变化时,必须再次调用该函数。

ID3D12Fence pbFence; // the app may wait on the fence but must not signal it
assert(SUCCEEDED(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pbFence))));
ID3D12Resource** backBuffers;
unsigned int backBufferCount;
... // query buffers from swap chain
assert(NvAPI_D3D12_RegisterPresentBarrierResources(pbClientHandle, pbFence, backBuffers, backBufferCount) == NVAPI_OK);

加入当前的障碍

创建当前屏障客户端句柄并注册扫描资源后,应用程序可以加入当前屏障同步。然后,未来 – 现在的呼叫与其他客户端同步。

NV_JOIN_PRESENT_BARRIER_PARAMS params = {};
params.dwVersion = NV_JOIN_PRESENT_BARRIER_PARAMS_VER1;
assert(NvAPI_JoinPresentBarrier(pbClientHandle, ¶ms) == NVAPI_OK);

离开目前的障碍

存在一个类似的函数来保持当前的势垒同步。客户端保持不变,这样应用程序就可以轻松地再次加入。

assert(NvAPI_LeavePresentBarrier(pbClientHandle));

应用程序的主循环

当一切都设置好后,应用程序可以执行其主循环,而无需任何更改,包括当前调用。目前的障碍自行处理同步。虽然应用程序可以选择使用提供给当前屏障的围栏进行主机和设备同步,但也可以使用自己的专用围栏。

查询统计信息

当客户端注册到当前屏障时,应用程序可以随时查询帧和同步统计信息,以确保一切按预期工作。

NV_PRESENT_BARRIER_FRAME_STATISTICS stats = {};
stats.dwVersion = NV_PRESENT_BARRIER_FRAME_STATICS_VER1;
assert(NvAPI_QueryPresentBarrierFrameStatistics(pbClientHandle, &stats) == NVAPI_OK);

由函数调用填充的当前障碍统计对象提供了几个有用的值。

SyncMode:上次当前调用中客户端的当前障碍模式。可能值:

PRESENT_BARRIER_NOT_JOINED:客户尚未加入当前的障碍。

PRESENT_BARRIER_SYNC_CLIENT:客户端加入了当前障碍,但未与任何其他客户端同步。

PRESENT_BARRIER_SYNC_SYSTEM:客户端加入了当前屏障,并与系统内的其他客户端同步。

PRESENT_BARRIER_SYNC_CLUSTER:客户端加入了当前的障碍,并与系统内和跨系统的其他客户端同步。

PresentCount:帧成功加入当前障碍后从客户端显示的总次数。

PresentInSyncCount:自返回SyncMode以来,从客户端显示帧的总次数是PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏离这些值,它将重置为 0 。

FlipInSyncCount:自返回SyncMode以来,客户端的翻转总数为PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏离这些值,它将重置为 0 。

RefreshCount:自客户端返回SyncMode以来的 v 空格总数为PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏离这些值,它将重置为 0 。

示例应用程序

NVIDIA DesignWorks Samples GitHub repo 中提供了一个专用的示例应用程序。它具有可调整和移动的彩色条和列模式,以直观地检查同步质量(图 1 )。该应用程序还支持多 GPU 设置上的交替帧渲染和立体渲染。在运行期间,它可以加入或离开当前的障碍同步。

图 1.具有移动条线和实时统计信息的示例应用程序。

结论

Present barrier 同步是一种简单、高级的方法,可以在单个系统和多个分布式系统场景中在多个显示器上实现同步 Present 调用。该界面完全包含在 NvAPI 库中,仅包含六个设置函数,而复杂的管理概念对面向用户的代码隐藏。

关于作者

Nico Marniok 是 NVIDIA 专业可视化部门的高级开发威廉希尔官方网站 工程师,他与独立软件供应商合作,利用计算机图形软件和硬件的最新威廉希尔官方网站 。他专攻光线追踪算法。 ISV 应用范围从专业图形设计到数字孪生可视化和interwetten与威廉的赔率体系 。在加入 NVIDIA 之前,Nico 毕业于奥斯纳布吕克大学并获得硕士学位,并在 3D 重建领域进行了研究,首先是计算机层析成像,后来是深度相机。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示器
    +关注

    关注

    21

    文章

    4984

    浏览量

    140103
  • NVIDIA
    +关注

    关注

    14

    文章

    5002

    浏览量

    103232
收藏 人收藏

    评论

    相关推荐

    分布式软件系统

    分布式软件系统分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是
    发表于 07-22 14:53

    基于分布式调用链监控威廉希尔官方网站 的全息排查功能

    库存情况等,也就是说根据交易ID可以调用查看交易、商品库存以及支付等信息,大大提升错误排查速度。相关排查如下图所示。用于全链路APM监控的阿里云业务实时监控服务 (ARMS) , 推出的基于
    发表于 08-07 17:02

    利用NI VeriStand 2010特性创建分布式系统

    NI VeriStand网关地址为远程主机即可。其他应用程序保持不变。  分布式计算机之间共享数据  要让分布式
    发表于 04-08 09:42

    分布式数据采集系统同步的方法

    本文介绍了基于SAR ADC的系统和基于sigma-delta (∑-Δ) ADC的分布式数据采集系统同步的传统方法,且探讨了这两种架构之间
    发表于 11-23 10:33

    基于SAR ADC和sigma-delta ADC的分布式数据采集系统同步的传统方法

    本文介绍了基于SAR ADC的系统和基于sigma-delta (∑-Δ) ADC的分布式数据采集系统同步的传统方法,且探讨了这两种架构之间
    发表于 01-11 06:44

    HarmonyOS教程—基于分布式数据接口,实现多种设备一致的数据访问体验

    1. 如何使用分布式数据库介绍分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过
    发表于 09-26 11:40

    HarmonyOS分布式应用框架深入解读

    各设备能力,从而实现多设备间多端协同、跨端迁移,为万物互联奠定基础。针对HarmonyOS的分布式应用框架后面章节将分别深入解读。一、HarmonyOS用户程序 HarmonyOS系统
    发表于 11-22 15:15

    【学习打卡】OpenHarmony的分布式数据管理介绍

    中,精心设计的架构为数据库和其他数据平台提供了一个模型,该模型上将部署特定威廉希尔官方网站 以适应各个应用程序分布式数据管理作为OpenHarmony系统的模块之一,它建立
    发表于 07-15 15:49

    【学习打卡】OpenHarmony的分布式任务调度

    同步、注册、调用)机制。分布式任务调度程序是能够跨多个服务器启动调度作业或工作负载的软件解决方案,整个过程是不需要人来值守的。举个例子,我们可以
    发表于 07-18 17:06

    分布式系统硬件资源池原理和接入实践

    把各个设备的硬件外设抽象为外设信息单元,外设信息各个可信设备之间自动同步,如此,实现了外设信息的全局可见;结合分布式硬件虚拟化威廉希尔官方网站 ,实现任意设备
    发表于 12-06 10:02

    ASP.NET分布式数据应用程序高级编程

    ASP.NET分布式数据应用程序高级编程主要介绍如何使用ASP.NET创建Internet和Intranet中的分布式应用程序,书中提供了各种使用数据驱动Web
    发表于 09-26 23:15 0次下载
    ASP.NET<b class='flag-5'>分布式</b>数据<b class='flag-5'>应用程序</b>高级编程

    分布式的Erlang程序:陷阱和对策

    为了Erlang运行时系统基础开发更可靠的分布式系统和算法,我们研究了Erlang编程语言中分布式
    发表于 04-18 22:37 23次下载

    分布式调度子系统--初步研究

    、注册、调用)机制,支持对跨设备的应用进行远程启动、远程调用、远程连接以及迁移等操作,能够根据不同设备的能力、位置、业务运行状态、资源使用情况,以及用户的习惯和意图,选择合适的设备运行分布式任务。 下图是
    发表于 10-24 12:12 1890次阅读
    <b class='flag-5'>分布式</b>调度子<b class='flag-5'>系统</b>--初步研究

    使用NVIDIA SDK 11.1对DirectX 12进行编码

    DirectX 12 是 Microsoft 提供的一种低级编程 API ,与以前的版本相比,它减少了驱动程序开销。 DirectX 12
    的头像 发表于 04-20 16:27 1652次阅读

    鸿蒙开发接口数据管理:【@ohos.data.distributedData (分布式数据管理)】

    分布式数据管理为应用程序提供不同设备间数据库的分布式协同能力。通过调用分布式数据各个接口,应用程序
    的头像 发表于 06-07 09:30 1018次阅读
    鸿蒙开发接口数据管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>数据管理)】