У меня проблема с задачами OpenMP. Я пытаюсь создать параллельную версию цикла «для», используя задачи omp. Тем не менее, время выполнения этой версии почти в 2 раза дольше, чем базовая версия, где я использую omp for, и я не знаю, в чем причина этого. Посмотрите на коды мехов:Параллелизм задач OpenMP - проблема с производительностью
OMP для версии:
t.start();
#pragma omp parallel num_threads(threadsNumber)
{
for(int ts=0; ts<1000; ++ts)
{
#pragma omp for
for(int i=0; i<size; ++i)
{
array_31[i] = array_11[i] * array_21[i];
}
}
}
t.stop();
cout << "Time of omp for: " << t.time() << endl;
OMP версия задачи:
t.start();
#pragma omp parallel num_threads(threadsNumber)
{
#pragma omp master
{
for(int ts=0; ts<1000; ++ts)
{
for(int th=0; th<threadsNumber; ++th)
{
#pragma omp task
{
for(int i=th*blockSize; i<th*blockSize+blockSize; ++i)
{
array_32[i] = array_12[i] * array_22[i];
}
}
}
#pragma omp taskwait
}
}
}
t.stop();
cout << "Time of omp task: " << t.time() << endl;
В версии задачи я разделить цикл таким же образом, как и в OMP для. Каждая из задач должна выполнять одинаковое количество итераций. Общее количество заданий равно общему количеству потоков.
Результаты деятельности:
Time of omp for: 4.54871
Time of omp task: 8.43251
Что может быть проблема? Возможно ли достичь одинаковой производительности для обеих версий? Прикрепленные коды просты, потому что я хотел только проиллюстрировать свою проблему, которую я пытаюсь решить. Я не ожидаю, что обе версии дают мне такую же производительность, однако я бы хотел уменьшить разницу.
Спасибо за ответ. С уважением.