0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用DirectX 12在分布式系統(tǒng)上的應用程序之間同步當前調(diào)用

星星科技指導員 ? 來源:NVIDIA ? 作者:Nico Marniok ? 2022-10-10 15:06 ? 次閱讀

交換組和交換屏障是分別在同一系統(tǒng)和分布式系統(tǒng)上的不同窗口之間同步緩沖區(qū)交換的眾所周知的方法。最初是為 OpenGL 引入的,后來通過公共 NvAPI 接口進行擴展,并在 DirectX 9 到 12 中得到支持。

NVIDIA 現(xiàn)在引入了當前障礙的概念。它們結(jié)合了交換組和交換障礙,并提供了一種在系統(tǒng)內(nèi)和系統(tǒng)之間設(shè)置同步當前調(diào)用的簡單方法。

當應用程序請求加入當前障礙時,驅(qū)動程序會根據(jù)當前系統(tǒng)配置嘗試設(shè)置交換組或交換組與交換障礙的組合。這些函數(shù)再次通過公共 NvAPI 接口提供。

目前的障礙只有在應用程序處于全屏狀態(tài),沒有窗口邊框,也沒有桌面縮放或任務欄組合時才有效。如果這些要求中至少有一項未得到滿足,則當前的安全柵將斷開并恢復到掛起狀態(tài),直到所有要求都得到滿足。當當前屏障處于掛起狀態(tài)時,顯示器之間不會發(fā)生同步。

類似地,只有當顯示器連接到相同的 GPU 并設(shè)置為相同的定時時,當前屏障才能正常工作。顯示器也可以與 Quadro Sync 卡或 NVLink 連接器同步。

顯示同步通過以下兩種方式之一進行:

顯示器已配置為使用 Quadro sync 插件板形成同步組或同步到外部同步源,或兩者兼而有之。

通過創(chuàng)建跨越顯示器的馬賽克顯示表面,實現(xiàn)了顯示器的同步。

當通過其中一種方法同步顯示定時時,則可以使用 DX12 顯示屏障。

NvAPI 接口

要通過 NvAPI 中的 present barrier 擴展設(shè)置同步 present 調(diào)用,應用程序必須確保完全支持 present barrier 。如果是這種情況,它必須創(chuàng)建一個當前 barrier 客戶端,注冊所需的 DirectX 資源,并加入當前 barrier 。

查詢當前屏障支持

在嘗試同步當前調(diào)用之前,應用程序應首先檢查當前操作系統(tǒng)、驅(qū)動程序和硬件配置是否支持當前屏障同步。這是通過使用所需的 D3D12 設(shè)備作為參數(shù)調(diào)用相應的函數(shù)來實現(xiàn)的。

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."); ...
}

創(chuàng)建當前屏障客戶端句柄

如果系統(tǒng)提供當前屏障支持,應用程序可以通過提供 D3D12 設(shè)備和 DXGI 交換鏈來創(chuàng)建當前屏障客戶端。句柄用于注冊所需的資源、加入或離開當前障礙以及查詢幀統(tǒng)計信息。

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

注冊現(xiàn)有障礙資源

創(chuàng)建客戶端后,當前障礙需要訪問交換鏈的緩沖區(qū)資源和圍欄對象,以實現(xiàn)適當?shù)膸健鷻谥涤擅繋漠斍捌琳显黾?,應用程序不得更改。然而,應用程序可以使用它來同步主機和設(shè)備之間的命令分配器使用。每當交換鏈的緩沖區(qū)發(fā)生變化時,必須再次調(diào)用該函數(shù)。

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);

加入當前的障礙

創(chuàng)建當前屏障客戶端句柄并注冊掃描資源后,應用程序可以加入當前屏障同步。然后,未來 – 現(xiàn)在的呼叫與其他客戶端同步。

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

離開目前的障礙

存在一個類似的函數(shù)來保持當前的勢壘同步??蛻舳吮3植蛔?,這樣應用程序就可以輕松地再次加入。

assert(NvAPI_LeavePresentBarrier(pbClientHandle));

應用程序的主循環(huán)

當一切都設(shè)置好后,應用程序可以執(zhí)行其主循環(huán),而無需任何更改,包括當前調(diào)用。目前的障礙自行處理同步。雖然應用程序可以選擇使用提供給當前屏障的圍欄進行主機和設(shè)備同步,但也可以使用自己的專用圍欄。

查詢統(tǒng)計信息

當客戶端注冊到當前屏障時,應用程序可以隨時查詢幀和同步統(tǒng)計信息,以確保一切按預期工作。

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

