OpenMPと並列プログラミングを初めて勉強して試してみます。私は30要素の単純なforループを持ち、各要素はprocess()
関数で処理されています。しかし、私は意図的に1つの要素(5th
要素)を遅らせました。ここでは、コードです:OpenMP:すべてのスレッドが1つのスレッドで遅れて停止する
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
元素を含有したスレッドだけでなく停止していることに私には思われるが、すべての他のスレッドも停止しました。それは正常な行動ですか?
おかげですべてのスレッドを実行できるようにする必要があり
omp ordered
ラインを、削除するようにしてください。それが助けになりました。 :) –