微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mbind返回EINVAL

我正在使用为以下问题提供的代码numa + mbind + segfault ,每次调用mbind都会返回EINVAL。 我怎么能得到什么是错的? 我在问这个,因为EINVAL可以返回的原因很多。

page_size = sysconf(_SC_PAGESIZE); objs_per_page = page_size/sizeof(A[0]); assert(page_size%sizeof(A[0])==0); split_three=num_items/3; aligned_size=(split_three/objs_per_page)*objs_per_page; remnant=num_items-(aligned_size*3); piece = aligned_size; nodemask=1; mbind(&A[0],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE); nodemask=2; mbind(&A[aligned_size],MPOL_MF_MOVE); nodemask=4; bind(&A[aligned_size*2+remnant],MPOL_MF_MOVE);

在运行程序(在每个mbind调用前分别改变1,2和4的节点掩码)如下所示(作为Mats PeteRSSon的答案)。 它有时段错误,有时运行良好。 当它错误时,dmesg如下所示:

Stack: Call Trace: mpol_new+0x5d/0xb0 sys_mbind+0x125/0x4f0 finish_task_switch+0x4a/0xf0 ? __schedule+0x3cf/0x7c0 system_call_fastpath+0x16/0x1b Code: ... kmem_cache_alloc+0x58/0x130

当DialogResult为否时阻止窗体closures

glClearColor(0,0)是透明的,而不是黑色的

计算一组字符的出现并从string中减去空格

Linux内核 – printk到一个文件

平台独立的GUI

SetTimer()陷阱

Windows 7计时function – 如何正确使用GetSystemTimeAdjustment?

libstdc ++中奇怪的符号查找错误

SYSV与Linux / GNU ELF格式

C ++应用程序自动运行在Windows启动

看看Linux内核的来源,你可以得到EINVAL:

传入无效的模式值。 超出范围“不一致”(同时使用静态节点和相对节点)

无效的maxnode(>页面中的位数 – > x86上的32K)。

节点掩码的其他各种问题。

没有MPOL_MF_STRICT | MPOL_MF_MOVE | MPOL_MF_MOVE_ALL中的一个 MPOL_MF_STRICT | MPOL_MF_MOVE | MPOL_MF_MOVE_ALL

start不是页面对齐的。

页面对齐=开始时start+len 。 [也就是说,你的len不是至少一个字节]

start+len < start – 也就是负长度。

policy = MPOL_DEFAULT并且nodes不为空或NULL 。

引用来自源的注释“如果节点掩码为空(本地分配),则MPOL_PREFERRED不能与MPOL_F_STATIC_NODES或MPOL_F_RELATIVE_NODES一起使用。所有其他模式都需要指向非空节点掩码的有效指针。

我的猜测将是start不是页面对齐。

这段代码适用于我:

#include <numaif.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #define ASSERT(x) do { if (!(x)) do_assert(#x,(long)(x),__FILE__,__LINE__); } while(0) static void do_assert(const char *expr,long expr_int,const char *file,int line) { fprintf(stderr,"ASSERT Failed %s (%d) at %s:%dn",expr,expr_int,file,line); perror("Error if present:"); exit(1); } int main() { size_t num_items = 6156000; double *A = valloc(num_items * sizeof(double)); ASSERT(A != NULL); int res; unsigned long nodemask; size_t page_size = sysconf(_SC_PAGESIZE); size_t objs_per_page = page_size/sizeof(A[0]); ASSERT(page_size%sizeof(A[0])==0); size_t split_three=num_items/3; size_t aligned_size=(split_three/objs_per_page)*objs_per_page; size_t remnant=num_items-(aligned_size*3); size_t piece = aligned_size; printf("A[0]=%pn",&A[0]); printf("A[%d]=%pn",piece,&A[aligned_size]); printf("A[%d]=%pn",2*piece,&A[2*piece]); nodemask=1; res = mbind(&A[0],MPOL_MF_MOVE); ASSERT(res ==0); nodemask=1; res = mbind(&A[aligned_size],MPOL_MF_MOVE); ASSERT(res ==0); nodemask=1; res = mbind(&A[aligned_size*2],(piece+remnant)*sizeof(double),MPOL_MF_MOVE); ASSERT(res == 0); }

请注意,我在所有的分配上都使用了“nodemask = 1”,因为我的机器中只有一个四核处理器,所以没有其他节点绑定 – 这也给了EINVAL 。 我认为你的系统中实际上有多个节点。

我还将A[]的“余数”移动到最后一个mbind调用的piece+remnant大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