我可以从指针地址(Linux上的C)获得NUMA节点吗?

我已经设置了我的代码,仔细地在我的NUMA系统上本地加载和处理数据。 我认为。 也就是说,为了debugging的目的,我真的希望能够使用指针地址在一个特定的函数内被访问,这个函数已经被许多其他函数设置,直接标识内存指向的NUMA节点正在居住,所以我可以检查一切都位于它应该位于的地方。 这可能吗?

我在msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72find这个请求为同样的事情,但答案使用QueryWorkingSetEx()似乎是Windows特定的。 这可以在Linux上完成吗? 我在Debian Squeeze上,确切地说,

谢谢。

Solutions Collecting From Web of "我可以从指针地址(Linux上的C)获得NUMA节点吗?"

-lnuma有一个move_pages函数: http : -lnuma

它可以将地址(页面)的当前状态报告给节点映射:

节点也可以是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); 

或者,在-lnuma:有一个get_mempolicy函数-lnuma: http -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. 

因此,由ptr指向的页面的numa节点被检查:

 int numa_node = -1; get_mempolicy(&numa_node, NULL, 0, (void*)ptr, MPOL_F_NODE | MPOL_F_ADDR); return numa_node;