Openmp:所有线程由于一个线程中的延迟而停止
Openmp: all threads stop due to delay in one thread
我是OpenMP和并行编程的新手,并试图尝试它。我有一个包含 30 个元素的简单 for 循环,每个元素都由一个process()
函数处理。但我故意延迟了一个元素(5th
元素(。代码如下:
std::mutex mu;
void print_msg(const char* msg, size_t n)
{
mu.lock();
cout << msg << n << endl;
mu.unlock();
}
void process(size_t i)
{
print_msg("Processing ... ", i);
if (i == 5) // the 5th element is big, so takes time
for(int u=0; u<std::numeric_limits<int>::max(); u++);
}
int main(int argc, char *argv[])
{
#pragma omp parallel
{
#pragma omp for ordered schedule(dynamic, 3)
for(size_t i=0; i<30; i++)
{
process(i);
}
}
return 0;
}
我所期望的:
已分配5th
元素(和其他 2 个元素(的线程将延迟,但其余元素将继续并行。
结果:
这是提到的延迟位置的结果...
Processing ... 1
Processing ... 0
Processing ... 4
Processing ... 2
Processing ... 5
Processing ... 3
Processing ... 6
Processing ... 7
Processing ... 8
[[ Here the execution paused for a couple of seconds and then
the below printed out all at once ]]
Processing ... 9
Processing ... 11
Processing ... 12
Processing ... 13
Processing ... 10
Processing ... 14
Processing ... 15
Processing ... 16
Processing ... 17
Processing ... 21
Processing ... 20
Processing ... 19
Processing ... 18
Processing ... 22
Processing ... 24
Processing ... 23
Processing ... 26
Processing ... 27
Processing ... 25
Processing ... 29
Processing ... 28
所以在我看来,不仅包含5th
元素的线程停止了,而且所有其他线程也停止了。这是正常行为吗?
首先,你的线程不是"睡眠",而是在练习所谓的"忙碌等待",这对于长时间的延迟来说并不是很好(参见例如这里:"忙碌等待"与"睡眠"的权衡是什么?
但这里真正的问题似乎是使用
#pragma omp for ordered schedule(dynamic, 3)
这基本上意味着,线程将以 3 个为一组执行,下一组将等待前一组的结果(特定组按顺序执行(。对于dynamic
,行为在某种程度上是随机的,对于static
,我希望您会在组 0、1、2 和 3、4、5 之后看到暂停 - 这里的动态似乎第三组仍然执行,但下一组等到线程 5 完成。
尝试删除omp ordered
行,然后应该允许并行执行所有线程,因此其他线程不会被线程 5 的执行阻塞。
相关文章:
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- ZeroMQ:如何使用inproc减少多线程通信延迟
- 线程启动延迟 - 通知所有未唤醒所有线程
- Openmp:所有线程由于一个线程中的延迟而停止
- 如何在不使用C++冻结线程的情况下延迟函数
- 远程、IPC 和线程场景中微服务的低延迟通信
- C++低延迟线程异步缓冲流(用于日志记录)–Boost
- OpenMP线程、数据访问延迟和STL数据容器
- Qt信号以明显的延迟到达UI线程
- 有没有办法创建一个线程,但在不使用运算符的情况下使用 C++11 延迟它的执行=
- 线程安全、无数据争用、无延迟的共享容器 (circular_buffer)
- C++提高线程延迟
- 使用静态成员实例的 C++ 中的线程安全单一实例(无延迟实例化)
- 如何提高多线程应用程序的延迟
- 什么是Qt中低延迟音频合成的最佳多线程方法
- QApplication::mouseButtons是线程安全和延迟安全的
- 延迟初始化缓存..我如何使它线程安全
- C++11 延迟"thread"创建(即指定线程功能但不等待创建物理线程)
- Win32 API多线程播放.wav文件没有延迟
- 如果另一个线程导致进程在windows上崩溃,我该如何延迟销毁进程