パフォーマンスの向上を考慮して、データにアクセスするときにローカリティプロパティ(空間ローカリティ)を使用できるように、仮想的に連続した範囲メモリを割り当てたいと思います。次のページで、メモリローカリティアクセスを改善するためにvmallocを使用する必要があることがわかりました(間違っていて、代わりにkmallocを使用する必要がある場合は修正してください)。
vmallocパッケージをhttp://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=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を受け取りました:そのようなファイルまたはディレクトリのエラーメッセージはありません。C ++プログラムをコンパイルするときに、-L / usr / local /lib-lvmallocフラグを使用しました。デスクトップコンピューター(CentOSオペレーティングシステムの下)で同じことを試したときにも同じエラーが発生しました。
これが私のmakefileです:
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はキャッシュ対応アプリケーションの作成に適しているとフォーラムから読みました。キャッシュ配列のすべての要素の割り当てが連続した順序で作成されていることを確認する他のアプローチはありますか?したがって、高速ルックアップを実行できますか?もう1つ、すべてのキャッシュのすべての要素のサイズが同じではないため、callocを使用することは解決策ではないと思いますが、間違っている可能性があります。