我遇到了使用OpenMP并行化的程序的不一致行为。
当我运行它时,它打印出当前阶段,因此预期输出为:“2 3 4 5”等。 前几个阶段之间的时间通常为1到2秒(当在4个核心上并行运行时)。
但是,如果没有重新编译或更改任何内容,有时当我运行软件时,它会在打印2
后立即挂起(在执行第一个并行代码之前打印);
它不会变慢,它会停止计算。我在gdb下运行它并确认它挂起在OpenMP中:
(由于超线程,有超过4个线程)
[New Thread 0x7ffff6c78700 (LWP 25878)]
[New Thread 0x7ffff6477700 (LWP 25879)]
[New Thread 0x7ffff5c76700 (LWP 25880)]
[New Thread 0x7ffff5475700 (LWP 25881)]
[New Thread 0x7ffff4c74700 (LWP 25882)]
[New Thread 0x7ffff4473700 (LWP 25883)]
[New Thread 0x7ffff3c72700 (LWP 25884)]
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7641fd4 in ?? () from /usr/lib/libgomp.so.1
(gdb) up
#1 0x00007ffff7640a9e in ?? () from /usr/lib/libgomp.so.1
(gdb)
#2 0x0000000000408ae8 in Redcraft::createStructures (this=0x7fffffffd8d0) at source/redcraft.cpp:512
512 #pragma omp parallel for private(node)
最初pragma
指定schedule(dynamic)
,但具有该值或删除它不会改变此挂断的一致性。
最后,我尝试启用/禁用omp_set_dynamic()
,但也没有效果。
有关调试的建议吗?
答案 0 :(得分:1)
这通常发生在数据竞争时。你必须发布正在并行化的代码块。基本上要发现的是线程如何使用数据。没有编译的重新运行并不能保证相同的线程执行顺序因此产生了这样的问题。你在处理文件吗?你必须在重新运行之前关闭它们。