このコードサンプルが与えられた場合、演習はタスクを使用してコードをOpenMPと並列化することです。アイテムのセットで、良いものを数えたいです。
int count_good (item_t* item)
{
int n = 0;
while (item) {
if (is_good(item))
n++;
item = item->next;
}
return n;
}
これは正確には宿題ではありません。試験の準備用です。私の考えは次のとおりです。
int count_good (item_t* item)
{
int n = 0;
while (item) {
#pragma omp task
{
if (is_good(item))
n++;
}
item = item->next;
}
#pragma omp taskwait
return n;
}
...
int main ()
{
...
#pragma omp parallel
{
#pragma omp single
count_good(some_times);
}
}
問題は、n
これがシングルスレッドのプライベート変数であるということですが、同時に異なるタスクによって増加する可能性があります。これにより競合状態が発生する可能性がありますか?で回避できます#pragma omp critical
か?