Я играю с функцией задачи omp и столкнулся с проблемой. У меня есть следующий код:все задачи omp планируются в том же потоке
void function1(int n, int j)
{
//Serial part
#pragma omp parallel
{
#pragma omp single nowait
{
//execcute function1() for every n
for (i=0; i<n; i++)
{
//create a task for computing only large numbers of n
if (i <= 10)
//execute serial
else
#pragma omp task
//call function again
function1(n, j+1);
printf("task id:\n", omp_get_thread_num());
}
}
}
}
Сейчас код будет производить правильный результат, но производительность гораздо медленнее, чем оригинальная серийная версия. После некоторого расследования я обнаружил, что все задачи выполняются в потоке 0, несмотря на то, что в общей сложности всего 4 потока. Кто-нибудь знает, что здесь происходит? Заранее спасибо!
Нет. Теперь каждая нить выполняет тот же цикл и создает кучу идентичных задач. Наличие единой директивы делает этот поток создаёт все задачи, которые затем выполняются всеми потоками. –