Articles of numa

numa,mbind,segfault

我已经使用valloc分配内存,比方说[15 * sizeof(double)]的数组A. 现在我把它分成三块,我想把每块(长度为5)绑定到三个NUMA节点(比如说0,1和2)。 目前,我正在做以下工作: double* A=(double*)valloc(15*sizeof(double)); piece=5; nodemask=1; mbind(&A[0],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE); nodemask=2; mbind(&A[5],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE); nodemask=4; mbind(&A[10],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE); 第一个问题是我做对了吗? ie是否有任何问题,正确alignment页面大小例如? 目前arraysA的大小为15,运行良好,但是如果我将数组大小重置为像6156000和piece = 2052000之类的值,随后三次调用mbind以&A [0]开始,&A [2052000]和&A [4104000 ]然后我得到一个分段错误(有时它只是挂在那里)。 为什么它运行小尺寸罚款,但更大给我段错误? 谢谢。

有没有在C / C ++代码中使用mbind的例子?

我想在我的C ++代码中使用mbind()来重新排列4个NUMA域中的虚拟页面,不幸的是我对这个函数是新的: long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask, unsigned long maxnode, unsigned flags); 目前,我有这样的东西: mbind(0x0,4611686018424767488,MPOL_BIND,nodemask,maxnode,MPOL_MF_MOVE); 从规格来说,我还不清楚要放什么以及如何放置nodemask和maxnode 。

如何强制两个进程在同一个CPU上运行?

语境: 我正在编写一个由多个进程组成的软件系统。 它在Linux下用C ++编程。 他们之间使用Linux共享内存进行通信。 通常情况下,在软件开发中,处于性能优化的最后阶段。 在这里,我遇到了一个大问题。 该软件对性能有很高的要求,但在有4个或8个CPU核心的机器上(通常有多个CPU),只能使用3个核心,从而浪费了25%的CPU功率,其次是60%。 经过多次研究,抛弃了互斥和锁争用,我发现时间被shmdt / shmat调用浪费了(分离并附加到共享内存段)。 经过更多的研究,我发现这些通常是AMD Opteron和Intel Xeon的CPU使用了一个名为NUMA的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,并且从其他CPU访问内存是昂贵。 做了一些testing之后,问题似乎就是这样devise软件,基本上,任何进程都可以将共享内存段传递给任何其他进程,并传递给其中的任何线程。 这似乎杀死了性能,因为进程不断地从其他进程访问内存。 题: 现在的问题是,有没有办法强制在同一个CPU中执行一对进程? 我并不是说要强迫他们总是在同一个处理器上执行,因为我不在乎他们是在哪一个执行的,尽pipe这样做会完成这个任务。 理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存进行通信的进程),这样performance不受惩罚。

使用HWLOC的NUMA系统的realloc()

我有几个自定义分配器,提供不同的方式来分配基于不同的策略的内存。 其中一个在已定义的NUMA节点上分配内存。 分配器的接口是直接的 template<typename config> class NumaNodeStrategy { public: static void *allocate(const size_t sz){} static void *reallocate(void *old, size_t sz, size_t old_sz){} static void deallocate(void *p, size_t sz){} }; 分配本身是通过使用hwloc_alloc_membind_nodeset()方法来处理的,同时为分配策略设置相应的参数。不过,hwloc只提供了分配和释放内存的方法,我想知道应该如何实现reallocate() 。 两种可能的解决方 分配新的内存区域和memcpy()数据 使用hwloc_set_membind_nodeset()来设置节点集的内存分配/绑定策略,并使用普通的malloc() / posix_memalign()和realloc() 。 任何人都可以帮助我得到这个权利? 更新: 我试图使问题更具体:是否有可能使用hwloc执行realloc()而不分配新的内存并移动页面?

如何确认NUMA?

如何确认主机是否支持NUMA? Oracle文档说,NUMA感知起始于内核2.6.19,但是NUMA手册页说它是在2.6.14中引入的。 我想确保以-XX:+UseNUMA的Java进程实际上正在利用某些东西。 检查numa_maps,我看到我有他们: # find /proc -name numa_maps /proc/1/task/1/numa_maps /proc/1/numa_maps /proc/2/task/2/numa_maps /proc/2/numa_maps /proc/3/task/3/numa_maps 尽pipe我的核心背后是Oracle所说的: # uname -sr Linux 2.6.18-92.el5 我目前在RHEL5.1上使用64位jdk1.6.0_29。

numactl –physcpubind

我正在使用numactl和–physcpubind选项。 手册上说: –physcpubind=cpus, -C cpus Only execute process on cpus. Etc… 假设我的NUMA系统有3个NUMA节点,每个节点有4个核心。 NUMA节点0具有0,1,2,3作为核心编号。 NUMA节点1有4,5,6,7,NUMA节点2有8,9,10,11。 我的问题是让我们说我运行程序如下: export OMP_NUM_THREADS=6 numactl –physcpubind=0,1,4,5,8,9 ./program 即我将运行我的程序与6个线程,我要求他们在CPU核心0,1,4,5,8,9。 例如,如果在程序的某一时刻线程0-5分配了CPU核心0,1,4,5,8,9(setup1)。 例如,在程序执行过程中的某个其他时刻,是否有可能在CPU内核9上运行线程0等等? 即将有CPU线程之间的线程迁移? 或者线程唯一地绑定到CPU核心(如在setup1中)? 谢谢。

测量NUMA(非一致内存访问)。 没有可观察到的不对称性。 为什么?

我试图测量NUMA的不对称内存访问效果,并失败。 本实验 采用Intel Xeon X5570 @ 2.93GHz,2个CPU,8个内核。 在固定为核心0的线程上,我在numa_alloc_local的核心0的NUMA节点上分配一个大小为10,000,000字节的数组x 。 然后我遍历数组x 50次,读写数组中的每个字节。 测量经过的时间做50次迭代。 然后,在我的服务器的每个其他核心,我钉一个新的线程,并再次测量经过的时间做50读和写入arraysx中的每个字节的迭代。 数组x很大,以尽量减lesscaching效应。 我们想要测量CPU必须一直到RAM加载和存储的速度,而不是在caching帮助时。 在我的服务器中有两个NUMA节点,所以我希望在分配数组x的同一个节点上具有亲和性的核心具有更快的读/写速度。 我没有看到。 为什么? 也许NUMA只与具有8-12个核心的系统有关,正如我在别处看到的那样? http://lse.sourceforge.net/numa/faq/ numatest.cpp #include <numa.h> #include <iostream> #include <boost/thread/thread.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <pthread.h> void pin_to_core(size_t core) { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(core, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); } std::ostream& operator<<(std::ostream& os, const bitmask& bm) { for(size_t i=0;i<bm.size;++i) { os […]

我可以从指针地址(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上,确切地说, 谢谢。

NUMA感知cachingalignment的内存分配

在linux系统中,pthreads库为我们提供了一个用于cachingalignment的函数(posix_memalign)来防止错误的共享。 为了select一个特定的架构NUMA节点,我们可以使用libnuma库。 我想要的是需要两个。 我将某些线程绑定到某些处理器,并且我想为相应的NUMA节点中的每个线程分配本地数据结构,以减less线程的内存操作延迟。 我怎样才能做到这一点?