gpt4 book ai didi

c++ - Openmp:所有线程由于一个线程的延迟而停止

转载 作者:行者123 更新时间:2023-11-28 01:45:29 24 4
gpt4 key购买 nike

我是 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 元素的线程停止了,而且所有其他线程也停止了。这是正常行为吗??

最佳答案

首先,您的线程不是在“休眠”,而是在执行所谓的“忙等待”,这对于长时间延迟来说不是很好(例如,参见此处:What are trade offs for “busy wait” vs “sleep”?)。

但这里真正的问题似乎是使用

#pragma omp for ordered schedule(dynamic, 3)

这基本上意味着,线程将以 3 个为一组执行,下一组将等待前一个线程的结果(特定组按顺序执行)。使用 dynamic 时,行为有些随机,使用 static 我希望您会在组 0、1​​、2 和 3、4、5 之后看到暂停 - 使用动态这里似乎第三组仍然可以执行,但下一组等待直到线程 5 完成。

尝试删除 omp ordered 行,这样应该允许并行执行所有线程,因此其他线程不会被线程 5 的执行阻塞。

关于c++ - Openmp:所有线程由于一个线程的延迟而停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45325993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com