由函數(shù)調(diào)用填充的當前障礙統(tǒng)計對象提供了幾個有用的值。

SyncMode:上次當前調(diào)用中客戶端的當前障礙模式??赡苤担?/p>

PRESENT_BARRIER_NOT_JOINED:客戶尚未加入當前的障礙。

PRESENT_BARRIER_SYNC_CLIENT:客戶端加入了當前障礙,但未與任何其他客戶端同步。

PRESENT_BARRIER_SYNC_SYSTEM:客戶端加入了當前屏障,并與系統(tǒng)內(nèi)的其他客戶端同步。

PRESENT_BARRIER_SYNC_CLUSTER:客戶端加入了當前的障礙,并與系統(tǒng)內(nèi)和跨系統(tǒng)的其他客戶端同步。

PresentCount:幀成功加入當前障礙后從客戶端顯示的總次數(shù)。

PresentInSyncCount:自返回SyncMode以來,從客戶端顯示幀的總次數(shù)是PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。

FlipInSyncCount:自返回SyncMode以來,客戶端的翻轉(zhuǎn)總數(shù)為PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。

RefreshCount:自客戶端返回SyncMode以來的 v 空格總數(shù)為PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。

示例應用程序

NVIDIA DesignWorks Samples GitHub repo 中提供了一個專用的示例應用程序。它具有可調(diào)整和移動的彩色條和列模式,以直觀地檢查同步質(zhì)量(圖 1 )。該應用程序還支持多 GPU 設(shè)置上的交替幀渲染和立體渲染。在運行期間,它可以加入或離開當前的障礙同步。

圖 1.具有移動條線和實時統(tǒng)計信息的示例應用程序。

結(jié)論

Present barrier 同步是一種簡單、高級的方法,可以在單個系統(tǒng)和多個分布式系統(tǒng)場景中在多個顯示器上實現(xiàn)同步 Present 調(diào)用。該界面完全包含在 NvAPI 庫中,僅包含六個設(shè)置函數(shù),而復雜的管理概念對面向用戶的代碼隱藏。

關(guān)于作者

Nico Marniok 是 NVIDIA 專業(yè)可視化部門的高級開發(fā)技術(shù)工程師,他與獨立軟件供應商合作,利用計算機圖形軟件和硬件的最新技術(shù)。他專攻光線追蹤算法。 ISV 應用范圍從專業(yè)圖形設(shè)計到數(shù)字孿生可視化和模擬。在加入 NVIDIA 之前,Nico 畢業(yè)于奧斯納布呂克大學并獲得碩士學位,并在 3D 重建領(lǐng)域進行了研究,首先是計算機層析成像,后來是深度相機。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 顯示器
    +關(guān)注

    關(guān)注

    21

    文章

    5002

    瀏覽量

    140236
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5068

    瀏覽量

    103462
