国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[C#] .NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension)

這篇具有很好參考價(jià)值的文章主要介紹了[C#] .NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者: zyl910

發(fā)現(xiàn).NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension),這給編寫SIMD向量化算法帶來了方便。

一、指令說明

在學(xué)習(xí)Arm的AdvSimd(Neon)指令集時(shí),發(fā)現(xiàn)它的Lookup(查表)功能,類似X86的Sse系列指令集中的字節(jié)Shuffle(換位。如 _mm_shuffle_epi8 )功能。
而且Arm的Lookup不僅支持單個(gè)向量的查表,且支持多個(gè)向量的查表。具體來說,是2~4個(gè)向量。
單個(gè)向量查表(如 vqvtbl1q_u8)時(shí),只能在 16字節(jié)(128位)的范圍內(nèi)進(jìn)行查表。而使用4個(gè)向量查表(如 vqtbl4q_u8 )時(shí),能在 16*4=64字節(jié)(512位)的范圍內(nèi)進(jìn)行查表。

.NET 5.0開始支持Arm的內(nèi)在函數(shù),但當(dāng)時(shí)僅支持單個(gè)向量查表。
現(xiàn)在 .NET 8.0 補(bǔ)上了這個(gè)空缺。

二、API文檔的變化

對(duì)于AdvSimd.Arm64.VectorTableLookup 方法,.NET 5.0 的文檔是只有2個(gè)重載。

VectorTableLookup(Vector128<SByte>, Vector128<SByte>)    // int8x16_t vqvtbl1q_s8(int8x16_t t, uint8x16_t idx)
VectorTableLookup(Vector128<Byte>, Vector128<Byte>)    // uint8x16_t vqvtbl1q_u8(uint8x16_t t, uint8x16_t idx)

到了.NET 8.0 ,文檔多了6個(gè)重載。

VectorTableLookup(ValueTuple<Vector128<Byte>,Vector128<Byte>,Vector128<Byte>,Vector128<Byte>>, Vector128<Byte>)        // uint8x16_t vqtbl4q_u8 (uint8x16x4_t t、uint8x16_t idx)
VectorTableLookup(ValueTuple<Vector128<Byte>,Vector128<Byte>,Vector128<Byte>>, Vector128<Byte>)    // uint8x16_t vqtbl3q_u8 (uint8x16x3_t t、uint8x16_t idx)
VectorTableLookup(ValueTuple<Vector128<Byte>,Vector128<Byte>>, Vector128<Byte>)    // uint8x16_t vqtbl2q_u8 (uint8x16x2_t t、uint8x16_t idx)
VectorTableLookup(ValueTuple<Vector128<SByte>,Vector128<SByte>,Vector128<SByte>,Vector128<SByte>>, Vector128<SByte>)    // int8x16_t vqtbl4q_s8 (int8x16x4_t t、uint8x16_t idx)
VectorTableLookup(ValueTuple<Vector128<SByte>,Vector128<SByte>,Vector128<SByte>>, Vector128<SByte>)    // int8x16_t vqtbl3q_s8 (int8x16x3_t t、uint8x16_t idx)
VectorTableLookup(ValueTuple<Vector128<SByte>,Vector128<SByte>>, Vector128<SByte>)    // int8x16_t vqtbl2q_s8 (int8x16x2_t t、uint8x16_t idx)

可見,2、3、4個(gè)向量的查表功能都加上了了。隨后再區(qū)分一下 Byte/SByte 這2種類型,于是共增加了 3*2=6 個(gè)重載。

三、官方說明

查了一下,發(fā)現(xiàn)在官方博文《Arm64 Performance Improvements in .NET 8》(.NET 8 中的 Arm64 性能改進(jìn))里有說明。
這一段內(nèi)容的機(jī)器翻譯如下。

VectorTableLookup 和 VectorTableLookupExtension
在 .NET 8 中,我們?cè)赟ystem.Runtime.Intrinsics.Arm命名空間下添加了兩組新的 API:VectorTableLookup和 VectorTableLookupExtension。

      public static Vector64<byte> VectorTableLookup((Vector128<byte>, Vector128<byte>) table, Vector64<byte> byteIndexes);
      public static Vector64<byte> VectorTableLookup(Vector64<byte> defaultValues, (Vector128<byte>, Vector128<byte>) table, Vector64<byte> byteIndexes);

讓我們看一下每個(gè) API 的示例。

// Vector128<byte> a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
// Vector128<byte> b = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160
// Vector64<byte> index = 3, 31, 4, 40, 18, 19, 30, 1

Vector64<byte> ans = VectorTableLookup((a, b), index);

// ans = 4, 160, 5, 0, 30, 40, 150, 2

在上面的示例中,向量 a 和 b 被視為一個(gè)表,共有 32 個(gè)條目(16 個(gè)來自 a,16 個(gè)來自 b),索引從 0 開始。如果索引超出范圍,例如在我們的示例中試圖訪問索引 40,API 將返回該超出范圍索引的值 0。

