- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用为以下问题提供的代码 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],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE);
nodemask=4;
bind(&A[aligned_size*2+remnant],piece*sizeof(double),MPOL_BIND,
&nodemask,64,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
最佳答案
查看Linux内核源码,可以得到EINVAL:
之一 MPOL_MF_STRICT | MPOL_MF_MOVE | MPOL_MF_MOVE_ALL
start
没有页面对齐。start+len
当页面对齐 = 开始时。 [也就是你的len至少不是一个字节]start+len
<start
- 即负长度。MPOL_DEFAULT
且 nodes
不为空或 NULL
。 我的猜测是 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:%d\n",
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]=%p\n", &A[0]);
printf("A[%d]=%p\n", piece, &A[aligned_size]);
printf("A[%d]=%p\n", 2*piece, &A[2*piece]);
nodemask=1;
res = mbind(&A[0],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE);
ASSERT(res ==0);
nodemask=1;
res = mbind(&A[aligned_size],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE);
ASSERT(res ==0);
nodemask=1;
res = mbind(&A[aligned_size*2],(piece+remnant)*sizeof(double),MPOL_BIND,
&nodemask,64,MPOL_MF_MOVE);
ASSERT(res == 0);
}
请注意,我在所有分配上都使用了“nodemask=1”,因为我的机器中只有一个四核处理器,所以没有其他节点可以绑定(bind) - 这也给出了 EINVAL
。我认为您的系统中实际上有多个节点。
我还将最后一个 mbind
调用的“remnant”从 A[]
移动到 piece+remnant
大小。
关于c - mbind 返回 EINVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14545002/
我已经使用 valloc 分配了内存,比方说 [15*sizeof(double)] 的数组 A。现在我将它分成三部分,我想将每一部分(长度为 5)绑定(bind)到三个 NUMA 节点(比方说 0、
我正在使用为以下问题提供的代码 numa+mbind+segfault ,每次调用 mbind 都会返回 EINVAL。我怎样才能得到什么是完全错误的?我问这个是因为有很多原因可以返回 EINVAL。
我的 MySQL 错误日志有问题,目前主要由“mbind:不允许操作”行组成(见下文)。为什么会发生这种情况以及如何解决它? 这是“主要”部分让我困扰。如下所示,并非所有行都是“mbind:不允许操作
我确实将我的 Ubuntu 从 11.04 升级到了 11.10。在 11.04 中,所有这些都运行良好: gcc -fopenmp -g -c -o test.o test.c -I../incl
根据mbind man page ,一种可能的 mode 是 MPOL_LOCAL,它将内存区域放在触发分配的 CPU 的同一节点中: #include #include #include #i
我正在尝试使用 mbind()在我的 C++ 代码中重新排列 4 个 NUMA 域的虚拟页面,不幸的是我是这个函数的新手: long mbind(void *addr, unsigned long l
我在 docker 容器中运行 MySQL 8.0 以进行本地开发。 Web 容器可以很好地连接到 mysql。当尝试从 Sequel Pro 访问我的数据库时,容器给了我一个错误, db_1 | m
大约一年前,我可以将 Windows 文件夹绑定(bind)到 Docker MySql 文件夹。 当尝试对 Docker MySql 8.0.12 执行相同操作时,我无法将 Windows 文件夹绑
我是一名优秀的程序员,十分优秀!