2011-11-02 27 views
8

Tôi đã thiết lập mã của mình để tải và xử lý dữ liệu cục bộ một cách cẩn thận trên hệ thống NUMA của mình. Tôi nghĩ. Đó là, vì mục đích gỡ lỗi, tôi thực sự muốn có thể sử dụng các địa chỉ con trỏ được truy cập bên trong một hàm cụ thể, được thiết lập bởi nhiều hàm khác, để xác định trực tiếp nút NUMA mà bộ nhớ trỏ tới đang ở trên, vì vậy tôi có thể kiểm tra xem mọi thứ có nằm ở vị trí cần đặt hay không. Điều này có thể không?Tôi có thể nhận nút NUMA từ địa chỉ con trỏ (trong C trên Linux) không?

Tôi tìm thấy yêu cầu này trên msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72 cho cùng một điều, nhưng câu trả lời sử dụng QueryWorkingSetEx() dường như là Windows cụ thể. Điều này có thể được thực hiện trên Linux không? Tôi đang trên Debian Squeeze, chính xác.

Cảm ơn.

Trả lời

16

Có một move_pages chức năng trong -lnuma: http://linux.die.net/man/2/move_pages

mà có thể báo cáo tình trạng hiện tại của địa chỉ (trang) đến nút ánh xạ:

nodes can also be NULL, in which case move_pages() does not move any pages but instead will return the node where each page currently resides, in the status array. Obtaining the status of each page may be necessary to determine pages that need to be moved.

Vì vậy, cuộc gọi có thể được như:

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); 
+0

Sử dụng câu trả lời của bạn tôi nhận được "gây tử vong lỗi: numaif.h: Không có tập tin hoặc thư mục". Bạn có ý tưởng gì không? – klm123

+1

Ok. Tôi đạt được rồi. Tiêu đề không được bao gồm với glibc, nhưng yêu cầu cài đặt libnuma-devel hoặc một gói tương tự. – klm123

6

Cách khác, có chức năng get_mempolicy trong -lnuma:http://linux.die.net/man/2/get_mempolicy

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. 

Như vậy, nút NUMA của một trang bị chỉ bởi ptr được kiểm tra với:

int numa_node = -1; 
get_mempolicy(&numa_node, NULL, 0, (void*)ptr, MPOL_F_NODE | MPOL_F_ADDR); 
return numa_node; 
Các vấn đề liên quan