真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

float32轉(zhuǎn)float16-創(chuàng)新互聯(lián)

背景

當(dāng)下做AI基本都用float16進(jìn)行推理,目前用的比較多的還有bfloat16, 這里我們只討論float16的這個(gè)數(shù)據(jù)類型。float16有個(gè)優(yōu)點(diǎn)是大部分的GPU或者部分CPU支持float16的計(jì)算,速度快于float32, 此外顯存或者內(nèi)存也可以減少一半,基于這個(gè)特點(diǎn),所以有必要徹底弄清楚float16。

10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有尚義免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
  • float32
    float32就是我們?nèi)粘Uf的float,一共四個(gè)字節(jié),32個(gè)bit位,下面是125.5的bit分布。置于是怎么算的可以參考浮點(diǎn)數(shù)計(jì)算方法
    在這里插入圖片描述
  • float16
    float16也稱為本精度,一共兩個(gè)字節(jié),16個(gè)bit位。IEEE規(guī)定的格式是下面這種,一個(gè)符號位,5個(gè)指數(shù),10個(gè)尾數(shù)(計(jì)算和float32原理一樣,也是11位,有一個(gè)隱式位)。參考wiki
    在這里插入圖片描述
    這里簡單給一些demo計(jì)算:
    測試一、

flaot16: 0 01111 0000000000
sign = 0
exponent = 15
fraction (二進(jìn)制)= 1.0000000000
可以看到移動位數(shù)=exponent-15=0, 所以fraction的小數(shù)點(diǎn)不需要浮動,結(jié)果就是1

測試二、

flaot16: 0 01101 0101010101
sign = 0
exponent = 13
fraction (二進(jìn)制)= 1.0101010101
可以看到移動位數(shù)=exponent-15= -2, 所以fraction的小數(shù)點(diǎn)需要往左浮動2位,fraction就編程了0.010101010101,計(jì)算結(jié)果為pow(2, -2) + pow(2, -4) + pow(2, -6)+pow(2, -8) + pow(2, -10)+ pow(2, -12) ≈ 0.333252

如何轉(zhuǎn)

我們知道在C++上沒有float16這個(gè)數(shù)據(jù)類型,16bit的數(shù)據(jù)類型只有uint16_t這個(gè)基礎(chǔ)類型,所以fp32轉(zhuǎn)成fp16的話需要用uint16_t或者unsigned short來當(dāng)容器。流程就把fp32的整數(shù)部分轉(zhuǎn)為二進(jìn)制,小數(shù)部分轉(zhuǎn)為二進(jìn)制,算出小數(shù)點(diǎn)浮動的位置。
舉例:

float:0.333252
轉(zhuǎn)成二進(jìn)制為:0.010101010101…
可以知道往左浮動了2位,所以exponent=13, 對應(yīng)二進(jìn)制為01101
float16:0 01101 0101010101
這是一個(gè)粗略的想法,其實(shí)還要考慮各種數(shù)值范圍什么的,考慮到比較麻煩,這里有一些存在的api:

方法一:x86intrin.h
#include#includeint main()
{float f32;
    unsigned short f16;
    f32 = 3.14159265358979323846;
    f16 = _cvtss_sh(f32, 0);
    std::cout<< f32<< std::endl;
    f32 = _cvtsh_ss(f16);
    std::cout<< f32<< std::endl;
    return 0;
}

g++ -march=native a.cpp
在這里_cvtss_sh函數(shù)就可以把float32轉(zhuǎn)為float16。如果我們想看看fp16里面是不是符合預(yù)期,可以自己打印出來看看,工具函數(shù)如下:

void show(int num)
{stacks;
        for(int i=0; is.push(num&1);
                num >>= 1;
        }
        for(int i=0; i<32; i++)
        {int tmp = s.top();
                s.pop();
                cout<float f;
        int i;
        uint16_t ih;
};

int main()
{Bits bit;
    float f32;
    uint16_t f16;
    f32 = 3.14159265358979323846;
    bit.f = f32;
    show(bit.i);
    f16 = _cvtss_sh(f32, 0);
    std::cout<< f32<< std::endl;
    bit.i = 0;
    bit.ih = f16;
    show(bit.i);
    f32 = _cvtsh_ss(f16);
    std::cout<< f16<< std::endl;
     return 0;
}
方法二:cuda_fp16.h

在cuda中,也有針對host端給出的float16定義,不過類型名叫做half, 用戶可以直接利用該類型:

#include#includeint main()
{ half h_num = 0.234567f;
     h_num = h_num * 2;//實(shí)現(xiàn)了一些基礎(chǔ)算子
     //h_num *= 2; 沒有實(shí)現(xiàn)*=這個(gè)操作符
     cout<
方法三:自己實(shí)現(xiàn)

可以參考stackoverflow
這里高贊版本已經(jīng)更新為模板了,之前的版本可以參考PaddlePaddle中的paddle/phi/common/float16.h:105L, 這個(gè)就是借鑒stackoverflow的上高贊版本的第一次回答的方案。

綜上

下面都是在cpu端可以實(shí)現(xiàn)float32轉(zhuǎn)float16的相關(guān)手段。

explicit float16(float val) {//構(gòu)造函數(shù)
#if defined(__cuda__) 
    half tmp = __float2half(val);
    x = *reinterpret_cast(&tmp);
// arm給的實(shí)現(xiàn)方式
#elif defined(__arm__)
    float32x4_t tmp = vld1q_dup_f32(&val);
    float16_t res = vget_lane_f16(vcvt_f16_f32(tmp), 0);
    x = *reinterpret_cast(&res);

#elif defined(__x86__)
    x = _cvtss_sh(val, 0);

#else
    // Conversion routine adapted from
    // http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion
    Bits v, s;
    v.f = val;
    uint32_t sign = v.si & sigN;
    v.si ^= sign;
    sign >>= shiftSign;  // logical shift
    s.si = mulN;
    s.si = s.f * v.f;  // correct subnormals
    v.si ^= (s.si ^ v.si) & -(minN >v.si);
    v.si ^= (infN ^ v.si) & -((infN >v.si) & (v.si >maxN));
    v.si ^= (nanN ^ v.si) & -((nanN >v.si) & (v.si >infN));
    v.ui >>= shift;  // logical shift
    v.si ^= ((v.si - maxD) ^ v.si) & -(v.si >maxC);
    v.si ^= ((v.si - minD) ^ v.si) & -(v.si >subC);
    x = v.ui | sign;
#endif
  }

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站標(biāo)題:float32轉(zhuǎn)float16-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/esceo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部