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

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

0 голосов
/ 19 июля 2011

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

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

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

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

0 голосов
/ 19 июля 2011

При компиляции укажите -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 / Библиотека / GCC Пб / i386-Linux / 2.95.2 / включают

    * * Тысяча двадцать-один / USR / Библиотека / GCC Пб / i386-Linux / 2.95.2 /../../../../ включают в себя / г ++ - 3

    / USR / Библиотека / GCC Пб / i386-Linux / 2.95.2 /../../../../ i386-Linux / включать

...