Использование vmalloc (libvmalloc.a) на Mac и CentOS- не может включать заголовок vmalloc

Я хочу выделить практически непрерывную память диапазона, чтобы я мог использовать свойство locality (пространственная локальность) при доступе к данным с учетом повышения производительности. На следующей странице я обнаружил, что мне нужно использовать vmalloc для лучшего доступа к памяти (пожалуйста, исправьте меня, если я ошибаюсь, и вместо этого мне придется использовать kmalloc).

В чем разница между vmalloc и kmalloc?

Я скачал пакет vmalloc с http://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmalloc

Я следовал процедуре установки для сборки статической библиотеки libmalloc.a из исходных файлов, а затем скопировал сгенерированную библиотеку libvmalloc.a в каталог /usr/local/lib и /usr/lib на моем mac.

В моей C-программе я попытался включить заголовочный файл vmalloc.h с помощью следующих подходов:

#include <vmalloc.h>

,

#include <linux/vmalloc.h>

,

#include "vmalloc.h"

но никто из них не работал. Я всегда получал vmalloc.h: нет такого файла или сообщения об ошибке каталога. Я использовал флаги -L/usr/local/lib -lvmalloc при компиляции моей программы на C++. Я также получил ту же ошибку при попытке сделать то же самое на моем настольном компьютере (в операционной системе CentOS).
Вот мой make-файл:

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 не является решением, но я могу ошибаться.

2 ответа

Решение

Комментарий Немо должен был быть дан как ответ:

vmalloc в этом вопросе функция ядра Linux. Если вы не взламываете ядро ​​или не пишете драйвер устройства, это не относится к вам. vmalloc на сайте AT&T Research совсем другое. Никто не делает то, что вы думаете, что делает. Просто используйте malloc,

Очевидно, что вы не знаете, что означает "практически непрерывный диапазон", или понимаете, что malloc должен дать вам это; иначе это не сработало бы вообще.

Преждевременная оптимизация - корень всего зла. Особенно, когда вы понятия не имеете, что означает оптимизация, которую вы пытаетесь осуществить.

При компиляции укажите -Ipath для gcc, чтобы узнать, где находится "vmalloc.h".

Или укажите переменную среды C_INCLUDE_PATH (для C) или CPLUS_INCLUDE_PATH (для C++) перед вызовом gcc.

GCC будет искать файлы заголовков следующим образом:

  1. -Ipath
  2. Переменные среды: C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
  3. Пути по умолчанию (если вы не указали префикс при установке gcc), вероятно, как:

    / USR / включать в себя

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

Другие вопросы по тегам