3

ページテーブルを変更するだけで、実際にはデータを移動せずに、2 つのメモリページの内容を交換することは可能ですか?

動機は、密な行列の転置です。データがページ サイズによってブロックされている場合、ページ内でデータを転置し (キャッシュに収まる)、ページをスワップしてブロックを最終的な場所に移動することができます。大規模なマトリックスでは多くのページが移動されるため、TLB をフラッシュしても問題が発生しないことを願っています。

4

3 に答える 3

1
#include <stdio.h>
#include <string.h>

#define __USE_GNU
#include <unistd.h>
#include <sys/mman.h>

int main() {
    int PAGE_SIZE = getpagesize();
    char* m = NULL;
    void* temp;

    printf("page size = %d\n", PAGE_SIZE);

    m = (char*)mmap(0, PAGE_SIZE*3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    temp = m+PAGE_SIZE*2;

    memset(m, '0', PAGE_SIZE);
    memset(m+PAGE_SIZE, '1', PAGE_SIZE);

    printf("before %c %c\n", m[0], m[PAGE_SIZE]);

    mremap(m + PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, temp); 
    mremap(m, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m+PAGE_SIZE); 
    mremap(temp, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m); 


    printf("after %c %c\n", m[0], m[PAGE_SIZE]);
    return 0;
}
于 2010-04-21T04:42:58.013 に答える
0

メモリマップされたファイルでうまくいくと思いますが、自分でこれを試したことはないと思います。MAP_ANONYMOUS でmmapを使用して、純粋な仮想アドレス (物理ファイル バッキングなし) をマップします。次に、「ファイル」をVAのさまざまな領域に再マップして、実質的にゼロコピーセマンティクスを取得できます。Windows では、CreateMapOfFile(INVALID_HANDLE_VALUE, ...) を使用して作成されたファイル マッピング ハンドルでMapViewOfFileを使用しますが、NT では再マッピングのターゲットを制御できないことに注意してください (つまり、新しくマップされた VA アドレスは関数の出力です)。呼び出し)、Linux では目的のアドレスがヒントとして取得されます。

これが機能しない場合は、おそらくカーネルでメモリ マネージャー モジュールを作成する必要がありますが、これは実際のプロジェクトでは実行できません。

于 2010-04-20T22:45:29.543 に答える
-1

理論的には、確かに。実際には、mmap() を使用してシステム V スタイルの共有メモリ ブロックをこのように移動できると思います。

于 2010-04-20T23:08:31.927 に答える