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

x86平臺SIMD編程入門(2):通用指令

這篇具有很好參考價值的文章主要介紹了x86平臺SIMD編程入門(2):通用指令。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、重解釋轉(zhuǎn)換

雖然128位的XMM寄存器在硬件上只是256位YMM寄存器的下半部分,但在C++中它們是不同的類型。有一些intrinsic函數(shù)可以將它們重新解釋為不同的類型,如下表所示,行代表源類型,列代表目標(biāo)類型。

__m128 __m128d __m128i __m256 __m256d __m256d
__m128 = _mm_castps_pd _mm_castps_si128 _mm256_castps128_ps256
__m128d _mm_castpd_ps = _mm_castpd_si128 _mm256_castpd128_pd256
__m128i _mm_castsi128_ps _mm_castsi128_pd = _mm256_castsi128_si256
__m256 _mm256_castps256_ps128 = _mm256_castps_pd _mm256_castps_si256
__m256d _mm256_castpd256_pd128 _mm256_castpd_ps = _mm256_castpd_si256
__m256i _mm256_castsi256_si128 _mm256_castsi256_ps _mm256_castsi256_pd =

這些函數(shù)不會被編譯成任何指令,所以性能上幾乎沒有損耗,因為它們不改變寄存器中的值,例如32位float浮點數(shù)1.0f轉(zhuǎn)換成32位整數(shù)后會變?yōu)?code>0x3f800000。將128位值轉(zhuǎn)換成256位值時,上半部分是未定義的。

2、類型轉(zhuǎn)換

類型轉(zhuǎn)換只支持帶符號的32位整數(shù),例如:

函數(shù)示例 說明
_mm_cvtepi32_ps、_mm256_cvtepi32_ps 將32位整數(shù)轉(zhuǎn)換成對應(yīng)的32位浮點數(shù)
_mm_cvtepi32_pd_mm256_cvtepi32_pd 將32位整數(shù)轉(zhuǎn)換成對應(yīng)的64位浮點數(shù)
_mm_cvtps_epi32、_mm256_cvtps_epi32 將32位浮點數(shù)轉(zhuǎn)換成對應(yīng)的32位整數(shù)
_mm_cvtpd_epi32_mm256_cvtpd_epi32 將64位浮點數(shù)轉(zhuǎn)換成對應(yīng)的32位整數(shù)

當(dāng)浮點數(shù)轉(zhuǎn)換為整數(shù)時,函數(shù)使用MXCSR寄存器中指定的舍入模式,若要更改模式,可以使用宏_MM_SET_ROUNDING_MODE。此外,也有一些名稱中帶有額外t的函數(shù)會忽略MXCSR寄存器,并始終使用向零截斷(_MM_ROUND_TOWARD_ZERO)的模式,例如_mm_cvttpd_epi32、_mm_cvttps_epi32。

此外還有一些函數(shù)可以在32位浮點數(shù)與64位浮點數(shù)之間進行轉(zhuǎn)換,例如_mm256_cvtps_pd將32位浮點數(shù)轉(zhuǎn)換成64位浮點數(shù)。

3、內(nèi)存訪問

3.1、加載

  • 對齊/非對齊加載:所有數(shù)據(jù)類型都支持對齊加載和非對齊加載。對齊加載例如_mm_load_si128_mm256_load_ps,它們要求源地址是16字節(jié)或者32字節(jié)對齊的,否則可能會導(dǎo)致崩潰;非對齊加載例如_mm_loadu_si128_mm256_loadu_ps,它們函數(shù)名中額外的u表示unaligned,它們的速度可能會慢于對齊加載的版本。

  • 單通道加載:__m128__m128d支持單通道加載,即只加載第一條通道并把其它通道設(shè)置成0.0,例如_mm_load_ss_mm_load_sd

  • 逆序加載:__m128__m128d支持逆序加載,即以逆序方式將數(shù)據(jù)加載到寄存器中,例如_mm_loadr_ps_mm_loadr_pd。

  • 廣播加載:在AVX指令集中, __m128、__m256__m256d支持廣播加載,也就是把單個值加載到多個寄存器通道中,例如_mm256_broadcast_ss等。

  • 掩碼加載:AVX引入了掩碼加載,即根據(jù)掩碼的值選擇性地加載數(shù)據(jù),例如_mm_maskload_ps等。

  • 跨距加載:AVX2引入了跨距加載,它可以利用索引寄存器來加載非連續(xù)地址的數(shù)據(jù)元素,不過速度較慢,例如_mm_i32gather_ps等。

  • 流加載:這類指令繞過緩存,直接將內(nèi)存數(shù)據(jù)加載到寄存器中,從而減少緩存污染和緩存替換的開銷,適用于一次性讀取大量數(shù)據(jù)并進行向量化計算的場景,例如_mm_stream_load_si128、_mm256_stream_load_si256等。

