標準の 4Kb ページではなく、Linux で静的に割り当てられたヒュージ ページを利用するプログラムの改善に取り組んでいます。すでに静的なヒュージ ページをサポートするシステムをセットアップし、ヒュージ ページ プール (/prov/sys/vm/nr_hugepages) に大量のヒュージ ページを割り当てました。私の希望は、プログラムを調べて、大規模な malloc() が発生している場所を見つけて、malloc() を削除し、SHM_HUGETLB フラグが設定された shmget/shmat に置き換えることでした。
これは高度な並行プログラムであることに注意してください。
共有メモリを使用する私の目標は、実際に共有された方法でメモリを使用することではありません。malloc() ルーチンのすべての機能を保持しながら、その代わりに静的に割り当てられた巨大なページのサポートを使用したいと考えています。
以下は、私が達成しようとしているもののサンプル コード セグメントです。プログラムがこの時点に到達する前に、多くのプロセスがフォークされています。各プロセスは、このコード セグメントを同時に処理します。もともと、このセグメントには次のコードだけが含まれていました。
if( !( PANEL->WORK = (void *)malloc( (size_t)(lwork) *
sizeof( double ) ) ) )
{
HPL_pabort( __LINE__, "HPL_pdpanel_init",
"Memory allocation failed" );
}
これはうまくいきます。
これを次のように変更しました。
注!!: 私は乱数をキーとして使用するので、各プロセスは、独立したメモリ割り当てであることを識別するランダム キーを持ちます。
int shmid1;
size_t dsize = (size_t)(lwork) * sizeof( double );
/*2097152 is 2MB or the huge page size, if memory request is less,
resort to standard malloc */
if( dsize < 2097152) {
if( !( PANEL->WORK = (void *)malloc(dsize) ) )
{
HPL_pabort( __LINE__, "HPL_pdpanel_init",
"Memory allocation failed" );
}
}
else {
/* Get random number to use as a key */
int randomData = open("/dev/random",O_RDONLY);
int random;
read(randomData, &random, sizeof(random));
close(randomData);
/* Get shared memory segment */
shmid1 = shmget(random, dsize, SHM_HUGETLB
| IPC_CREAT | SHM_R
| SHM_W);
if ( shmid1 < 0 ) {
perror("shmget");
exit(1);
}
printf("HugeTLB shmid: 0x%x\n", shmid1);
PANEL->WORK = (void *)shmat(shmid1, 0, 0);
}
この新しい実装では、PANEL->WORK から読み取ろうとするたびに、セグメンテーション エラーが発生します。これがセグメンテーション違反である理由を実際に掘り下げる前に、私はこれに正しく取り組んでいるかどうか疑問に思わずにはいられません。これはこれにアプローチする最善の方法ですか?この方法論に誤りがある人はいますか?