精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

在Vulkan-hpp中有助于將錯誤轉(zhuǎn)移到編譯時的特性

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:Andreas Sü?enbach ? 2022-04-27 15:19 ? 次閱讀

在專業(yè)軟件開發(fā)中,最重要的一個方面就是盡早發(fā)現(xiàn)錯誤。當然,最好的情況是我們甚至不能編寫錯誤的代碼。其次最好的是編譯器可以檢測到的錯誤。

最壞的情況是運行時錯誤。最難的部分隱藏在只在特定情況下運行的代碼中。墨菲定律說,這種情況首次發(fā)生在顧客的環(huán)境中。

如果您使用的是 Vulkan ,有幾種方法可以創(chuàng)建運行時錯誤。即使 Vulkan 提供了很好的驗證層,您也必須運行這部分代碼來檢測此類錯誤。順便說一句,我建議你不要在沒有使用驗證層的情況下用 Vulkan 編程

當使用 Vulkan – hpp 時,一些運行時錯誤變成編譯時錯誤 。 Vulkan -HPP 是針對 Vulkan API 的頭報頭 C ++綁定。它由 Khronos 維護,作為 Vulkan 生態(tài)系統(tǒng)的一部分,可以在 GitHub 上找到 Khronos Group / Vulkan – hpp 。它也是 LunargVulkan SDK 的一部分。

有助于將錯誤轉(zhuǎn)移到編譯時的特性

Vulkan -hpp 通過以下功能幫助消除運行時錯誤:

枚舉類與普通枚舉比較

幫助程序類 vk::Flags

結(jié)構(gòu) 常量成員 sType

vk::StructureChain

處理 32 位版本中的 類型安全

枚舉類

使用 Vulkan ,可以得到很多枚舉類型。除了 VkResult ,它們都是使用以下命名方案構(gòu)造的:

typedef enum VkEnumName {
 VK_ENUM_NAME_VALUE_A = 0,
 VK_ENUM_NAME_VALUE_B = 1,
 …
} VkEnumName;

使用 Vulkan -hpp ,可以為這些枚舉類型中的每一種獲得一個枚舉類:

namespace vk
{
 …
 enum class EnumName
 {
 eValueA = VK_ENUM_NAME_VALUE_A,
 eValueB = VK_ENUM_NAME_VALUE_B,
 …
 };
 …
}

首先,它們都位于名稱空間 vk 。您可以通過定義 VULKAN_HPP_NAMESPACE 來調(diào)整該命名空間。 enum 類本身沒有前綴 Vk ,因為這對于命名空間來說是多余的。最后,一個 enum 類的每個值都跳過前綴 VK_ENUM_NAME ,因為這個前綴又與命名空間和枚舉類名冗余。它們以小寫字母“ e ”作為前綴,并包含實際枚舉值名稱的 camelCase 版本。枚舉類值不允許以數(shù)字開頭,因此“ e ”前綴阻止了這一點。例如,無論你在 C 代碼中使用 VK_ENUM_NAME_VALUE_A ,都使用 vk::EnumName::eValueA 代替 C ++代碼。

那么,你從 Vulkan -hpp 中的 enum 類得到了什么呢?畢竟,由于 Vulkan 中的枚舉值命名方案,不可能有兩個同名的枚舉值。這根本不是你的問題,而是 Khronos 的 Vulkan 人的問題。此外,您不太可能希望將變量或函數(shù)作為枚舉值之一命名,即使這些名稱已導(dǎo)出到全局范圍。誰知道呢?有人喜歡函數(shù)名,比如 MIG 。

這里重要的一點是,在 Vulkan -hpp 中,沒有隱式轉(zhuǎn)換到 int 。不能將枚舉類值賦給 int 類型,至少不會意外。也不能比較來自不同枚舉類的兩個枚舉類值。當您比較兩個枚舉器中的兩個枚舉值時,會產(chǎn)生警告。 MIG 是依賴于編譯器的,當然,一個警告比錯誤更容易被忽略。