3.2、存儲

  • 對齊/非對齊存儲:與對齊/非對齊加載同理,對應(yīng)的存儲指令也有_mm_store_ps、_mm_storeu_ps等。

  • 單通道存儲:與單通道加載類似,只把第一條通道的數(shù)據(jù)寫入內(nèi)存,例如_mm_store_ss等。

  • 逆序存儲:與逆序加載類似,它以逆序方式將數(shù)據(jù)寫入內(nèi)存中,例如_mm_storer_ps等。

  • 掩碼存儲:與掩碼加載類似,根據(jù)掩碼的值選擇性地存儲數(shù)據(jù),例如_mm_maskstore_ps等。

  • 流存儲:與流加載指令類似,繞過緩存直接將數(shù)據(jù)寫入內(nèi)存,從而減少了緩存寫回的開銷,適用于大規(guī)模數(shù)據(jù)的存儲操作,例如_mm_stream_ps、_mm256_stream_si256等。

4、向量寄存器初始化

所有向量寄存器類型都有_mm_setzero_ps_mm256_setzero_si256這樣的函數(shù),用于將寄存器初始化為全零,它可能會被編譯成xorps xmm0, xmm0, xmm0這樣的指令,其執(zhí)行效率很高。

雖然CPU無法使用0以外的常量來初始化寄存器,但編譯器還是提供了一些函數(shù)來實現(xiàn)非0初始化,例如_mm_set_ps可以用不同的值初始化各個通道,_mm256_set1_epi用相同的值初始化所有通道。這些函數(shù)的實現(xiàn)依據(jù)具體情況而定:如果參數(shù)是編譯時的常量,它們通常會被編譯成二進制文件中的只讀數(shù)據(jù);如果編譯時無法確定參數(shù),編譯器就會執(zhí)行其它合理操作,例如寄存器大部分為0,而我們只設(shè)置了一條通道,那么編譯器可能會執(zhí)行插入指令,再比如參數(shù)來自變量,編譯器就可能會先實行洗牌或標(biāo)量存儲、然后再進行向量加載。

5、向量寄存器與通用寄存器的轉(zhuǎn)換

數(shù)據(jù)類型 數(shù)據(jù)復(fù)制方向 函數(shù)示例
整數(shù) 向量寄存器最低通道 ==> 通用寄存器 _mm_cvtsi128_si32、_mm_cvtsi128_si64
整數(shù) 通用寄存器 ==> 向量寄存器最低通道 _mm_cvtsi32_si128_mm_cvtsi64x_si128
浮點數(shù) 向量寄存器最低通道 ==> 通用寄存器 _mm_cvtss_f32、_mm_cvtsd_f64
浮點數(shù) 通用寄存器 ==> 向量寄存器最低通道 沒有對應(yīng)的轉(zhuǎn)換函數(shù),但可以使用_mm_set_ps_mm_set1_ps實現(xiàn)相同功能

上表中列舉的轉(zhuǎn)換函數(shù)只操作向量寄存器的最低通道,除此之外還有一類函數(shù)可以將整數(shù)向量寄存器任意通道的值復(fù)制到通用寄存器,它們是_mm_extract_epi8、_mm_extract_epi16等。

