![](/img/trans.png)
[英]Why does false sharing still affect non atomics, but much less than atomics?
[英]Does storing false bool values cost less electrical energy?
今晚要睡覺了,我一直在想:如果bool
,例如在 C++ 中,設置為false
,這意味着它的所有(8 或 16)位都設置為 0(似乎是)。
據我所知,零位意味着某些晶體管中沒有電流流動,因此, false
bool
會在某些電池低於true
的設備中浪費能量?
因此,如果是,最好在函數中將默認值 boolean (甚至可能是其他)參數設置為false
:
代替:
void DrawImage(int x, int y, bool cached = true);
做
void DrawImage(int x, int y, bool not_cached = false);
據我所知,零位意味着某些晶體管中沒有電流流動,因此,假布爾值會在某些電池少於真值的設備中浪費能量?
不,不是因為這個原因。 CMOS 邏輯沒有電流在 static state 中流動,僅在狀態之間的轉換中(對寄生電容充電/放電,以及作為上拉和下拉晶體管都部分導通的任何直通電流) )。 當然,除了漏電流之外,這在較低時鍾速度下有些顯着。
CMOS 或多或少是對稱的,除了 N 溝道和 P 溝道 MOSFET 之間的差異,因此 1 在電壓狀態和晶體管如何讓電荷流動方面與 0 沒有區別。
在其他一些邏輯系列(如TTL(帶上拉電阻的雙極晶體管))中,一個門的 output 是正確的,其中晶體管會通過上拉電阻將電流拉至地。 但只適用於一扇門; 通常邏輯涉及多次反轉,因為放大器自然會反轉(在 CMOS 或 TTL 或 RTL 中)。
也僅用於用於參數傳遞的寄存器中的 64 位中的 1 位。 CPU 的流水線 state 和亂序執行機制比實際的架構 state(寄存器值)和正在操作的數據需要更多的晶體管(和門)。 所以 1 位的 state 可以忽略不計。
CPU 中的大量微型晶體管是 CPU 幾十年來一直使用 CMOS 邏輯的原因,否則那些通過 RTL 或 TTL 中的上拉電阻的 static 電流會將它們熔化。
即使使用 CMOS,功率密度自 2000 年代初以來一直是一個問題(頻率縮放的“功率牆”,如 現代微處理器 A 90 分鍾指南中所述!如果您想了解更多有關 CPU 設計注意事項的信息,這是非常重要的閱讀材料)。 在 CMOS 中,需要更高的電壓才能更快地切換(大約線性),並且電容器中的能量與 V^2 成比例。 並且電流僅在門從 0 切換到 1 時才會在 CMOS 中流動,反之亦然,而這種情況發生的速率是 CPU 時鍾的某個因素。 因此,在給定頻率下以最小電壓運行,功率與f^3
左右成比例。
在 x86 上, xor edi, edi
是比mov edi, 1
便宜的指令。 在 Sandybridge 系列 CPU 上,它甚至不需要后端的執行單元,所以這肯定是一些不需要切換的晶體管。 以及更小的指令(2 字節 vs. 5,或 3 用於mov dil, 3
以犧牲部分寄存器性能為代價來節省代碼大小)。 所以傳遞一個0
或許可以提高性能,讓相同數量的指令更快地完成,讓 CPU 更快地回到睡眠狀態(競爭睡眠)。 與否,可能很容易沒有效果,或者后面指令的不同代碼 alignment 可能恰好與較長的指令更好。
大多數其他 ISA 在寄存器中歸零與設置 1 之間沒有太大區別。 甚至在 x86 上,這通常也不是一個非常有價值的優化。
但是,如果您可以選擇一個特殊的值, 0
是一個不錯的選擇,特別是對於非bool
整數,因為測試0
與非0
比測試任何其他數字更有效。 (例如,如果您使用普通int
, x != 0
比x == 1
便宜。使用bool
,如果您執行b == true
,編譯器已經可以測試非零。)
雖然這在技術上可能會節省能源,但節省的量可以忽略不計,因為它只有一個位被設置為真或假,並且考慮到權衡,您必須使用 go 的長度才能使其值得。
即便如此,讓讀者跳過更多的心理障礙,讓你的代碼更難閱讀,因為不得不對布爾值三思而后行,這是一個壞主意。 不過,想想也很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.