第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么SSE標(biāo)量sqrt(x)比rsqrt(x)* x慢?

為什么SSE標(biāo)量sqrt(x)比rsqrt(x)* x慢?

絕地?zé)o雙 2019-12-16 10:30:22
為什么SSE標(biāo)量sqrt(x)比rsqrt(x)* x慢?我一直在Intel Core Duo上進(jìn)行一些核心數(shù)學(xué)分析,在查看各種平方根方法時,我注意到了一些奇怪的事情:使用SSE標(biāo)量運(yùn)算,倒數(shù)平方根乘以它會更快獲取sqrt,而不是使用本機(jī)sqrt操作碼!我正在用類似這樣的循環(huán)對其進(jìn)行測試:inline float TestSqrtFunction( float in );void TestFunc(){  #define ARRAYSIZE 4096  #define NUMITERS 16386  float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 )  float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache  cyclecounter.Start();  for ( int i = 0 ; i < NUMITERS ; ++i )    for ( int j = 0 ; j < ARRAYSIZE ; ++j )    {       flOut[j] = TestSqrtFunction( flIn[j] );       // unrolling this loop makes no difference -- I tested it.    }  cyclecounter.Stop();  printf( "%d loops over %d floats took %.3f milliseconds",          NUMITERS, ARRAYSIZE, cyclecounter.Milliseconds() );}我已經(jīng)為TestSqrtFunction使用了幾種不同的主體進(jìn)行了嘗試,并且確實(shí)有一些時機(jī)讓我很頭疼。到目前為止,最糟糕的是使用本機(jī)sqrt()函數(shù)并讓“智能”編譯器“優(yōu)化”。在24ns / float的情況下,使用x87 FPU確實(shí)很糟糕:inline float TestSqrtFunction( float in ){  return sqrt(in); }我嘗試的下一件事是使用內(nèi)部函數(shù)強(qiáng)制編譯器使用SSE的標(biāo)量sqrt操作碼:inline void SSESqrt( float * restrict pOut, float * restrict pIn ){   _mm_store_ss( pOut, _mm_sqrt_ss( _mm_load_ss( pIn ) ) );   // compiles to movss, sqrtss, movss}效果更好,為11.9ns / float。我也試過卡馬克的古怪牛頓迭代逼近技術(shù),這甚至比硬件跑,在4.3ns /浮動,雖然以1比2的錯誤10(這是太多了,我的目的)。當(dāng)我嘗試SSE op求倒數(shù)平方根,然后使用乘積獲得平方根(x * 1 /√x=√x)時,doozy出現(xiàn)了。即使需要兩次相關(guān)操作,它還是迄今為止最快的解決方案,速度為1.24ns /浮點(diǎn),精確度為2 -14:inline void SSESqrt_Recip_Times_X( float * restrict pOut, float * restrict pIn ){   __m128 in = _mm_load_ss( pIn );   _mm_store_ss( pOut, _mm_mul_ss( in, _mm_rsqrt_ss( in ) ) );   // compiles to movss, movaps, rsqrtss, mulss, movss}我的問題基本上是什么給?為什么SSE的內(nèi)置于硬件的平方根操作碼比從其他兩個數(shù)學(xué)運(yùn)算中合成出來的速度慢?我確信這確實(shí)是操作本身的成本,因?yàn)槲乙呀?jīng)驗(yàn)證:所有數(shù)據(jù)都適合緩存,并且訪問是順序的內(nèi)聯(lián)函數(shù)展開循環(huán)沒有區(qū)別編譯器標(biāo)志設(shè)置為完全優(yōu)化(并且匯編很好,我檢查過)(編輯:stephentyrone正確地指出,長數(shù)字串上的運(yùn)算應(yīng)使用矢量化SIMD打包操作,例如rsqrtps-但此處的數(shù)組數(shù)據(jù)結(jié)構(gòu)僅用于測試目的:我真正要衡量的是標(biāo)量性能,以用于代碼中無法向量化。)
查看完整描述

4 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊

sqrtss給出正確的舍入結(jié)果。 rsqrtss給出倒數(shù)的近似值,精確到大約11位。


sqrtss當(dāng)需要準(zhǔn)確性時,可以產(chǎn)生更準(zhǔn)確的結(jié)果。 rsqrtss存在一個近似值但需要速度的情況。如果您閱讀了英特爾的文檔,您還將發(fā)現(xiàn)一條指令序列(平方根的倒數(shù),后跟一個牛頓-拉夫森步長),幾乎可以提供全精度(如果我沒記錯的話,精度約為23位),并且仍然有些比快sqrtss。


編輯:如果速度至關(guān)重要,并且您實(shí)際上是在循環(huán)中調(diào)用許多值,則應(yīng)該使用這些指令的向量化版本,rsqrtps或sqrtps,這兩個指令每條處理四個浮點(diǎn)數(shù)。


查看完整回答
反對 回復(fù) 2019-12-16
?
BIG陽

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個贊

劃分也是如此。MULSS(a,RCPSS(b))比DIVSS(a,b)快得多。實(shí)際上,即使使用牛頓-拉夫森(Newton-Raphson)迭代來提高精度時,它仍然更快。


英特爾和AMD均在其優(yōu)化手冊中推薦了該技術(shù)。在不需要IEEE-754兼容的應(yīng)用程序中,使用div / sqrt的唯一原因是代碼可讀性。


查看完整回答
反對 回復(fù) 2019-12-16
  • 4 回答
  • 0 關(guān)注
  • 1716 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號