我有一个程序,我们称之为调度程序,它在for循环中使用openmp生成2个线程。像这样:
#pragma omp for num_threads(2)
for (int i = 0; i < 2; ++i) {
if (omp_get_thread() == 0)
setenv("VAR", 0);
else
setenv("VAR", 1);
system("./script.sh");
}
脚本执行将取决于VAR值。如何使线程0中VAR的上下文与线程1不同,以便它们可以保持不同的值?
答案 0 :(得分:0)
首先,除非有真正的原因,否则我会用shell或其他一些脚本语言编写调度程序。使用openmp是一种矫枉过正,fork控制操作符&
应该可以正常工作。
其次,每个shell都有自己的环境(子进程继承),所以我只传递GOMP_CPU_BIND
的所需值(实际上,你可能意味着GOMP_CPU_AFFINITY
,因为前者确实如此似乎没有在任何地方记录?)作为script.sh
的命令行参数,然后在GOMP_CPU_AFFINITY
中导出具有相应值的script.sh
。
总而言之,你要写下这样的东西:
<强> scheduler.sh:强>
#!/bin/sh
./script.sh 1 &
./script.sh 2 &
<强> script.sh:强>
#!/bin/sh
export GOMP_CPU_AFFINITY=$1
./myprog