我是OpenMP和並行編程的新手,試圖嘗試使用它。我有一個簡單的30個元素的循環,每個元素正在處理一個process()
函數。但我故意拖延了一個元素(5th
元素)。下面的代碼:Openmp:所有線程在一個線程中因爲延遲而停止
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
元素線程停止,但所有的其他線程也停止了。這是一個正常的行爲?
由於被阻止。這有幫助。 :) –