助手類 vk :: Flags

對于 Vulkan ,有兩個數(shù)據(jù)類型對,使用以下命名方案:

typedef enum VkEnumNameFlagBits = {
 VK_ENUM_NAME_VALUE_A_BIT = 0x00000001,
 VK_ENUM_NAME_VALUE_B_BIT = 0x00000002,
 …
} VkEnumNameFlagBits;
typedef VkFlags VkEnumNameFlags;

這里, VkFlags 只是一個 uint32_t ,并且 VkEnumNameFlags 應(yīng)該通過從 VkEnumNameFlagBits 中對適當?shù)拿杜e值進行排序來保存相應(yīng)枚舉 VkEnumNameFlagBits 的零個或多個值。由于* FlagBits 和* Flags 之間除了它們的公共名稱部分之外,沒有真正的聯(lián)系,編譯器對此無能為力。允許對任意枚舉值或整數(shù)應(yīng)用位運算符。如果錯誤組合的* Flags 值恰好是位的有效組合,即使它們可能不是您所希望的那樣,即使驗證層 MIG ht 也無法捕捉到這一點。它 MIG 感覺你像是在未定義的行為領(lǐng)域,即使程序完全按照你告訴它做的去做。這不是你想讓它做的。

使用 Vulkan -hpp ,可以得到相應(yīng)的對:

namespace vk
{
 …
 enum class EnumNameFlagBits : VkEnumNameFlagBits
 {
 eValueA = VK_ENUM_NAME_VALUE_A_BIT,
 eValueB = VK_ENUM_NAME_VALUE_B_BIT,
 …
 };
 using EnumNameFlags = Flags;
 …
}

有了這個結(jié)構(gòu),這樣的尷尬局面就不會發(fā)生了。不能對枚舉類值應(yīng)用位運算符。 vk::EnumNameFlags 枚舉知道相應(yīng)的 vk::EnumNameFlagBits 。 helper 類 vk::Flags 提供的功能允許您對來自同一個枚舉類的枚舉類值應(yīng)用位運算符,但僅對這些值應(yīng)用這些值。不能將它們與來自不同枚舉類的值組合。在編譯時,只使用允許的標志位構(gòu)造標志。

結(jié)構(gòu)的 sType 成員

稍微遠離枚舉, Vulkan 中有許多結(jié)構(gòu)將枚舉類型 VkStructureType 的成員 sType 作為第一個元素。對于這些結(jié)構(gòu)中的每一個,都必須將該成員設(shè)置為為為該結(jié)構(gòu)指定的值。在下面的代碼示例中,成員 sType 必須設(shè)置為 VK_STRUCTURE_TYPE_STRUCT_NAME 。

typedef struct VkStructName {
 VkStructureType sType;
 …
} VkStructName;

沒那么難,但你必須做對。不要忘記設(shè)置它,也不要通過從代碼中的另一個位置復(fù)制來將其設(shè)置為錯誤的值。例如,以下值在視覺上接近:

  • VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
  • VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO

對于 Vulkan -hpp ,在結(jié)構(gòu)上有以下限制:

namespace vk
{
 …
 struct StructName
 {
 …
 const vk::StructureType sType = vk::StructureType::eStructName;
 …
 };
 …
}

就這么簡單。當您實例化類型為 StructName 的結(jié)構(gòu)時,您不必擔心為成員 sType 設(shè)置正確的值,因為它已經(jīng)設(shè)置好了。因為它是常量成員,所以不能意外地覆蓋它。

對于感興趣的模板元程序員來說: struct StructName 還提供了一個靜態(tài)成員 structureType ,即 vk::StructureType 值。有一個名為 CppType 的類型特征,它從 vk::StructureType 值中獲取結(jié)構(gòu)的類型。

幫助程序類 vk :: StructureChain

Vulkan 中的許多結(jié)構(gòu)都有 pNext 作為第二個成員:

