0

パフォーマンスの向上を考慮して、データにアクセスするときにローカリティプロパティ(空間ローカリティ)を使用できるように、仮想的に連続した範囲メモリを割り当てたいと思います。次のページで、メモリローカリティアクセスを改善するためにvmallocを使用する必要があることがわかりました(間違っていて、代わりにkmallocを使用する必要がある場合は修正してください)。

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を使用することは解決策ではないと思いますが、間違っている可能性があります。

4

2 に答える 2

0

コンパイル時に、gccに-Ipathを指定して、「vmalloc.h」がどこにあるかを確認します。

または、gccを呼び出す前に、環境変数C_INCLUDE_PATH(Cの場合)またはCPLUS_INCLUDE_PATH(C ++の場合)を指定します。

GCCは、次の方法でヘッダーファイルを検索します。

  1. -Ipath
  2. 環境変数:C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH
  3. デフォルトのパス(gccのインストール時にプレフィックスを指定しなかった場合)。おそらく次のようになります。

    / usr / include

    / usr / local / include

    /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

于 2011-07-19T01:02:14.123 に答える
0

Nemoのコメントは答えとして与えられるべきでした:

そのvmalloc質問の中には、Linuxカーネル関数があります。カーネルをハッキングしたり、デバイスドライバーを作成したりしない限り、関係ありません。vmallocAT&T Researchサイトでは、まったく別のものです。どちらもあなたが思っていることをしません。を使用するだけmallocです。

「実質的に隣接する範囲」が何を意味するのかわからないことは明らかです。そうでない場合は、それがあなたにそれを与えmalloc なければならないことに気付くでしょう。そうしないと、まったく機能しません。

時期尚早の最適化はすべての悪の根源です。特に、実行しようとしている最適化が何を意味するのかわからない場合。

于 2011-07-19T02:05:00.713 に答える