0

我想分配几乎连续的范围内存,以便在访问数据时可以使用局部性属性(空间局部性),同时考虑到更好的性能。我在下一页发现我需要使用 vmalloc 来获得更好的内存位置访问(如果我错了,请纠正我并且必须改用 kmalloc)。

vmalloc 和 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: No such file or directory错误消息。我在编译 C++ 程序时使用了 -L/usr/local/lib -lvmalloc 标志。在我的台式计算机上(在 CentOS 操作系统下)尝试同样的事情时,我也遇到了同样的错误。
这是我的生成文件:

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 不是解决方案,但我可能错了。

4

2 回答 2

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/包括

    /usr/local/包括

    /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/include

于 2011-07-19T01:02:14.123 回答
0

Nemo 的评论应该作为答案给出:

那个vmalloc问题是Linux内核函数。除非您正在破解内核或编写设备驱动程序,否则它与您无关。AT&T 研究网站上的vmalloc网站完全是另一回事。两者都没有你认为的那样。只需使用malloc.

很明显,您不知道“几乎连续的范围”是什么意思,或者您会意识到malloc 必须给您那个;否则它根本行不通。

过早的优化是万恶之源。特别是当您不知道您尝试进行的优化意味着什么时。

于 2011-07-19T02:05:00.713 回答