當(dāng)程序是32位時,所有通用寄存器也都是32位的,在向量寄存器和通用寄存器之間移動64位整數(shù)的指令不可用。

6、位運算

浮點數(shù)和整數(shù)有一套完整的位運算指令,它們包含AND、OR、XOR、ANDNOT指令,例如_mm_and_ps、_mm256_xor_epi32等。如果需要位運算NOT,最快的方法可能是與所有1進行XOR,例如:

__m128i bitwiseNot(__m128i x)
{
    const __m128i zero = _mm_setzero_si128();
    const __m128i one = _mm_cmpeq_epi32(zero, zero);
    return _mm_xor_si128(x, one);
}

test指令將計算結(jié)果直接保存到int型的通用寄存器中,部分test函數(shù)及其功能如下表所示:文章來源地址http://www.zghlxwxcb.cn/news/detail-741777.html

函數(shù)示例 返回結(jié)果
_mm_testz_si128、_mm256_testz_si256 return ((a & b) == 0) ? 1 : 0
_mm_testc_si128、_mm256_testc_si256 return (((~a) & b) == 0) ? 1 : 0
_mm_testnzc_si128、_mm256_testnzc_si256 testztestc結(jié)果都為0時返回1,否則返回0
_mm_test_all_ones 把輸入向量取反后與全1向量按位與,如果等于0則返回1,否則返回0
_mm_test_all_zeros 把輸入向量與掩碼向量按位與,如果等于0則返回1,否則返回0

