日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:Andreas Sü?enbach ? 2022-04-27 15:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

Vulkan -hpp 通過(guò)以下功能幫助消除運(yùn)行時(shí)錯(cuò)誤:

枚舉類與普通枚舉比較

幫助程序類 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 ,可以為這些枚舉類型中的每一種獲得一個(gè)枚舉類:

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

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

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

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

助手類 vk :: Flags

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

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

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

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

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

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

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

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

typedef struct VkStructName {
 VkStructureType sType;
 …
} VkStructName;

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

  • VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
  • VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO

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

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

就這么簡(jiǎn)單。當(dāng)您實(shí)例化類型為 StructName 的結(jié)構(gòu)時(shí),您不必?fù)?dān)心為成員 sType 設(shè)置正確的值,因?yàn)樗呀?jīng)設(shè)置好了。因?yàn)樗浅A砍蓡T,所以不能意外地覆蓋它。

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

幫助程序類 vk :: StructureChain

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

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

某些結(jié)構(gòu)被指定為延伸其他結(jié)構(gòu)。pNext指針用于創(chuàng)建結(jié)構(gòu)鏈。有些結(jié)構(gòu)可以多次成為該鏈的一部分,具有不同的實(shí)例。您的代碼 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

使用這種方法,有幾個(gè)潛在的錯(cuò)誤。例如, MIG ht 將一個(gè)結(jié)構(gòu)鏈到 AnchorStruct 實(shí)例,該實(shí)例沒(méi)有指定在鏈中?;蛘吣馔獾劓溄恿艘粋€(gè)結(jié)構(gòu)的多個(gè)實(shí)例,其中只允許一個(gè)實(shí)例。甚至內(nèi)存管理也會(huì)導(dǎo)致意外行為。例如,當(dāng)您有一個(gè)使用局部變量創(chuàng)建鏈的函數(shù)時(shí),就像前面的代碼示例中那樣,當(dāng)該函數(shù)最終按值返回錨點(diǎn)時(shí),您已經(jīng)注定要失敗了。 MIG 指出的鏈?zhǔn)浇Y(jié)構(gòu)已經(jīng)消失。

對(duì)于 Vulkan -hpp ,該代碼看起來(lái)幾乎相同:

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

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

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

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

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

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

型式安全

最后,我們來(lái)看一個(gè)稍微不同的主題,類型安全。這是 Vulkan 的一個(gè)問(wèn)題,尤其是對(duì)于 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 的指針作為最后一個(gè)參數(shù)。您還可以將 VkImage 分配給 VkBuffer 或?qū)λ鼈冞M(jìn)行比較,沒(méi)有任何錯(cuò)誤!

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

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

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

把您的 Vulkan 的項(xiàng)目切換到 C ++

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

關(guān)于作者

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

