11

NUMA システムでローカルにデータを慎重にロードして処理するようにコードをセットアップしました。おもう。つまり、デバッグ目的で、他の多くの関数によって設定された特定の関数内でアクセスされるポインターアドレスを使用して、メモリが指している NUMA ノードを直接識別できるようにしたいと考えています。に常駐しているので、すべてが配置されるべき場所に配置されていることを確認できます。これは可能ですか?

msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72でこのリクエストを見つけましたが、答えは QueryWorkingSetEx() を使用していますWindows固有のようです。これは Linux で実行できますか? 正確には、Debian Squeeze を使用しています。

ありがとう。

4

4 に答える 4

21

move_pagesに関数があります-lnuma: http://linux.die.net/man/2/move_pages

アドレス(ページ)の現在の状態をノードマッピングに報告できます:

nodes は NULL にすることもできます。その場合、move_pages() はページを移動しませんが、代わりにステータス配列で各ページが現在存在するノードを返します。移動が必要なページを判断するには、各ページのステータスを取得する必要がある場合があります。

したがって、呼び出しは次のようになります。

 void * ptr_to_check = your_address;
 /*here you should align ptr_to_check to page boundary */
 int status[1];
 int ret_code;
 status[0]=-1;
 ret_code=move_pages(0 /*self memory */, 1, &ptr_to_check,
    NULL, status, 0);
 printf("Memory at %p is at %d node (retcode %d)\n", ptr_to_check, status[0], ret_code);
于 2011-11-04T20:41:17.540 に答える
11

または、 http://linux.die.net/man/2/get_mempolicyget_mempolicyに関数があります。-lnuma:

If flags specifies both MPOL_F_NODE and MPOL_F_ADDR, get_mempolicy() will 
return the node ID of the node on which the address addr is allocated into 
the location pointed to by mode. If no page has yet been allocated for the 
specified address, get_mempolicy() will allocate a page as if the process had 
performed a read [load] access to that address, and return the ID of the node 
where that page was allocated. 

したがって、によって指されているページの numa ノードは、次のようにptrチェックされます。

int numa_node = -1;
get_mempolicy(&numa_node, NULL, 0, (void*)ptr, MPOL_F_NODE | MPOL_F_ADDR);
return numa_node;
于 2013-06-07T08:25:10.763 に答える