到了這里,關(guān)于x86平臺SIMD編程入門(2):通用指令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【ARMv8 SIMD和浮點指令編程】NEON 通用數(shù)據(jù)處理指令——復(fù)制、反轉(zhuǎn)、提取、轉(zhuǎn)置...

    【ARMv8 SIMD和浮點指令編程】NEON 通用數(shù)據(jù)處理指令——復(fù)制、反轉(zhuǎn)、提取、轉(zhuǎn)置...

    NEON 通用數(shù)據(jù)處理指令包括以下指令(不限于): ? DUP 將標(biāo)量復(fù)制到向量的所有向量線。 ? EXT 提取。 ? REV16、REV32、REV64 反轉(zhuǎn)向量中的元素。 ? TBL、TBX 向量表查找。 ? TRN 向量轉(zhuǎn)置。 ? UZP、ZIP 向量交叉存取和反向交叉存取。 1 DUP (element) 將向量元素復(fù)制為向量或標(biāo)量。

    2024年02月07日
    瀏覽(23)
  • 【ARMv8 SIMD和浮點指令編程】浮點數(shù)據(jù)轉(zhuǎn)換指令——數(shù)據(jù)類型互轉(zhuǎn)必備

    浮點數(shù)據(jù)轉(zhuǎn)換指令包括不同的浮點精度數(shù)之間的轉(zhuǎn)換,還包括整型和浮點數(shù)之間的轉(zhuǎn)化。 在了解數(shù)據(jù)轉(zhuǎn)換指令前,必須學(xué)習(xí) IEEE 754 定義的五種舍入規(guī)則。前兩條規(guī)則舍入到最接近的值,其他的稱為定向舍入: 舍入到最接近的值 Round to nearest, ties to even – rounds to the nearest va

    2024年02月02日
    瀏覽(26)
  • 2023年的深度學(xué)習(xí)入門指南(9) - SIMD和通用GPU編程

    2023年的深度學(xué)習(xí)入門指南(9) - SIMD和通用GPU編程

    深度學(xué)習(xí)從一開始就跟GPU有不解之緣,因為算力是深度學(xué)習(xí)不可或缺的一部分。 時至今日,雖然多任務(wù)編程早已經(jīng)深入人心,但是很多同學(xué)還沒有接觸過CPU上的SIMD指令,更不用說GPGPU的編程。這一篇我們先給SIMD和GPU編程掃個盲,讓大家以后用到的時候有個感性認(rèn)識。 從多線

    2024年02月02日
    瀏覽(28)
  • (匯編) 基于VS的x86匯編基礎(chǔ)指令

    visual studio 選擇x86運行 示例代碼 OV 溢出 超出表示范圍為溢出 1,否則 0 UP 增量 1:以遞減順序?qū)?shù)據(jù)串處理;0:以遞增順序?qū)?shù)據(jù)串處理 EI 允許中斷 CPU允許中斷1,否則0 PL 正 運算結(jié)果為正則為1,否則0 ZR 零 運算結(jié)果為0則為1,否則0 AC 輔助進位 低4位向高位進位1,否則0 P

    2024年02月06日
    瀏覽(19)
  • x86匯編_MUL/IMUL乘法指令_筆記52

    x86匯編_MUL/IMUL乘法指令_筆記52

    32位模式下整數(shù)乘法可以實現(xiàn)32、16或8位的操作,64位下還可以使用64位操作數(shù)。MUL執(zhí)行無符號乘法,IMUL執(zhí)行有符號乘法。 MUL指令:無符號數(shù)乘法 32 位模式下,MUL(無符號數(shù)乘法)指令有三種類型: 執(zhí)行 8 位操作數(shù)與 AL 寄存器的乘法; 執(zhí)行 16 位操作數(shù)與 AX 寄存器的乘法;

    2024年02月07日
    瀏覽(25)
  • 華為云RDS通用型(x86) vs 鯤鵬(ARM)架構(gòu)的性能對比

    華為云RDS通用型(x86) vs 鯤鵬(ARM)架構(gòu)的性能對比

    之前,我們對比了阿里云RDS的經(jīng)濟版(ARM)與x86版的性價比,這次我們來看看華為云的RDS MySQL的“通用型”(x86)與“鯤鵬通用增強型”(ARM)版本的情況如何。 這里依舊選擇了用戶較為常用的4c16g的規(guī)格進行測試,測試工具使用了sysbench的oltp_read_write模型進行測試。配置參數(shù)與選

    2024年02月03日
    瀏覽(52)
  • 發(fā)布 VectorTraits v2.0(支持 x86的Sse系列指令集等)

    目錄 支持 x86的Sse系列指令集 為 Vector128/Vector256 補充全部的向量方法 提供CPU型號信息 結(jié)果范例1: X86 CPU on Windows 結(jié)果范例2: Arm CPU on Linux 結(jié)果范例3: Arm CPU on Mac OS 提供所支持的指令集信息 結(jié)果范例1: X86 CPU on Windows 結(jié)果范例2: Arm CPU on Linux 結(jié)果范例3: Arm CPU on Mac OS 新增了向量方

    2024年03月17日
    瀏覽(42)
  • x86 平臺運行 arm 的方法

    參考: https://github.com/multiarch/qemu-user-static 核心是使用 binfmt_misc 設(shè)定運行 arm 的默認(rèn)程序為 qemu-aarch64-static 1.先下載 arm64 即 aarch64 的運行文件 2.設(shè)置默認(rèn)打開方式, 即設(shè)置 binfmt_misc 以支持 arm64 程序的運行 # --reset 會刪除同名條目后重新設(shè)置 3.測試 4.不用映射qemu-*-static也可以使用

    2024年02月12日
    瀏覽(24)
  • 【麒麟V10系統(tǒng)x86環(huán)境--bash: ./install:/bin/bash:解釋器錯誤: 權(quán)限不夠】
  • 【ARMv8 SIMD和浮點指令編程】NEON 乘法指令——乘法知多少?

    【ARMv8 SIMD和浮點指令編程】NEON 乘法指令——乘法知多少?

    NEON 乘法指令包括向量乘法、向量乘加和向量乘減,還有和飽和相關(guān)的指令??傊?,乘法指令是必修課,在我們的實際開發(fā)中會經(jīng)常遇到。 1 MUL (by element) 乘(向量,按元素)。該指令將第一個源 SIMDFP 寄存器中的向量元素乘以第二個源 SIMDFP 寄存器中的指定值,將結(jié)果放入向

    2024年02月08日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包