審核編輯:郭婷

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

    關(guān)注

    22

    文章

    2131

    瀏覽量

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

    關(guān)注

    1

    文章

    1673

    瀏覽量

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

    關(guān)注

    3

    文章

    1113

    瀏覽量

    52096
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Frame Advisor 2026.1版本的Vulkan采集功能重大升級(jí)

    與調(diào)優(yōu)工具套件,有助于圖形開(kāi)發(fā)者采集并分析 Vulkan 幀。同時(shí),該工具還能以清晰、直觀的方式呈現(xiàn) GPU 工作負(fù)載結(jié)構(gòu),精準(zhǔn)定位性能瓶頸。
    的頭像 發(fā)表于 05-06 09:53 ?303次閱讀
    Frame Advisor 2026.1版本的<b class='flag-5'>Vulkan</b>采集功能重大升級(jí)

    RX210 系列芯片電氣特性深度解析

    RX210 系列芯片電氣特性深度解析 電子工程師的日常設(shè)計(jì)工作中,深入了解芯片的電氣特性是確保設(shè)計(jì)成功的關(guān)鍵。今天,我們就來(lái)詳細(xì)剖析 RX210 系列芯片的電氣特性,這將
    的頭像 發(fā)表于 04-13 16:10 ?120次閱讀

    求助,F(xiàn)U6832S的UART案例程序有人能提供一下嗎?

    端口轉(zhuǎn)移到P00,P01。 一直通信不成功,這個(gè)芯片只能轉(zhuǎn)移,初始化放這里了,有緣人看到或有案例請(qǐng)回復(fù)一下,多謝了
    發(fā)表于 03-13 17:12

    深度解讀晶體管的轉(zhuǎn)移特性曲線

    本文介紹了晶體管轉(zhuǎn)移特性曲線及其核心參數(shù)的意義。曲線描述了柵壓控制漏極電流的過(guò)程,涵蓋關(guān)斷、亞閾值與導(dǎo)通區(qū),是定義數(shù)字邏輯和平衡芯片性能的基石。
    的頭像 發(fā)表于 01-26 17:33 ?6077次閱讀
    深度解讀晶體管的<b class='flag-5'>轉(zhuǎn)移</b><b class='flag-5'>特性</b>曲線

    JH7110 什么時(shí)候支持 Vulkan API?

    JH7110 什么時(shí)候支持 Vulkan API? 現(xiàn)在很多圖形應(yīng)用程序后端 API 正在遷移到 vulkan 支持 vulkan 后,您還可以運(yùn)行許多以前不支持的游戲 JH7110
    發(fā)表于 01-26 06:11

    沐渥科技:光罩盒氮?dú)夤竦奶攸c(diǎn)和注意事項(xiàng)

    光罩是半導(dǎo)體制造中光刻工藝所使用的圖形轉(zhuǎn)移工具或母版,它承載著設(shè)計(jì)圖形,通過(guò)光刻過(guò)程圖形轉(zhuǎn)移到光刻膠上,再經(jīng)過(guò)刻蝕等步驟轉(zhuǎn)移到襯底上,是集成電路、微電子制造的關(guān)鍵組件,其存放條件直接
    的頭像 發(fā)表于 01-05 10:29 ?354次閱讀
    沐渥科技:光罩盒氮?dú)夤竦奶攸c(diǎn)和注意事項(xiàng)

    單片機(jī)的條件轉(zhuǎn)移指令

    什么地方去呢?如果按照傳統(tǒng)的辦法,就要算偏移量,很麻煩,好在現(xiàn)在我們能借助于機(jī)器匯編了。因此這第指令我們能這樣理解:JZ 標(biāo)號(hào)。即轉(zhuǎn)移到標(biāo)號(hào)處。下面舉一例說(shuō)明: MOV A,R0 JZ L1 MOV R1
    發(fā)表于 12-15 08:01

    e203乘法器的優(yōu)化分享

    原來(lái)的MDV模塊需要17個(gè)周期通過(guò)迭代的方式實(shí)現(xiàn)乘法計(jì)算,作者采用了,booth 4 部分積陣列得到17個(gè)部分積,然后通過(guò)壓縮器組成的wallance樹(shù),巧妙的轉(zhuǎn)化成只剩下兩個(gè)操作數(shù),最終轉(zhuǎn)移到
    發(fā)表于 10-24 10:41

    如何創(chuàng)建一個(gè)浮點(diǎn)立即數(shù)

    常量的高20位 addi x15,x15,0x678 # 再將低12位加到高20位 而對(duì)于F寄存器,則需要另一條F指令S寄存器轉(zhuǎn)移到F寄存器,即浮點(diǎn)搬運(yùn)指令 FMV.W.X 該指令結(jié)構(gòu)為
    發(fā)表于 10-21 13:51

    rtsmart開(kāi)啟C++特性支持后,工具鏈編譯內(nèi)核不通過(guò)怎么解決?

    各位大佬好,本人在rtsmart項(xiàng)目中需要使用C++11特性,menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi編譯
    發(fā)表于 09-29 07:49

    基于Vulkan的端側(cè)AI運(yùn)算

    本期內(nèi)容由AI Model SIG提供,介紹了開(kāi)源鴻蒙中,利用圖形接口Vulkan的計(jì)算著色器能力,端側(cè)部署大模型的的整體思路和實(shí)踐分享。
    的頭像 發(fā)表于 09-10 17:19 ?1739次閱讀
    基于<b class='flag-5'>Vulkan</b>的端側(cè)AI運(yùn)算

    如何解決 Keil 中編譯時(shí)出現(xiàn) FILE DOES NOT EXSIT 錯(cuò)誤?

    如何解決 Keil 中編譯時(shí)出現(xiàn) FILE DOES NOT EXSIT 錯(cuò)誤?
    發(fā)表于 08-25 08:25

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6?

    Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6!
    發(fā)表于 08-20 06:29

    大模型真的有助于自動(dòng)駕駛落地嗎?

    其實(shí)大模型帶來(lái)的并不是單一的“萬(wàn)能解”,而是一個(gè)能夠顯著提升認(rèn)知、生成和推理能力的新工具箱。它能加速數(shù)據(jù)閉環(huán)、提升對(duì)復(fù)雜場(chǎng)景的理解、改善人機(jī)交互、并在工程流程中提高效率。
    的頭像 發(fā)表于 08-16 09:43 ?1356次閱讀
    大模型真的<b class='flag-5'>有助于</b>自動(dòng)駕駛落地嗎?

    飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯中間文件

    中間文件有助于我們判斷我們的uboot工程用到了哪些源文件,哪些源文件參與了編譯,方便我們調(diào)試代碼或調(diào)查異常的時(shí)候定位問(wèn)題。
    發(fā)表于 05-22 11:19
    平山县| 台安县| 宝清县| 开远市| 田东县| 黔东| 石渠县| 云浮市| 太康县| 宜兴市| 万盛区| 布尔津县| 从化市| 金平| 潜江市| 集贤县| 吉水县| 许昌县| 舟山市| 深泽县| 原平市| 滦平县| 南开区| 津南区| 内丘县| 比如县| 大邑县| 石楼县| 南华县| 邮箱| 巩留县| 洪雅县| 庐江县| 东乌珠穆沁旗| 揭西县| 南开区| 金寨县| 长沙县| 吉木萨尔县| 福安市| 东安县|