代計(jì)算機(jī)的數(shù)據(jù)是以二進(jìn)制的形式進(jìn)行存儲(chǔ)的。 位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。使用位運(yùn)算可以提高代碼性能,精簡(jiǎn)代碼。
在說位運(yùn)算前,先簡(jiǎn)單說說幾個(gè)概念,具體有機(jī)器數(shù)、真值、原碼、反碼、補(bǔ)碼
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式,叫做這個(gè)數(shù)的機(jī)器數(shù)。
機(jī)器數(shù)是帶符號(hào)的,計(jì)算機(jī)中機(jī)器數(shù)的最高位是符號(hào)位, 正數(shù)為0, 負(fù)數(shù)為1。
二進(jìn)制的位數(shù)受機(jī)器設(shè)備的限制。機(jī)器內(nèi)部設(shè)備一次能表示的二進(jìn)制位數(shù)叫機(jī)器的字長(zhǎng),一臺(tái)機(jī)器的字長(zhǎng)是固定的。字長(zhǎng)8位叫一個(gè)字節(jié)(Byte),機(jī)器字長(zhǎng)一般都是字節(jié)的整數(shù)倍,如字長(zhǎng)8位、16位、32位、64位。
例如在8位機(jī)器中,+3轉(zhuǎn)為二進(jìn)制為 00000011,-3轉(zhuǎn)為二進(jìn)制為 10000011,其中00000011和10000011就是機(jī)器數(shù)。
直接用正號(hào)“+”和負(fù)號(hào)“-”來表示其正負(fù)的二進(jìn)制數(shù)叫做機(jī)器數(shù)的真值。
例如“00000011”和“10000011”是兩個(gè)機(jī)器數(shù),而它們的真值分別為+0000011(即+3)和-0000011(即-3)。
將數(shù)的真值形式中“+”號(hào)用“0”表示,“-”號(hào)用“1”表示時(shí),叫做數(shù)的原碼形式,簡(jiǎn)稱原碼。
也可理解為符號(hào)位加上真值的絕對(duì)值。第一位是符號(hào)位,其余位表示數(shù)值。
例如:
十進(jìn)制 | 真值 | 原碼 |
+3 | +0000011 | 00000011 |
-3 | -0000011 | 10000011 |
原碼的表示比較直觀,但是在進(jìn)行加減法運(yùn)算時(shí),由于符號(hào)位的存在,使得機(jī)器的運(yùn)算比較復(fù)雜,所以就引入了反碼和補(bǔ)碼。
對(duì)于正數(shù)來說,其反碼和原碼完全相同。
對(duì)于負(fù)數(shù)來說,其反碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變,其他位取反(0變1,1變0)。
十進(jìn)制 | 真值 | 原碼 | 反碼 |
+3 | +0000011 | 00000011 | 00000011 |
-3 | -0000011 | 10000011 | 11111100 |
對(duì)于正數(shù)來說,其補(bǔ)碼和原碼完全相同。
對(duì)于負(fù)數(shù)來說,其補(bǔ)碼是其反碼的末位加1,也就是說在其原碼的基礎(chǔ)上, 符號(hào)位不變,其他位取反后加1。
十進(jìn)制 | 真值 | 原碼 | 反碼 | 補(bǔ)碼 |
+3 | +0000011 | 00000011 | 00000011 | 00000011 |
-3 | -0000011 | 10000011 | 11111100 | 11111101 |
注意:在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。主要原因是為了便于處理和運(yùn)算。
具體為何需要引入反碼和補(bǔ)碼以及為何計(jì)算機(jī)系統(tǒng)中數(shù)值用補(bǔ)碼來表示和存儲(chǔ),文章篇幅有限,此塊也不是本文的重點(diǎn),詳細(xì)可以參考這篇文章www.cnblogs.com/zhangziqiu/…
? 在 JavaScript 中,數(shù)值是以64位浮點(diǎn)數(shù)的形式儲(chǔ)存。但是位運(yùn)算符只對(duì)整數(shù)起作用。JavaScript在做位運(yùn)算時(shí),會(huì)事先將其轉(zhuǎn)換為32位有符號(hào)整型(用比特序列表示,即0和1組成)并開始計(jì)算,在得到結(jié)果后再將其轉(zhuǎn)回JavaScript的數(shù)值類型。
? 因?yàn)?js 的整數(shù)默認(rèn)是帶符號(hào)數(shù),所以在位運(yùn)算中,只能使用 31 位,開發(fā)者是不能訪問最高位的。在運(yùn)算時(shí),如果位數(shù)超過,那么超過的數(shù)字會(huì)被丟棄,這會(huì)造成各種錯(cuò)誤的結(jié)果,并且沒有任何警告信息。所以,并不是所有計(jì)算都適合通過位運(yùn)算符來計(jì)算。
? 位運(yùn)算符操作的是數(shù)值對(duì)應(yīng)的機(jī)器數(shù),這個(gè)機(jī)器數(shù)的表示形式就是補(bǔ)碼的形式。(上面說了,為了便于處理和運(yùn)算,計(jì)算機(jī)系統(tǒng)中,數(shù)值用補(bǔ)碼來表示和存儲(chǔ)。)
? JavaScript中的位運(yùn)算符有以下:
console.log(5 & 3) // 輸出1
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 3的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000011
// 所以計(jì)算結(jié)果為1 00000000 00000000 00000000 00000001
:或運(yùn)算;兩個(gè)運(yùn)算比較的bit位只要有一個(gè)是1,這個(gè)bit位就是1
console.log(5 | 3) // 輸出7
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 3的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000011
// 所以計(jì)算結(jié)果為7 00000000 00000000 00000000 00000111
^ :異或運(yùn)算;兩個(gè)運(yùn)算比較的bit位相同則為0,不同則為1
console.log(5 ^ 3) // 輸出6
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 3的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000011
// 所以計(jì)算結(jié)果為6 00000000 00000000 00000000 00000110
~:取反運(yùn)算;0變1,1變0
console.log(~5) // 輸出-6
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 取反之后表示為 11111111 11111111 11111111 11111010
// 該數(shù)是負(fù)數(shù),負(fù)數(shù)補(bǔ)碼與原碼不同,先將其轉(zhuǎn)為原碼的反碼:11111111 11111111 11111111 11111001
// 再轉(zhuǎn)為原碼:10000000 00000000 00000000 00000110
// 所以結(jié)果為:-6
<< :左移;各二進(jìn)位全部左移若干位,高位丟棄(即左邊超出的丟棄),低位補(bǔ)0(即右邊差的)
console.log(5 << 3) // 輸出40
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 左移三位結(jié)果為40 00000000 00000000 00000000 00101000
圖示:
console.log(-1073741822 << 2) // 輸出8
// -1073741822的機(jī)器數(shù)表示為 11000000 00000000 00000000 00000010
// 左移兩位結(jié)果為8 00000000 00000000 00000000 00001000
圖示:
>> :帶符號(hào)擴(kuò)展右移;各二進(jìn)位全部右移若干位,右邊被移出的丟棄,左邊會(huì)復(fù)制最左側(cè)的位來填充左側(cè)(這里最左側(cè)的位是符號(hào)位,也可以認(rèn)為對(duì)于無符號(hào)數(shù),高位補(bǔ) 0,對(duì)于有符號(hào)數(shù),高位補(bǔ)符號(hào)位)。
console.log(5 >> 2) // 輸出1
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 帶符號(hào)擴(kuò)展右移兩位結(jié)果為1 00000000 00000000 00000000 00000001
圖示:
console.log(-5 >> 2) // 輸出-2
// -5的機(jī)器數(shù)表示為: 11111111 11111111 11111111 11111011
// 帶符號(hào)擴(kuò)展右移兩位結(jié)果為: 11111111 11111111 11111111 11111110
// 先將該值轉(zhuǎn)為原碼的反碼: 11111111 11111111 11111111 11111101
// 再轉(zhuǎn)為原碼: 10000000 00000000 00000000 00000010
// 所以結(jié)果為:-2
圖示:
>>> :無符號(hào)右移;各二進(jìn)位全部右移若干位,右邊被移出的丟棄,左邊用0填充。因?yàn)榉?hào)位變成了 0,所以結(jié)果總是非負(fù)數(shù)。(即便右移 0 個(gè)比特,結(jié)果也是非負(fù)的。)
console.log(5 >>> 2) // 輸出1
// 5的機(jī)器數(shù)表示為 00000000 00000000 00000000 00000101
// 無符號(hào)右移兩位結(jié)果為1 00000000 00000000 00000000 00000001
圖示:
console.log(-5 >>> 2) // 輸出1073741822
// -5的機(jī)器數(shù)表示為: 11111111 11111111 11111111 11111011
// 無符號(hào)右移兩位結(jié)果為1073741822: 00111111 11111111 11111111 11111110
根據(jù)數(shù)值的機(jī)器數(shù)最后一位是0還是1即可判斷,為0就是偶數(shù),為1就是奇數(shù)。
function fun(num) {
if ((num & 1)===0) {
return "偶數(shù)";
}
if ((num & 1)===1) {
return "奇數(shù)";
}
}
console.log(fun(44)); // 輸出偶數(shù)
console.log(fun(55)); // 輸出奇數(shù)
不使用第三個(gè)變量,實(shí)現(xiàn)兩個(gè)數(shù)交換,可以通過以下方式實(shí)現(xiàn)
a=a + b;
b=a - b;
a=a - b;
// 或者
a=[b, (b=a)][0];
// 或者
[a, b]=[b, a]
根據(jù)異或運(yùn)算的規(guī)則,可以得出一些特性
// a取任何值,下面的結(jié)果都成立
a^a=0
a^0=a
// 異或運(yùn)算且滿足交換律和結(jié)合律,即
a^b=b^a
a^b^c=a^(b^c)=(a^c)^b
// 其實(shí)與運(yùn)算也是滿足交換律和結(jié)合律的
a&b=b&a
a&b&c=a&(b&c)=(a&c)&b
// 于是就可以推出
a^b^a=b^(a^a)=b^0=b
// 如果 c=a^b 那么 a=c^b,這是因?yàn)?a=c^b=a^b^b=a^(b^b)=a^0=a
// 如果 d=a^b^c 那么 a=d^b^c, 以此類推...
那么根據(jù)以上的特性,就可以用位運(yùn)算的方式實(shí)現(xiàn)兩數(shù)交換,如下
a=a^b
b=a^b
a=a^b
將某個(gè)數(shù)值帶符號(hào)右移一位,相當(dāng)于該數(shù)值除以2;
將某個(gè)數(shù)值左移一位,相當(dāng)于該數(shù)值除以2;
console.log(6 >> 1) // 輸出3
console.log(6 << 1) // 輸出12
而右移n位,就相當(dāng)于該數(shù)值除以2的n次方
而左移n位,就相當(dāng)于該數(shù)值乘以2的n次方
console.log(32 >> 3) // 輸出4, 相當(dāng)于32除以2的3次方(8),等于4
console.log(32 << 3) // 輸出256, 相當(dāng)于32乘以2的3次方(8),等于256
但是用這種用法實(shí)現(xiàn)乘除法有很多問題,比如
console.log(7 >> 1) // 輸出3
如果數(shù)值操作影響到了符號(hào)位,結(jié)果會(huì)錯(cuò)誤
console.log(-2147483646 << 1) // 輸出4, 而-2147483646除以2的結(jié)果應(yīng)該是-1073741823
console.log(5.2 | 0) // 輸出5
console.log(-7.2 | 0) // 輸出-7
通過與運(yùn)算實(shí)現(xiàn):將數(shù)值與-1進(jìn)行或運(yùn)算從而得到該數(shù)值的整數(shù)部分
console.log(5.2 & -1) // 輸出5
console.log(-7.2 & -1) // 輸出-7
通過異或運(yùn)算實(shí)現(xiàn):
console.log(5.2 ^ 0);// 輸出5
console.log(-7.2 ^ 0);// 輸出-7
將數(shù)值與另一個(gè)數(shù)進(jìn)行兩次異或運(yùn)算
console.log(5.2 ^ 2 ^ 2); // 輸出5
console.log(-7.2 ^ 2 ^ 2);// 輸出-7
通過取反運(yùn)算實(shí)現(xiàn):將數(shù)值進(jìn)行兩次取反運(yùn)算
console.log(~~5.2); // 輸出5
console.log(~~-7.2); // 輸出-7
通過左移或右移運(yùn)算實(shí)現(xiàn):將數(shù)值左移或右移0位
console.log(5.2 >> 0); // 輸出5
console.log(-7.2 << 0); // 輸出-7
位掩碼(BitMask),是”位(Bit)“和”掩碼(Mask)“的組合詞。”位“指代著二進(jìn)制數(shù)據(jù)當(dāng)中的二進(jìn)制位,而”掩碼“指的是一串用于與目標(biāo)數(shù)據(jù)進(jìn)行按位操作的二進(jìn)制數(shù)字。組合起來,就是”用一串二進(jìn)制數(shù)字(掩碼)去操作另一串二進(jìn)制數(shù)字“的意思。
位掩碼可以用于多種場(chǎng)景,比較常用的,我們可以用它來進(jìn)行權(quán)限管理。
假設(shè)我們?cè)谧鲆粋€(gè)直播教學(xué)系統(tǒng),每個(gè)學(xué)生都有其自己的狀態(tài),比如是否舉手,攝像頭狀態(tài),設(shè)備類型三個(gè)狀態(tài)。
如果我們給每個(gè)學(xué)生設(shè)置三個(gè)狀態(tài)值,那會(huì)很麻煩(這里只是舉例三個(gè),現(xiàn)實(shí)場(chǎng)景可能有七八個(gè)狀態(tài)值)
那么我們可以設(shè)計(jì)每個(gè)學(xué)生一個(gè)狀態(tài)碼,例如這個(gè)狀態(tài)碼是一個(gè)9位的二進(jìn)制數(shù)
我們可以這個(gè)數(shù)上劃分每個(gè)狀態(tài)所占的位
例如從最低位(按最低位0)開始
具體可以在代碼中定義一個(gè)枚舉:
const enums={
// 舉手狀態(tài)
handsUp: {
open: 0b01, // 舉手中
close: 0b10, // 未舉手
unknow: 0b00, // 未知
lowBitPos: 0, // 從第幾位開始使用
bitLength: 2, // 所占位的長(zhǎng)度
},
// 攝像頭狀態(tài)
camera: {
open: 0b001, // 打開
close: 0b010, // 關(guān)閉
disable: 0b011, // 設(shè)備故障
ban: 0b100, // 被禁用
unknow: 0b000, // 未知
lowBitPos: 2, // 從第幾位開始使用
bitLength: 3, // 所占位的長(zhǎng)度
},
// 設(shè)備類型
device: {
window: 0b0001, // window電腦
mac: 0b0010, // 蘋果電腦
ipad: 0b0011, // 蘋果平板
android: 0b0100, // 安卓手機(jī)
ios: 0b0111, // 蘋果手機(jī)
unknow: 0b0000, // 未知
lowBitPos: 5, // 從第幾位開始使用
bitLength: 4, // 所占位的長(zhǎng)度
}
};
例如我隨便舉個(gè)例子,假設(shè)某個(gè)學(xué)生的狀態(tài)碼為 0b001001001
那么其對(duì)應(yīng)狀態(tài)如下
但是在代碼中,我們要如何獲取或修改學(xué)生狀態(tài)對(duì)應(yīng)的值呢?這就要用到前面所說的位掩碼的知識(shí)了
首先是獲取狀態(tài)值,我們需要從該狀態(tài)碼中截取出指定的從某一位到某一位的值。
// 舉個(gè)例子,假設(shè)學(xué)生此時(shí)的狀態(tài)碼為0b001001001,獲取該學(xué)生的攝像頭狀態(tài)
let state=0b001001001
// 因?yàn)閿z像頭狀態(tài)是從低位開始(0開始)第二位到第四位
// 首先將狀態(tài)碼右移兩位
let v=state >> enums.camera.lowBitPos // enums上面定義了
// 然后將轉(zhuǎn)換后的值與0b111進(jìn)行與運(yùn)算
let result=v & 0b111
console.log(result) // 輸出結(jié)果為3,也就是0b010,如此便獲取到了該學(xué)生的攝像頭狀態(tài)
上面代碼中,因?yàn)閿z像頭狀態(tài)是占了三個(gè)bit位,所以需要與0b111進(jìn)行與運(yùn)算來得到結(jié)果,但是舉手狀態(tài)是兩位,設(shè)備類型是四位,就要分別和0b11和0b1111進(jìn)行與運(yùn)算,這樣比較麻煩,所以上面的代碼可以優(yōu)化為
let result=v & ((0b1 << enums.camera.bitLength) - 1)
也可以將所有需要用到的位全是1的值先存在數(shù)組里面,方便后續(xù)運(yùn)算
const bitArr=[0b0]
// 但位運(yùn)算時(shí)僅支持 1 << 31大小
for (let i=1; i < 32; i++) {
bitArr.push((0b1 << i) - 1)
}
Object.freeze(bitArr) // 凍結(jié)數(shù)組 不允許修改
let result=v & bitArr[enums.camera.bitLength]
總結(jié)上面代碼,我們可以將獲取狀態(tài)值封裝為一個(gè)函數(shù)
const getProvide=(state, lowBitPos, bitLength)=> {
return (state >> lowBitPos) & bitArr[bitLength]
}
知道如何獲取以后,那么修改該如何呢
例如,目前學(xué)生的狀態(tài)碼對(duì)應(yīng)的設(shè)置狀態(tài)為0b0010(蘋果電腦),我們要修改學(xué)生的設(shè)備狀態(tài)為0b0100(安卓手機(jī))
let state=0b001001001
// 首先先獲取設(shè)備狀態(tài)對(duì)應(yīng)的值
let deviceState=getProvide(state, enums.device.lowBitPos, enums.device.bitLength)
// 然后先清除設(shè)備狀態(tài)對(duì)應(yīng)的位數(shù)區(qū)間
let clearState=state - (deviceState << enums.device.lowBitPos)
// 然后重新加上新的狀態(tài)區(qū)間即可
let result=clearState + (enums.device.android << enums.device.lowBitPos)
console.log(result.toString(2)) // 輸出 010001001
封裝為函數(shù)如下
const setProvide=(state, lowBitPos, bitLength, newSingleState)=> {
const get=getProvide(state, lowBitPos, bitLength)
let clearState=state - (get << lowBitPos)
return clearState + (newSingleState << lowBitPos)
}
如此便實(shí)現(xiàn)了對(duì)學(xué)生用戶的權(quán)限狀態(tài)控制。
今快速發(fā)展的技術(shù)環(huán)境中,AI正在變革各行各業(yè)并推動(dòng)創(chuàng)新,理解AI性能指標(biāo)的復(fù)雜性至關(guān)重要。過去許多AI模型需要在云端運(yùn)行。當(dāng)我們走向由終端側(cè)生成式AI處理定義的未來時(shí),我們必須能夠評(píng)估計(jì)算平臺(tái)可運(yùn)行AI模型的性能、準(zhǔn)確性和效率。如今,TOPS(每秒萬億次運(yùn)算)是衡量處理器AI性能的主要方式之一。TOPS是基于處理器所需的架構(gòu)和頻率,衡量處理器潛在AI推理峰值性能的方法,比如神經(jīng)網(wǎng)絡(luò)處理器(NPU)。下面我們將深入探討。
NPU是什么?
在深入探討TOPS的具體內(nèi)容之前,讓我們先看看NPU的重要性。對(duì)于終端側(cè)AI處理,NPU在提高效率、為個(gè)人用戶和企業(yè)提供創(chuàng)新的應(yīng)用體驗(yàn)方面發(fā)揮著關(guān)鍵作用。評(píng)估這些專用處理器的性能需要全面了解其能力背后的關(guān)鍵指標(biāo)。
NPU的演進(jìn)改變了人們處理計(jì)算的方式。傳統(tǒng)上,CPU負(fù)責(zé)執(zhí)行AI算法。隨著對(duì)處理性能的需求飆升,專用NPU應(yīng)運(yùn)而生,成為處理AI相關(guān)軟件應(yīng)用的專用解決方案。NPU旨在高效處理AI任務(wù)所需的復(fù)雜數(shù)學(xué)計(jì)算,提供出色的效率、性能和能效。
AI TOPS是什么?
TOPS作為展示處理器計(jì)算能力的指標(biāo),是衡量NPU性能的核心。
TOPS通過以萬億單位測(cè)量一秒鐘內(nèi)執(zhí)行的運(yùn)算(加法、乘法等)次數(shù)來量化NPU處理能力。
這種標(biāo)準(zhǔn)化測(cè)量方式非常明確地顯示了NPU的性能,可作為比較不同處理器和架構(gòu)AI性能的關(guān)鍵指標(biāo)。因?yàn)門OPS是針對(duì)NPU的基礎(chǔ)性能指標(biāo),探索TOPS的計(jì)算參數(shù)以及它們?nèi)绾螞Q定性能至關(guān)重要,這有助于更深入地了解NPU的能力。
乘法累加(MAC)運(yùn)算執(zhí)行AI工作負(fù)載中的核心數(shù)學(xué)公式。矩陣乘法由兩類基礎(chǔ)運(yùn)算組成:累加器的乘法和加法。例如,一個(gè)MAC單元可在每個(gè)時(shí)鐘周期內(nèi)運(yùn)行兩類基礎(chǔ)運(yùn)算各一次,意味著它在每個(gè)時(shí)鐘周期內(nèi)執(zhí)行兩個(gè)運(yùn)算。一個(gè)給定的NPU有一定數(shù)量的MAC單元,能夠在不同精度級(jí)別進(jìn)行運(yùn)算,這取決于NPU架構(gòu)。頻率決定NPU及其MAC單元(以及CPU或GPU)運(yùn)算的時(shí)鐘速度(或每秒周期數(shù)),直接影響整體性能。更高的頻率允許在單位時(shí)間內(nèi)執(zhí)行更多運(yùn)算,從而提高處理速度。但是,提高頻率也會(huì)導(dǎo)致更高功耗和發(fā)熱,影響電池續(xù)航和用戶體驗(yàn)。處理器TOPS計(jì)算通常使用峰值運(yùn)行頻率。
精度指計(jì)算的顆粒度,通常精度越高模型準(zhǔn)確性就越高,需要的計(jì)算強(qiáng)度也越高。最常見的高精度AI模型為32位和16位浮點(diǎn)精度,而速度更快的低精度低功耗模型通常使用8位和4位整數(shù)精度。當(dāng)前行業(yè)標(biāo)準(zhǔn)為以INT8精度評(píng)估AI推理性能TOPS。
計(jì)算TOPS要從計(jì)算OPS開始,OPS等于MAC單元數(shù)乘以運(yùn)行頻率的兩倍。TOPS數(shù)量是OPS除以一萬億的值,將公式更簡(jiǎn)單地列出,即TOPS=2×MAC單元數(shù)×頻率/1萬億。
TOPS和實(shí)際性能
盡管TOPS提供了探索NPU能力的重要信息,我們?nèi)员仨殞⒗碚撝笜?biāo)和實(shí)際應(yīng)用聯(lián)系起來。畢竟,僅僅有高TOPS值并不能保證最佳的AI性能;各種因素協(xié)同作用的結(jié)果才能真正決定NPU實(shí)力。
因此評(píng)估NPU性能時(shí)要考慮內(nèi)存帶寬、軟件優(yōu)化和系統(tǒng)集成等方面的因素。基準(zhǔn)測(cè)試可以幫助我們超越數(shù)字,了解NPU在實(shí)際場(chǎng)景中的表現(xiàn),其中時(shí)延、吞吐量和能效尤為重要。
ProcyonAI基準(zhǔn)測(cè)試使用真實(shí)工作負(fù)載來幫助將理論性的TOPS評(píng)估轉(zhuǎn)化為用戶在使用AI推理的真實(shí)應(yīng)用中對(duì)響應(yīng)和處理能力的預(yù)期。它以多個(gè)精度運(yùn)行六個(gè)模型,提供NPU不同性能表現(xiàn)的詳細(xì)洞察。類似模型在生產(chǎn)力、媒體、創(chuàng)作者和其他應(yīng)用中越來越常見。在Procyon AI和其他基準(zhǔn)測(cè)試中有更快的性能表現(xiàn),與實(shí)現(xiàn)更快推理和更好用戶體驗(yàn)息息相關(guān)。
為此,分析實(shí)際性能可以為NPU的能力和局限性提供寶貴洞察。必須從可行性和實(shí)用性角度檢驗(yàn)性能指標(biāo)。
未來NPU性能指標(biāo)
隨著技術(shù)不斷快速發(fā)展,數(shù)字化轉(zhuǎn)型需求持續(xù)影響各行各業(yè),NPU性能指標(biāo)格局將進(jìn)一步演進(jìn)。盡管新興趨勢(shì)正在更廣泛地定義和評(píng)估NPU性能與計(jì)算的方式,TOPS仍是很好的性能指標(biāo),沒有理由認(rèn)為它會(huì)很快被淘汰。
隨著各種AI新技術(shù)在未來幾年受到關(guān)注并重新定義無數(shù)行業(yè),對(duì)能夠反應(yīng)不同技術(shù)獨(dú)特特征的可靠性能指標(biāo)的需求將不斷凸顯。適應(yīng)性、可擴(kuò)展性和實(shí)際應(yīng)用相關(guān)性將定義未來的NPU性能指標(biāo)。
根據(jù)用戶需求評(píng)估NPU性能
應(yīng)對(duì)快速變化的NPU性能評(píng)估領(lǐng)域或許會(huì)讓人望而生畏,但隨著數(shù)字化轉(zhuǎn)型(尤其是在AI領(lǐng)域)持續(xù)快速發(fā)展,深入了解TOPS對(duì)行業(yè)和個(gè)人來說都很重要。
最終,選擇合適的系統(tǒng)級(jí)芯片(SoC)取決于用戶、客戶或組織的工作負(fù)載和優(yōu)先級(jí),而這一決策很可能需要取決于SoC中的NPU。
無論用戶是優(yōu)先考慮原始算力、能效還是模型準(zhǔn)確度,驍龍X系列平臺(tái)面向筆記本電腦,配備高達(dá)45TOPS的NPU,能夠強(qiáng)力賦能PC,并將實(shí)際可用的AI體驗(yàn)引入用戶的工作流程。
(8750069)
天來聊聊內(nèi)存的問題。內(nèi)存可能是大家忽略的點(diǎn),但它對(duì)網(wǎng)游的提升還是很大的,還是從這四個(gè)部分了解內(nèi)存。
·第一、內(nèi)存在電腦中的作用。內(nèi)存就是電腦中CPU和硬盤的臨時(shí)倉(cāng)庫(kù),臨時(shí)處理一些數(shù)據(jù)用于電腦運(yùn)行內(nèi)存的臨時(shí)儲(chǔ)存,關(guān)機(jī)后自動(dòng)清空。
·第二、內(nèi)存名稱的含義。以DDR4、3200MHZ、16GB舉例,DDR4為內(nèi)存的型號(hào),D5為最強(qiáng),D1為最弱,目前主流的是D5、D4,其他的基本被淘汰掉了。3200MHZ代表內(nèi)存的基本頻率,16GB表示內(nèi)存的容量。
·第三、選擇內(nèi)存時(shí)需要關(guān)注的參數(shù)。
→內(nèi)存頻率:內(nèi)存的運(yùn)行速度。
→超頻問題:通過增加電壓的方法讓內(nèi)存的性能提升。比如內(nèi)存的工作電壓1.2V頻率為2666MHZ,通過XMP設(shè)置讓內(nèi)存在1.35V的電壓下發(fā)揮出2888MHZ的頻率來提升其運(yùn)行速度。
→內(nèi)存的通道數(shù):同樣的容量下雙通道內(nèi)存是大于單通道內(nèi)存的,速度更快效率更高。比如需要16G內(nèi)存,一定選擇兩根8G而不是1根16G。
→內(nèi)存容量:有2/4/6/8/16/32/64G,主流容量為8G、16G、32G。
使用場(chǎng)景如下:
→內(nèi)存顆粒:內(nèi)存的核心部分分為原片、白片、黑片,其中黑片已經(jīng)被淘汰掉了。
→內(nèi)存時(shí)序:CPU和內(nèi)存交互取數(shù)所花費(fèi)的時(shí)間相同頻率下其延遲時(shí)間越短越好。
了解了這些來看看內(nèi)存的選擇建議。由于內(nèi)存品牌多爭(zhēng)議大,我只提出推薦的品牌可以選擇金士頓、芝奇、英睿達(dá)、海盜船、威剛、雷克莎、金百達(dá)。內(nèi)存顆粒只選三星、海力士、美光這三家,但注意一定走雙通道。
視頻到這里就結(jié)束了,如果視頻幫到你請(qǐng)點(diǎn)個(gè)關(guān)注,這對(duì)我很重要。