Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux中从单独的单线程进程派生多线程进程时出现的问题_C++_Linux_Multithreading_Process_Openmp - Fatal编程技术网

C++ Linux中从单独的单线程进程派生多线程进程时出现的问题

C++ Linux中从单独的单线程进程派生多线程进程时出现的问题,c++,linux,multithreading,process,openmp,C++,Linux,Multithreading,Process,Openmp,我的OpenMP程序中出现了一些相当不寻常的行为,我认为这一定是由于Linux进程的某些内部工作造成的,而我并不知道 当我运行使用OpenMP支持编译的C基准二进制文件时,程序成功执行,没有任何问题: >:$ OMP_NUM_THREADS=4 GOMP_CPU_AFFINITY="0-3" /home/me/bin/benchmark >:$ ...benchmark complete... 当我从一个单独的C++程序运行基准程序时,执行代码的地方(例如)看起来是: int ma

我的OpenMP程序中出现了一些相当不寻常的行为,我认为这一定是由于Linux进程的某些内部工作造成的,而我并不知道

当我运行使用OpenMP支持编译的C基准二进制文件时,程序成功执行,没有任何问题:

>:$ OMP_NUM_THREADS=4 GOMP_CPU_AFFINITY="0-3" /home/me/bin/benchmark
>:$ ...benchmark complete...
<>当我从一个单独的C++程序运行基准程序时,执行代码的地方(例如)看起来是:

int main(int argc, char* argv[]){

    system("/home/me/bin/benchmark");

    return 0;
}
输出给我警告:

>:$ home/me/bin/my_cpp_program
OMP: Warning #123: Ignoring invalid OS proc ID 1.
OMP: Warning #123: Ignoring invalid OS proc ID 2.
OMP: Warning #123: Ignoring invalid OS proc ID 3.
这些警告与我尝试将CPU关联设置为不存在的CPU并直接运行OpenMP基准测试时得到的警告相同

因此,我假设唯一知道存在的CPU
my_cpp_程序
是处理器ID 0。我在使用root时也会遇到同样的错误,所以我认为这不是权限问题?我还检查了
system()
执行的代码是否具有正确的环境变量和相同的链接库


有人知道是什么导致了这种情况发生吗?

根据祖兰的建议,我很确定发生这种情况的原因是因为
bin/my\u cpp\u程序的性质和编译。重要的是,它也是用
-fopenmp
编译的。事实证明,
bin/my_cpp_程序
是根据GNU OpenMP实现库
libgomp
编译的,而
bin/benchmark
程序是根据LLVM OpenMP实现库
libomp
编译的

我不确定,但我认为发生的事情如下
GOMP\u CPU\u affinitity
是用于在
libgomp
中设置CPU相关性的GNU环境变量。因此,由于设置了
GOMP\u CPU\u AFFINITY
,因此运行在
bin/my\u cpp\u程序中的单个线程被绑定到CPU 0。我猜,当进一步使用
GOMP\u CPU\u AFFINITY
AFFINITY赋值时,该线程生成的任何子进程也必须只将CPU 0视为其潜在CPU。然后,当派生的进程(来自环境)尝试查找CPU 1-3时,这给了我警告

为了解决这个问题,我使用了
KMP\u AFFINITY
,这是英特尔的CPU AFFINITY环境变量。
bin/benchmark
使用的
libomp
OpenMP运行时在同时设置了它和
GOMP\u CPU\u亲缘关系
时,赋予
KMP\u亲缘关系更高的优先级,无论出于何种原因,这都允许生成的子进程分配给其他CPU。为此,我使用了:

KMP_AFFINITY=logical,granularity=fine ./bin/benchmark

这意味着程序在两种情况下都能按预期工作(每个逻辑核按从0到3的升序绑定),因为
bin/my_cpp_程序的CPU分配不再与
bin/benchmark
的分配发生冲突。通过将
verbose
添加到逗号分隔的列表中,可以检查是否确实发生了这种情况。

将线程参数作为命令行参数而不是env变量传递如何?我也这么认为,所以尝试了,但没有成功。它似乎也不是那些环境变量,因为我可以更改它们,警告也会相应地调整(即,它会抱怨我指定的任何处理器)。实际上,我已经通过将“env”的结果从程序打印到文件中,然后在交互模式下,在运行二进制文件之前在该文件上运行source,从而加倍确保了这一点,而且效果很好。所以我认为它必须比环境变量更神奇。我想知道我是否可以让gdb调试生成的进程…请提供编译行,以及用于这两个程序的编译器版本。您是否用您发布的特定“示例”代码重现了问题?还请提供“基准”计划的最低示例。