【发布时间】:2018-01-01 17:16:12
【问题描述】:
我是 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 元素的线程停止了,而且所有其他线程也停止了。这是正常行为吗??
【问题讨论】:
标签: c++ parallel-processing openmp