Я хочу выделить практически непрерывную память диапазона, чтобы я мог использовать свойство 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 не является решением, но я могу ошибаться.