我正在使用numactl,使用--physcpubind选项.手册说:
--physcpubind=cpus, -C cpus
Only execute process on cpus. Etc...
Run Code Online (Sandbox Code Playgroud)
假设我有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
Run Code Online (Sandbox Code Playgroud)
即我将用6个线程运行我的程序,我要求它们在CPU核心0,1,4,5,8,9上.例如,如果在程序期间的某个时刻线程0-5被分配了CPU核心0,1,4,5,8,9(setup1).是否有可能在程序执行期间的某个其他时刻线程0可能正在CPU核心9上运行,等等?即CPU内核之间会有线程迁移吗?或者线程唯一地绑定到CPU核心(如在setup1中)?谢谢.
我正在使用为以下问题提供的代码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);
Run Code Online (Sandbox Code Playgroud)
运行程序后(通过将每个 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
Run Code Online (Sandbox Code Playgroud) 我想用mpif90编译我的Fortran程序(.f90),但我得到以下内容:
use a_box
1
Fatal Error: Wrong module version '6' (expected '9') for
file 'a_box.mod' opened at (1)
Run Code Online (Sandbox Code Playgroud)
你能帮我解决这个问题吗?谢谢!
mpif90版本如下:
GNU Fortran (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Run Code Online (Sandbox Code Playgroud)
我的系统是Ubuntu 12.10.
我在OpenMP并行区域内有两个do循环,如下所示:
!$OMP PARALLEL
...
!$OMP DO
...
!$OMP END DO
...
!$OMP DO
...
!$OMP END DO
...
!$OMP END PARALLEL
Run Code Online (Sandbox Code Playgroud)
假设OMP_NUM_THREADS = 6.我想先用4个线程运行do-loop,然后用3个线程运行第二个do-loop.你能说明怎么做吗?我希望它们在一个平行区域内.也可以指定哪个线程号应该执行任何一个do循环,例如在第一次do循环的情况下我可以要求它使用线程号1,2,4和5.谢谢.