2011-07-19 56 views
0

我想分配虛擬連續的範圍內存,以便在訪問數據時使用locality屬性(空間局部性),同時考慮更好的性能。我在下面的頁面發現我需要使用vmalloc來獲得更好的內存局部性訪問(如果我錯了,請更正我,並且必須改用kmalloc)。在Mac和CentOS上使用vmalloc(libvmalloc.a)不能包含vmalloc標題

What is the difference between vmalloc and kmalloc?

我從http://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmalloc

下載的vmalloc的包我跟着用於從源文件構建libmalloc.a靜態庫的安裝過程,然後我複製所生成的libvmalloc.a庫/我的Mac上的usr/local/lib和/ usr/lib目錄。

在我的C程序,我想包括通過各種途徑如下的vmalloc.h頭文件:

#include <vmalloc.h> 

#include <linux/vmalloc.h> 

#include "vmalloc.h" 

但他們都沒有工作。我總是得到vmalloc.h:沒有這樣的文件或目錄錯誤消息。 編譯我的C++程序時,我使用了-L/usr/local/lib -lvmalloc標誌。 在我的臺式機上(在CentOS操作系統下)嘗試同樣的事情時,我也遇到了同樣的錯誤。
這裏是我的makefile:

SHELL = /bin/sh 
PROJECT = hw2 

TARGET = mkhashtbl 
CFLAGS = -O3 
LFLAGS = -O3 -L/usr/local/lib -lvmalloc 

TFILE = $(PROJECT).tgz 
ZFILE = $(PROJECT).zip 
PACKFILES = Makefile hashtbl.h hashtbl.c mkhashtbl.c timer.c 

all: $(TARGET) 

run: all 
    - ./$(TARGET) 

我也試圖改變我的鏈接標誌如下:

LFLAGS = -O3 -L/usr/local/lib -lvmalloc 

,我仍然得到了同樣的錯誤。 在這種情況下可能會出現什麼問題?鏈接庫的方式有什麼問題嗎?或者vmalloc僅適用於某些版本的Linux?如果是後者,我相信我仍然應該至少能夠包含頭文件。

編輯

我真正的問題其實是:

hashtbl_cache * hashTable_cache;    /* Hash table cache */ 

    int i; 
    hashTable_cache = (hashtbl_cache*)malloc(tbl_size* sizeof(hashtbl_cache)); 

    for(i = 0 ; i < tbl_size; i++) 
    { 
      hashTable_cache[i]. ht_elements = (hashelt_cache*)malloc(hashTable->data_total_size[i] * sizeof(hashelt_cache)) ; 
    }  

我要確保在每一個緩存中的所有ht_elements爲了創建。我從一個論壇讀到vmalloc適合創建緩存感知應用程序,因爲數據是在虛擬內存中創建的。有沒有其他的方法來確保我的緩存數組的所有元素的分配都是以連續的順序創建的,因此可以使我快速查找?還有一件事,每個緩存中每個元素的大小都不一樣,所以我想用calloc不是解決方案,但我可能是錯的。

+1

該問題中的'vmalloc'是Linux內核函數。除非你正在竊取內核或編寫設備驅動程序,否則這與你無關。 AT&T Research網站上的'vmalloc'完全是另一回事。兩人都沒有做你認爲它的事情。只需使用'malloc'。 – Nemo

+0

是的,我試着用malloc。現在我想創建一個支持緩存的哈希表。如果我使用malloc,我的散列表中的每個元素都將位於不同的內存地址上?因此,在訪問我的散列表中的數據時,我將無法使用locality屬性。我的假設是,如果我使用vmalloc,散列表的所有數據條目都將在1個連續的大塊中創建,因此訪問數據會更快。 另一個問題:如果它是一個Linux內核函數,我怎麼不能將它包含在我的CentOS操作系統計算機上? –

+0

文件系統中的文件「vmalloc.h」在哪裏?當你知道這一點時,你會知道添加到'-I'選項的價值。請注意,'-L'選項與鏈接時查找庫相關,而不是編譯時查找頭文件。另外,庫在哪裏('libvmalloc.so'或'libvmalloc.a')。如果在libvmalloc的構建區域內找不到標題,則需要從構建中重新安裝它,或者重新構建並確保標題已安裝(或手動安裝)。 –

回答

0

Nemo的意見應該得到一個答案:

該問題中的vmalloc是Linux內核函數。除非你正在竊取內核或編寫設備驅動程序,否則這與你無關。 T研究網站上的vmalloc完全是另一回事。兩人都沒有做你認爲它的事情。只需使用malloc

很明顯,你不知道什麼是「幾乎連續範圍」的意思,或者你會意識到malloc必須給你;否則它根本無法工作。

不成熟的優化是一切邪惡的根源。特別是當你不知道你想要做什麼優化。

+0

謝謝澄清。我編輯了我的問題,並提供了我想達到的內容的說明。你認爲什麼是達到這個目標的最好方法?謝謝 –

+0

分配鄰近(虛擬)地址的對象的方式是用'malloc'執行一個大的分配,然後用指針算術或使用它作爲你需要的類型的數組來分割它。請注意,你不能'釋放'單個部分,而只能是'malloc'最初返回的整個塊。 –

0

編譯時,爲gcc指定-Ipath以知道'vmalloc.h'的位置。

或者,在調用gcc之前,指定環境變量C_INCLUDE_PATH(對於C)或CPLUS_INCLUDE_PATH(對於C++)。

GCC將搜索頭文件遵循這樣:

  1. -ipath
  2. 環境變量:C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
  3. 默認路徑(如果你在安裝時沒有指定前綴gcc),可能是這樣的:

    /usr/include

    的/ usr /本地/包括

    /usr/lib/gcc-lib/i386-linux/2.95.2/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/ ../../../../include/g++-3

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../ I386的LINUX /包括

+0

我已經在我的.bashrc和.bash_profile中完成了這項工作。所以包含路徑被自動獲取。即使我也使用-I和-L標誌手動指定路徑。所以這不是問題。 –

+0

似乎gcc停在預處理階段,它仍然無法找到正確的包含路徑。你確定你指定的是 - 我選擇的是正確的路徑嗎? PS:-L -l選項用於鏈接但不編譯,問題在它們生效之前發生。 – Stan