Использование 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 будет искать файлы заголовков следующим образом:
- -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/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include