收藏 人收藏

    評論

    相關(guān)推薦

    分布式軟件系統(tǒng)

    分布式軟件系統(tǒng)分布式軟件系統(tǒng)(Distributed Software Systems)是支持分布式處理的軟件系統(tǒng),是
    發(fā)表于 07-22 14:53

    基于分布式調(diào)用鏈監(jiān)控技術(shù)的全息排查功能

    庫存情況等,也就是說根據(jù)交易ID可以調(diào)用查看交易、商品庫存以及支付等信息,大大提升錯誤排查速度。相關(guān)排查如下圖所示。用于全鏈路APM監(jiān)控的阿里云業(yè)務實時監(jiān)控服務 (ARMS) , 推出的基于
    發(fā)表于 08-07 17:02

    利用NI VeriStand 2010特性創(chuàng)建分布式系統(tǒng)

    NI VeriStand網(wǎng)關(guān)地址為遠程主機即可。其他應用程序保持不變。  分布式計算機之間共享數(shù)據(jù)  要讓分布式
    發(fā)表于 04-08 09:42

    分布式數(shù)據(jù)采集系統(tǒng)同步的方法

    本文介紹了基于SAR ADC的系統(tǒng)和基于sigma-delta (∑-Δ) ADC的分布式數(shù)據(jù)采集系統(tǒng)同步的傳統(tǒng)方法,且探討了這兩種架構(gòu)之間
    發(fā)表于 11-23 10:33

    基于SAR ADC和sigma-delta ADC的分布式數(shù)據(jù)采集系統(tǒng)同步的傳統(tǒng)方法

    本文介紹了基于SAR ADC的系統(tǒng)和基于sigma-delta (∑-Δ) ADC的分布式數(shù)據(jù)采集系統(tǒng)同步的傳統(tǒng)方法,且探討了這兩種架構(gòu)之間
    發(fā)表于 01-11 06:44

    HarmonyOS教程—基于分布式數(shù)據(jù)接口,實現(xiàn)多種設(shè)備一致的數(shù)據(jù)訪問體驗

    1. 如何使用分布式數(shù)據(jù)庫介紹分布式數(shù)據(jù)服務(Distributed Data Service,DDS) 為應用程序提供不同設(shè)備間數(shù)據(jù)庫數(shù)據(jù)分布式的能力。通過
    發(fā)表于 09-26 11:40

    HarmonyOS分布式應用框架深入解讀

    各設(shè)備能力,從而實現(xiàn)多設(shè)備間多端協(xié)同、跨端遷移,為萬物互聯(lián)奠定基礎(chǔ)。針對HarmonyOS的分布式應用框架后面章節(jié)將分別深入解讀。一、HarmonyOS用戶程序 HarmonyOS系統(tǒng)
    發(fā)表于 11-22 15:15

    【學習打卡】OpenHarmony的分布式數(shù)據(jù)管理介紹

    中,精心設(shè)計的架構(gòu)為數(shù)據(jù)庫和其他數(shù)據(jù)平臺提供了一個模型,該模型上將部署特定技術(shù)以適應各個應用程序分布式數(shù)據(jù)管理作為OpenHarmony系統(tǒng)的模塊之一,它建立
    發(fā)表于 07-15 15:49

    【學習打卡】OpenHarmony的分布式任務調(diào)度

    同步、注冊、調(diào)用)機制。分布式任務調(diào)度程序是能夠跨多個服務器啟動調(diào)度作業(yè)或工作負載的軟件解決方案,整個過程是不需要人來值守的。舉個例子,我們可以
    發(fā)表于 07-18 17:06

    分布式系統(tǒng)硬件資源池原理和接入實踐

    把各個設(shè)備的硬件外設(shè)抽象為外設(shè)信息單元,外設(shè)信息各個可信設(shè)備之間自動同步,如此,實現(xiàn)了外設(shè)信息的全局可見;結(jié)合分布式硬件虛擬化技術(shù),實現(xiàn)任意設(shè)備
    發(fā)表于 12-06 10:02

    ASP.NET分布式數(shù)據(jù)應用程序高級編程

    ASP.NET分布式數(shù)據(jù)應用程序高級編程主要介紹如何使用ASP.NET創(chuàng)建Internet和Intranet中的分布式應用程序,書中提供了各種使用數(shù)據(jù)驅(qū)動Web
    發(fā)表于 09-26 23:15 ?0次下載
    ASP.NET<b class='flag-5'>分布式</b>數(shù)據(jù)<b class='flag-5'>應用程序</b>高級編程

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

    為了Erlang運行時系統(tǒng)基礎(chǔ)開發(fā)更可靠的分布式系統(tǒng)和算法,我們研究了Erlang編程語言中分布式
    發(fā)表于 04-18 22:37 ?23次下載

    分布式調(diào)度子系統(tǒng)--初步研究

    、注冊、調(diào)用)機制,支持對跨設(shè)備的應用進行遠程啟動、遠程調(diào)用、遠程連接以及遷移等操作,能夠根據(jù)不同設(shè)備的能力、位置、業(yè)務運行狀態(tài)、資源使用情況,以及用戶的習慣和意圖,選擇合適的設(shè)備運行分布式任務。 下圖是
    發(fā)表于 10-24 12:12 ?1899次閱讀
    <b class='flag-5'>分布式</b>調(diào)度子<b class='flag-5'>系統(tǒng)</b>--初步研究

    使用NVIDIA SDK 11.1對DirectX 12進行編碼

    DirectX 12 是 Microsoft 提供的一種低級編程 API ,與以前的版本相比,它減少了驅(qū)動程序開銷。 DirectX 12
    的頭像 發(fā)表于 04-20 16:27 ?1674次閱讀

    鴻蒙開發(fā)接口數(shù)據(jù)管理:【@ohos.data.distributedData (分布式數(shù)據(jù)管理)】

    分布式數(shù)據(jù)管理為應用程序提供不同設(shè)備間數(shù)據(jù)庫的分布式協(xié)同能力。通過調(diào)用分布式數(shù)據(jù)各個接口,應用程序
    的頭像 發(fā)表于 06-07 09:30 ?1046次閱讀
    鴻蒙開發(fā)接口數(shù)據(jù)管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>數(shù)據(jù)管理)】