typedef struct VkStructName {
 VkStructureType sType;
 const void* pNext;
 …
} VkStructName;

某些結(jié)構(gòu)被指定為延伸其他結(jié)構(gòu)。pNext指針用于創(chuàng)建結(jié)構(gòu)鏈。有些結(jié)構(gòu)可以多次成為該鏈的一部分,具有不同的實例。您的代碼 MIG ht 如下所示:

ChainedStruct chained = {};
chained.sType = VK_STRUCTURE_TYPE_CHAINED_STRUCT;
// set other values of chained

AnchorStruct anchor = {};
anchor.sType = VK_STRUCTURE_TYPE_ANCHOR_STRUCT;
anchor.pNext = &chained;
// set other values of anchor

使用這種方法,有幾個潛在的錯誤。例如, MIG ht 將一個結(jié)構(gòu)鏈到 AnchorStruct 實例,該實例沒有指定在鏈中。或者您意外地鏈接了一個結(jié)構(gòu)的多個實例,其中只允許一個實例。甚至內(nèi)存管理也會導(dǎo)致意外行為。例如,當您有一個使用局部變量創(chuàng)建鏈的函數(shù)時,就像前面的代碼示例中那樣,當該函數(shù)最終按值返回錨點時,您已經(jīng)注定要失敗了。 MIG 指出的鏈式結(jié)構(gòu)已經(jīng)消失。

對于 Vulkan -hpp ,該代碼看起來幾乎相同:

namespace vk
{
 …
 struct StructName
 {
 …
 const vk::StructureType sType = vk::StructureType::eStructName;
 const void * pNext = {};
 …
 }
 …
}

您可以使用與 Vulkan 相同的方法來使用它,潛在錯誤的來源相同。 helper 類vk::StructureChain在這里幫助編譯器,如下面的代碼示例所示:

vk::StructureChain chain
(
 { /* set other values of anchor */ }
 { /* set other values of chained */ }
);

當然,這條鏈會變得任意長。編譯器可以檢查是否所有鏈式結(jié)構(gòu)都指定為擴展 MIG 。如果同一個鏈式結(jié)構(gòu)多次出現(xiàn),編譯器會檢查是否允許。訪問這樣一個鏈的元素將與您習慣于使用純 C 型結(jié)構(gòu)鏈略有不同:

vk::AnchorStruct const & anchorStruct = chain.get();
vk::ChainedStruct const & chainedStruct = chain.get();

如果必須在運行時從結(jié)構(gòu)鏈中刪除元素,可以使用成員函數(shù) vk::StructureChain::unlink 來執(zhí)行此操作。這樣,結(jié)構(gòu)鏈的內(nèi)存占用不會改變,但是現(xiàn)在未使用的部分將被跳過,因為該鏈中的任何 pNext 指針都不會指向這些部分。要重新鏈接,請使用 vk::StructureChain::relink 。

型式安全

最后,我們來看一個稍微不同的主題,類型安全。這是 Vulkan 的一個問題,尤其是對于 32 位構(gòu)建。在 32 位內(nèi)部版本中,所有不可分派的句柄(如 VkBuffer 、 VkImage 和 VkSemaphore 都只是 uint64_t 上的 typedef :

#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
…
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)

您可以調(diào)用 vkCreateBuffer 并傳入指向 VkImage 的指針作為最后一個參數(shù)。您還可以將 VkImage 分配給 VkBuffer 或?qū)λ鼈冞M行比較,沒有任何錯誤!

由于 Vulkan -hpp 中的相應(yīng)類型是獨立的類,沒有任何繼承關(guān)系,編譯器不允許這些操作中的任何一個。你不會弄錯的。

與運行時錯誤相比,更傾向于編輯時錯誤預(yù)防

