原創|行業資訊|編輯:龔雪|2014-12-08 09:32:00.000|閱讀 343 次
概述:本文收集了為實現最佳性能而在結構內對齊數據的常識和一些最佳設計方案
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
每種數據類型都有一個與之相關的隊列,這個隊列是由處理器架構而非這個語言本身授權的。校準數據元素允許處理器以高效的方式從內存中抓取數據,并由此提高性能。為了提供最佳的性能,編譯器試圖保持這種數據元素的隊列。在32位和64位的Linux系統上,英特爾®C++編譯器上使用著的數據類型典型對齊要求如下:
Data Type |
32-bit(bytes) |
64-bit(bytes) |
char |
1 |
1 |
short |
2 |
2 |
int |
4 |
4 |
long |
8 |
8 |
float |
4 |
4 |
double |
8 |
8 |
long long |
8 |
8 |
long double |
4 |
16 |
Any pointer |
4 |
8 |
一般情況下,編譯器會在任何可能的時候都滿足這些數據元素的對齊要求。在使用英特爾®C++和Fortran編譯器的情況下,可以使用-align(C/C++,Fortran語言)編譯器開關來強制或禁止自然對齊規則。對于通常含有不同類型的數據元素的結構,編譯器試圖通過在元素之間插入未使用的存儲來保持的數據元素實現正確對齊。這種技術被稱為“填充”。此外,編譯器還會以它的最嚴格的對準成員為基準來對齊整個結構。編譯器也可能會增加結構的空間大小,必要的時候,編譯器會通過在結構端部添加填充的方式來使其實現成倍的對齊。這就是所謂的“尾填充”。如此一來,填充就醫浪費存儲空間的代價提升了性能。如果是英特爾®至強融核™協處理器,提供給應用程序可用存儲的數量本身是有限的,這會帶來一個嚴重的問題。
開發者可以通過給結構元素排序來最小化這種內存浪費,這樣最大/最寬的元素會排在前面,接著是第二寬的,依次排開。下面的這個例子能為你闡明用結構的空間大小給數據元素排序影響:
結構s1有11個填充字節,如下表所示:
看看下面的結構s2:
這個結構只包含了3個尾填充的字節,如下圖所示:
這樣就節省了內存。因此,僅僅在結構定義中重排數據元素就有可能避免內存浪費。
這種給元素排序的一種例外是,如果你的結構比你的高速緩存線(在因特爾至強融核協處理器上是64個字節)更大的話,一些循環或內核就只能接觸到結構的一部分。在這種情況下,保持結構的各部分能在內存中一起被接觸到可能是有益的,這可能會改善高速緩存局部性。
如果你的結構比高速緩存線更大,并且一些循環和內核只能接觸到結構的一部分的話,你可以考慮下通過把大結構分解為多個以單獨的排列存儲的更小的結構。這就潛在地提升了可接觸數據的密度,incident提升了高速緩存的局部性。
你也可以使用_decipsec(align)屬性來指導編譯器比用其他方式更嚴格地對齊數據,這個擴展屬性的語法如下:
C/C++:
_decipsec(align(n))<數據類型聲明>
Fortran:
cDEC$ATRIBUTES ALIGN:n::<數據類型聲明>
這里的n是要求的隊列,是2的乘冪,在英特爾C++編譯器里最大為4096,在英特爾Fortran編譯器里最大是16384.你可以使用這個屬性為單個變量,靜態結構或自動存儲持續期間內請求對齊。然而,這就表示,盡管你提高結構的一致性,但這個屬性并不能調整結構內元素的對齊。通過把_declpsec(align)放在關鍵字struct前面,你就為僅僅這種類型的對象請求適當的對齊。讓我用下面這個例子來說明我的觀點:
在上述示例中,對字符a2和整數b2的對齊仍然各自保持為1個字節和4個字節,這是默認的。然而,結構s2的每個實例都被對齊到32個字節的邊界,正如_declspsec聲明里描述的那樣。因此,結構s1內部的結構s2目前的每個實例都將對齊到32個字節的邊界。
我們還可以通過動態分配結構s2的排列來進一步擴展這個例子:
這種情況下,你仍然需要使用_mm_malloc或一個相當于為指針分配對齊內存的可移植性操作系統接口(POSIX),但通過使用_declspec(align(32)),你就是要為排列arr1中的每一個元素都強制對齊到32個字節。
你也可以使用這個數據對齊支持來為高速緩存線使用最優化提供優勢。通過把平常經常在一起使用的小對象聚集到一個結構里,并強制這個結構從高速緩存線的起始端分配內存,你就能有效地保證每一個對象在需要的時候都能及時地被裝載進高速緩存里,這樣會有很明顯的性能提升。例如,考慮i和j這兩個被頻繁調用的變量,他們可能會被分配到不同的告訴緩存線上。你可以像下面這么來聲明它們:
通過使用這種方式聲明變量,編譯器就能確保這些變量被分配在同一個高速緩存線上。
慧都提供【正版IDE聯合推廣計劃】,各種IDE低至半價出售(截止日期2014/12/31)。另外還有5折限時搶購和免費領iPhone 6、iPad air等好禮!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn