我想分配几乎连续的范围内存,以便在访问数据时可以使用locality属性(空间局部性),同时考虑更好的性能。我在下面的页面中发现我需要使用vmalloc来获得更好的内存位置访问权限(如果我错了请纠正我,并且必须使用kmalloc代替)。
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不是解决方案,但我可能错了。
答案 0 :(得分:0)
编译时,指定gcc的-Ipath以了解'vmalloc.h'的位置。
或者,在调用gcc之前指定环境变量C_INCLUDE_PATH(对于C)或CPLUS_INCLUDE_PATH(对于C ++)。
GCC将按照以下方式搜索标题文件:
- -ipath
- 环境变量:C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
- 醇>
默认路径(如果您在安装gcc时未指定前缀),可能类似于:
的/ usr /包括
的/ usr /本地/包括
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2 /../../../../包括/克++ - 3
/usr/lib/gcc-lib/i386-linux/2.95.2 /../../../../ I386-LINUX /包括
答案 1 :(得分:0)
Nemo的评论应该作为答案给出:
该问题中的
vmalloc
是Linux内核函数。除非您正在攻击内核或编写设备驱动程序,否则它与您无关。 AT&amp; T Research网站上的vmalloc
完全不同。没有人做你认为它做的事。只需使用malloc
。
很明显,你不知道“几乎连续的范围”是什么意思,或者你意识到malloc
必须给你那个;否则它根本不起作用。
过早优化是万恶之源。特别是当你不知道你想要做出什么样的优化时。