// Vector64<byte> d = 100, 200, 300, 400, 500, 600, 700, 800
// Vector128<byte> a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
// Vector128<byte> b = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160
// Vector64<byte> index = 3, 31, 4, 40, 18, 19, 30, 1

Vector64<byte> ans = VectorTableLookupExtension(d, (a, b), index);

// ans = 4, 160, 5, 400, 30, 40, 150, 2

與 VectorTableLookup相反,當(dāng)使用VectorTableLookupExtension方法時(shí),如果索引超出有效范圍,則結(jié)果中的相應(yīng)元素將由參數(shù)中提供的defaultValues值確定。值得注意的是,這些 API 還有其他變體,它們也在 3 實(shí)體和 4 實(shí)體元組上運(yùn)行,為各種用例提供了靈活性。

在 dotnet/runtime#85189 中,@MihaZupan 利用此 API 優(yōu)化了 IndexOfAny,顯著提高了 30% 的性能。同樣,在 dotnet/runtime#87126 中,@SwapnilGaikwad 顯著增強(qiáng)了 Guid 格式化器的性能,實(shí)現(xiàn)了高達(dá) 40% 的性能提升。這些優(yōu)化表明,利用這一強(qiáng)大的 API 可以大幅提高性能。

四、X86平臺(tái)的對(duì)應(yīng)

X86的Sse、Avx系列指令集,僅支持單個(gè)向量查表。
直到Avx512系列指令集的出現(xiàn),它增加了2個(gè)向量查表的指令 VPERMI2B。

.NET8.0也增加了對(duì)Avx512系列指令集的支持,便支持了該指令。

對(duì)于512位向量,可以使用 Avx512Vbmi 類中的方法。

PermuteVar64x8x2(Vector512<Byte>, Vector512<Byte>, Vector512<Byte>)    // __m512i _mm512_permutex2var_epi8 (__m512i a, __m512i idx, __m512i b)
PermuteVar64x8x2(Vector512<SByte>, Vector512<SByte>, Vector512<SByte>)    // __m512i _mm512_permutex2var_epi8 (__m512i a, __m512i idx, __m512i b)

對(duì)于128、256位向量,可以使用 Avx512Vbmi.VL 類中的方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-842833.html

PermuteVar16x8x2(Vector128<Byte>, Vector128<Byte>, Vector128<Byte>)    // __m128i _mm_permutex2var_epi8 (__m128i a,__m128i idx,__m128i b)
PermuteVar16x8x2(Vector128<SByte>, Vector128<SByte>, Vector128<SByte>)    // __m128i _mm_permutex2var_epi8 (__m128i a,__m128i idx,__m128i b)

PermuteVar32x8x2(Vector256<Byte>, Vector256<Byte>, Vector256<Byte>)    // __m256i _mm256_permutex2var_epi8 (__m256i a, __m256i idx, __m256i b)
PermuteVar32x8x2(Vector256<SByte>, Vector256<SByte>, Vector256<SByte>)    // __m256i _mm256_permutex2var_epi8 (__m256i a, __m256i idx, __m256i b)

參考文獻(xiàn)

  • 《AdvSimd.Arm64.VectorTableLookup 方法》. https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.intrinsics.arm.advsimd.arm64.vectortablelookup?view=net-8.0
  • 《Avx512Vbmi.PermuteVar64x8x2 方法》. https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.intrinsics.x86.avx512vbmi.permutevar64x8x2?view=net-8.0
  • 《Avx512Vbmi.VL 類》. https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.intrinsics.x86.avx512vbmi.vl?view=net-8.0
  • Kunal Pathak《Arm64 Performance Improvements in .NET 8》. https://devblogs.microsoft.com/dotnet/this-arm64-performance-in-dotnet-8/

