2010-10-22 85 views
2

如果使用64位UNIX操作系統,將數組大小定義爲8的倍數是否有優勢?我打算使用這個數組來從共享內存中加載數據。因此操作系統和頁面大小上可能存在依賴關係。數組大小優化

+0

你的意思是數組大小? – 2010-10-22 13:30:52

+0

是的,我的意思是數組大小 – 2010-10-22 13:31:42

+0

爲什麼8?大聲笑這將是更好的定義數組大小的倍數'PAGE_SIZE/sizeof(ARRAY_ELEMENT)'...'4096/8' =='512'(開玩笑) – pmg 2010-10-22 13:32:56

回答

8

沒關係。你的編譯器知道它是否需要填充,所以讓它決定。不要因爲猜測而弄髒代碼。

讓你的程序工作第一個,然後關心性能與分析器。

+0

我的程序工作正常,我使用這個數組從共享內存中加載數據。所以問題是關於性能和內存使用情況? – 2010-10-22 13:35:18

+3

@Sachin:你確定這是你程序中的瓶頸嗎?你在數組中做什麼是你想要提出的問題。你能添加更多的上下文嗎? – GManNickG 2010-10-22 13:36:40

+0

我已更新問題,請現在檢查 – 2010-10-22 13:40:47

2

假設你在堆上動態分配數組,假設malloc的內部分配算法將實際上對內核的內存請求抽象化,這是公平的。也就是說,malloc()調用和libc的brk()(或mmap())系統調用之間可能存在或可能不存在直接關係。

malloc手冊頁有更多關於此的內容。

因此,就內存使用情況而言,我傾向於建議由於malloc可能會在你下面做一些不同的事情(並且是合理的),所以你是否分配8個字節的倍數並不重要。

就程序性能而言,數據結構在內存中的分配可能會對緩存性能產生巨大影響。但是,最終,您需要對應用程序進行配置,以查看是否可以提高其緩存性能。我不相信有一條強硬的規則可以讓你在編寫代碼的時候優化它。

如果你有興趣瞭解更多關於記憶和Linux,烏利齊·德雷珀關於這個問題在幾年前寫了一個夢幻般的系列LWN:

http://lwn.net/Articles/250967

2

如果你是有關內存訪問對齊或所以 - 這是內部環境/ libc事宜如何調整動態分配。如果其大小對齊,則不保證以特定方式對齊某個數組。許多分配器返回對齊到某個值的內存塊(大約是機器字的2倍或4倍大小),所以它不是調整對齊的地方。

我只記得幾件事情,可能有重要意義:

  1. 您可能希望使用矢量操作和/或展開的循環處理數組,所以它可能需要有一定的留白,使程序不超出分配區域。 (但是,如果你的向量引擎需要超出標準C實現提供的對齊方式,你必須以另一種方式分配內存,而不僅僅是簡單的malloc())。

  2. 大多數內存分配器在分配區域旁邊存儲服務信息(例如分配的塊大小),並且從空閒中切割的總內存大小稍大。最好是分配比某個值小一些的區域,以便在某個標準分配塊(比如內存頁面)中有密集的區域。例如,如果CPU有4k頁,那麼頁面可能只包含3個1024字節塊,但是4個1008字節(= 1024-8)塊。另外,許多內存分配器都有一個塊大小閾值,低於這樣的內存是從堆中分配的,但是在它之上,內存是通過整個硬件頁直接從OS VM調度器獲得的,因此在頁邊界上對齊。在這種情況下,可能需要將分配大小舍入到頁面大小以獲得整個頁面。

有可能是soume其他問題,但我不記得他們。

+0

很好的答案。兩個問題。 L2高速緩存中的塊與RAM塊的大小相同嗎? L2緩存是否緩存單個塊還是具有更精細的粒度? 「 」作爲一個例子,如果CPU有4k頁面,那麼頁面可能只包含3個1024字節塊,但是4個1008字節(= 1024-8)塊。「這如何確定? – HaltingState 2011-12-25 14:26:48

+0

具體值取決於MPU開發人員,可能因模型而異,因此a不能全部回答您。您必須查看MPU數據表以獲得答案。無論如何,作爲一種良好的做法,您不應該依賴特定的值或分配器行爲(至少在您的代碼檢查爲真)之前。緩存頁面可能因型號不同而不同,作爲VMM頁面的'硬件頁面'甚至可以通過OS切換,因此根據上下文有很多答案。 – Vovanium 2011-12-26 19:35:29