正如我前面所說,最好的情況是甚至不能編寫錯誤的代碼。 Vulkan -hpp ,可能與所有現(xiàn)代 IDE 一起幫助您設(shè)置結(jié)構(gòu)的成員。因為每個 vk :: struct 都有一個構(gòu)造函數(shù),該構(gòu)造函數(shù)的每個成員都有一個參數(shù)列表,除了前面提到的 sType 和 pNext , IDE 可能會在編輯時引導(dǎo)您遍歷所有這些參數(shù),從而更難忽略任何錯誤。

把您的 Vulkan 的項目切換到 C ++

這些是 Vulkan -hpp 的一些特性,它們極大地簡化了用 Vulkan 進行編碼的工作。這些特性在運行時開銷為零的情況下可用。只是編譯器需要多工作一點。您仍然必須(幾乎)像使用 plainVulkan 一樣顯式地編程,但是編譯器可以更好地檢查代碼。這樣可以節(jié)省你很多時間!

關(guān)于作者

Andreas Sü?enbach 是 NVIDIA 的高級軟件開發(fā)人員。他是 Vulkan.hpp 的發(fā)明者之一,并不斷努力使之更進一步。

審核編輯:郭婷

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

    關(guān)注

    22

    文章

    2104

    瀏覽量

    73503
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1618

    瀏覽量

    49057
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1029

    瀏覽量

    45782
收藏 人收藏

    評論

    相關(guān)推薦

    CSP LED切割前如何轉(zhuǎn)移到UV膜上

    倒裝芯片底部與高溫膠膜接觸,封裝后如何芯片底部與高溫膜分離,然后轉(zhuǎn)移到UV膜上?
    發(fā)表于 10-29 23:23

    今日看點丨谷歌明年將把Tensor G5生產(chǎn)轉(zhuǎn)移到臺積電;京東方推出新型OLED面板原型

    1. 傳三星3 納米良率20% 谷歌明年將把Tensor G5 生產(chǎn)轉(zhuǎn)移到臺積電 ? 據(jù)業(yè)內(nèi)人士9月13日透露,谷歌明年移動應(yīng)用處理器的生產(chǎn)從三星電子轉(zhuǎn)向臺積電的可能性越來越大。明年發(fā)布的谷歌
    發(fā)表于 09-14 11:10 ?453次閱讀

    多級寬帶放大器各級之間pcb獨立分開,信號線用sma線相接,電源線用普通銅線導(dǎo)線,有助于抗干擾嗎?

    請問,多級寬帶放大器各級之間pcb獨立分開,信號線用sma線相接,電源線用普通銅線導(dǎo)線,有助于抗干擾么?
    發(fā)表于 09-05 06:35

    關(guān)于一些有助于優(yōu)化電源設(shè)計的新型材料

    眾所周知,人們對更高電源效率的追求正在推動性能的全方位提升。材料科學(xué)的進步對于優(yōu)化電源設(shè)計和開發(fā)更高效、更緊湊和更可靠的解決方案發(fā)揮著關(guān)鍵作用。下文列出了一些有助于優(yōu)化電源設(shè)計的新材料。
    的頭像 發(fā)表于 08-29 15:26 ?352次閱讀

    MSPM0-高級控制計時器有助于實現(xiàn)更好的控制和更好的數(shù)字輸出

    電子發(fā)燒友網(wǎng)站提供《MSPM0-高級控制計時器有助于實現(xiàn)更好的控制和更好的數(shù)字輸出.pdf》資料免費下載
    發(fā)表于 08-28 11:30 ?0次下載
    MSPM0-高級控制計時器<b class='flag-5'>有助于</b>實現(xiàn)更好的控制和更好的數(shù)字輸出

    惠普計劃50%以上PC生產(chǎn)轉(zhuǎn)移到中國以外區(qū)域

    行業(yè)芯事行業(yè)資訊
    電子發(fā)燒友網(wǎng)官方
    發(fā)布于 :2024年08月08日 11:16:38

    有助于提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)

    有助于提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)
    的頭像 發(fā)表于 07-25 09:49 ?252次閱讀
    <b class='flag-5'>有助于</b>提高網(wǎng)絡(luò)設(shè)備性能的FRAM SF25C20(MB85RS2MT)

    愛普生的高精度傳感技術(shù)有助于監(jiān)控自動化

    Epson、JREast和NaganoKeiki聯(lián)合開發(fā)了一種適用于鐵路運營商的實用撓度監(jiān)測設(shè)備-愛普生的高精度傳感技術(shù)有助于監(jiān)控自動化-SeikoEpsonCorporation(TSE:6724
    的頭像 發(fā)表于 06-27 10:53 ?323次閱讀
    愛普生的高精度傳感技術(shù)<b class='flag-5'>有助于</b>監(jiān)控自動化

    如何PSoC4000部件的設(shè)計過渡到PSoC4000T部件?

    英飛凌提供哪些支持,幫助客戶現(xiàn)有 PSoC 設(shè)計轉(zhuǎn)移到新產(chǎn)品中? 如何 PSoC4000 部件的設(shè)計過渡到 PSoC4000T 部件? PSoC4000 部件僅支持 PSoC Creator
    發(fā)表于 05-29 06:35

    如何用加載分散法軟件中部分變量從內(nèi)部RAM轉(zhuǎn)移到外部RAM?

    如何用加載分散法軟件中部分變量從內(nèi)部RAM轉(zhuǎn)移到外部RAM, 加載分散法文件怎么設(shè)置?堆和棧需要設(shè)置嗎?
    發(fā)表于 05-10 07:52

    馬斯克訪華:討論FSD在華落地并爭取數(shù)據(jù)轉(zhuǎn)移許可

    兩位知情人士透露,他將與中國政府高層官員商討自動駕駛軟件FSD在華實施可能性及相關(guān)數(shù)據(jù)跨境轉(zhuǎn)移問題。據(jù)悉,馬斯克希望通過此次訪問獲得將其在華所采集汽車數(shù)據(jù)轉(zhuǎn)移到境外用于自動駕駛算法訓(xùn)練的許可。
    的頭像 發(fā)表于 04-28 14:45 ?865次閱讀

    17pin航空插頭需具備低功耗特性

    德索工程師說道17pin航空插頭需具備低功耗特性的原因,低功耗特性意味著航空插頭傳輸信號和電源時能夠減少能量的消耗,從而提高整個系統(tǒng)的能效。航空領(lǐng)域,能效的提高不僅
    的頭像 發(fā)表于 04-13 14:27 ?309次閱讀
    17pin航空插頭需具備低功耗<b class='flag-5'>特性</b>嗎

    微芯片上使用3D反射器堆棧有助于加快6G通信的發(fā)展

    一項新的研究發(fā)現(xiàn),微芯片上使用3D反射器堆棧可以使無線鏈路的數(shù)據(jù)速率提高三倍,從而有助于加快6G通信的發(fā)展。
    的頭像 發(fā)表于 03-13 16:31 ?644次閱讀

    友達宣布關(guān)閉新加坡LCD面板產(chǎn)線,生產(chǎn)設(shè)備轉(zhuǎn)移到中國臺灣

    據(jù)日經(jīng)新聞報導(dǎo),友達光電(2409)將在本月底之前關(guān)閉新加坡的LCD面板產(chǎn)線,生產(chǎn)設(shè)備轉(zhuǎn)移到中國臺灣,影響多達500名員工。
    發(fā)表于 12-21 10:20 ?569次閱讀

    傳蘋果iPad新產(chǎn)品導(dǎo)入資源從中國轉(zhuǎn)移至越南

    蘋果公司的npi大部分都是為了利用中國數(shù)十年的硬件制造經(jīng)驗,與美國庫比提諾工程師合作中國進行。但由于地緣政治的不確定性,公司不得不重新考慮。此前有報道稱,蘋果公司計劃iphone的部分npi工作轉(zhuǎn)移到印度。
    的頭像 發(fā)表于 12-08 14:35 ?814次閱讀