到了這里,關(guān)于[C#] .NET8增加了Arm架構(gòu)的多寄存器的查表函數(shù)(VectorTableLookup/VectorTableLookupExtension)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ARM寄存器組織

    ARM寄存器組織

    ?ARM有37個(gè)32位長(zhǎng)的寄存器: 1個(gè)用做PC(Program Counter); 1個(gè)用做CPSR(Current Program Status Register); 5個(gè)用做SPSR(Saved Program Status Registers); 30個(gè)通用寄存器。 ARM處理器共有37個(gè)寄存器,被分為若干個(gè)組(BANK),這些寄存器均為32位的寄存器。6個(gè)狀態(tài)寄存器,用以標(biāo)識(shí)CPU的工作狀

    2024年02月01日
    瀏覽(39)
  • Arm匯編---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 條件碼:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、數(shù)據(jù)寄存器 --------------------------------------------- ------------------------------------------ 二、指針寄存器 --------------------------------------------- --------------------

    2024年02月02日
    瀏覽(22)
  • ARM處理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM異常中斷處理流程?

    ARM處理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM異常中斷處理流程?

    快速學(xué)習(xí)嵌入式開發(fā)其他基礎(chǔ)知識(shí)? 返回專欄總目錄 《嵌入式工程師自我修養(yǎng)/C語(yǔ)言》 Tip??:鼠標(biāo)懸停雙虛線/句,可獲得更詳細(xì)的描述 ??ARM處理器有多種工作模式,如下表所示。應(yīng)用程序正常運(yùn)行時(shí),ARM處理器工作在 用戶模式(User mode) ,當(dāng)程序運(yùn)行出錯(cuò)或有中

    2024年02月21日
    瀏覽(567)
  • ARM中的寄存器

    ARM中的寄存器

    ARM工作模式 ARM有8個(gè)基本的工作模式 User 非特權(quán)模式,一般在執(zhí)行上層的應(yīng)用程序時(shí)ARM處于該模式 FIQ 當(dāng)一個(gè)高優(yōu)先級(jí)中斷產(chǎn)生后ARM將進(jìn)入這種模式 IRQ 當(dāng)一個(gè)低優(yōu)先級(jí)中斷產(chǎn)生后ARM將進(jìn)入這種模式 SVC 當(dāng)復(fù)位或執(zhí)行軟中斷指令后ARM將進(jìn)入這種模式 Abort 當(dāng)產(chǎn)生存取異常時(shí)ARM將進(jìn)

    2024年02月03日
    瀏覽(20)
  • 12.3 ARM寄存器組織

    12.3 ARM寄存器組織

    目錄 ARM寄存器組織(一) 寄存器 概念 作用 分類 ARM寄存器 ARM寄存器組織(二) 專用寄存器 R15(PC,Program Counter) R14(LR,Link Register) R13(SP,Stack Pointer) ARM寄存器組織(三) CPSR寄存器 ARM寄存器組織(一) 寄存器 概念 寄存器是處理器內(nèi)部的存儲(chǔ)器,沒有地址 C語(yǔ)言中register存儲(chǔ)在寄

    2024年02月13日
    瀏覽(20)
  • ARM編程模型-寄存器組

    ARM編程模型-寄存器組

    Cortex A系列ARM處理器共有40個(gè)32位寄存器,其中33個(gè)為通用寄存器,7個(gè)為狀態(tài)寄存器。usr模式和sys模式共用同一組寄存器。 通用寄存器包括R0~R15,可以分為3類: 未分組寄存器R0~R7 分組寄存器R8~R14、R13(SP) 、R14(LR) 程序計(jì)數(shù)器PC(R15)、R8_fiq-R12_fir為快中斷獨(dú)有 在不同模式下,名稱相同的

    2024年02月10日
    瀏覽(17)
  • 【ARM】——當(dāng)前程序狀態(tài)寄存器 CPSR

    【ARM】——當(dāng)前程序狀態(tài)寄存器 CPSR

    Current Program Status Register 即 CPSR,當(dāng)前程序狀態(tài)寄存器,可以在任何處理器模式下被訪問。它包含了條件標(biāo)志位、中斷禁止位,當(dāng)前處理器模式標(biāo)志以及其他的一些控制和狀態(tài)位。 除了 usr 和 sys 模式外,每一種處理器模式下都有一個(gè)專用的物理寄存器,稱為 SPSR(備份程序狀態(tài)寄

    2024年02月03日
    瀏覽(30)
  • ARM64 寄存器、常用匯編指令收集

    ARM64 有34個(gè)寄存器,包括31個(gè)通用寄存器、SP、PC、CPSR。 寄存器 位數(shù) 描述 x0-x30 64bit 通用寄存器,如果有需要可以當(dāng)做32bit使用:WO-W30 FP(x29) 64bit 保存棧幀地址(棧底指針) LR(x30) 64bit 通常稱X30為程序鏈接寄存器,保存子程序結(jié)束后需要執(zhí)行的下一條指令 SP 64bit 保存棧指針,使用

    2023年04月20日
    瀏覽(31)
  • ARM匯編寄存器和常用指令詳解

    ARM匯編寄存器和常用指令詳解

    對(duì)于32位及其以下的ARM處理器來說,函數(shù)調(diào)用規(guī)則如下: 父函數(shù)與子函數(shù)的入口參數(shù)以此通過 R0~R3 這4個(gè)寄存器傳遞。 父函數(shù)在調(diào)用子函數(shù)前先將子函數(shù)入口參數(shù)存入 R0~R3 寄存器中,若只有一個(gè)入口參數(shù)則使用 R0 寄存器傳遞,若有2個(gè)入口參數(shù)則使用 R0 和 R1 寄存器傳遞,以

    2024年02月03日
    瀏覽(29)
  • day3 ARM寄存器組織

    day3 ARM寄存器組織

    目錄 寄存器 ?ARM寄存器 專用寄存器 CPSR寄存器 概念: 寄存器是處理器內(nèi)部的存儲(chǔ)器,沒有地址; 作用: 一般用于暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果; 分類: 包括通用寄存器、專用寄存器、控制寄存器; ? 注:在某個(gè)特定模式下只能使用當(dāng)前模式下寄存器,一個(gè)模式下

    2024年02月08日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包