Форум программистов, компьютерный форум, киберфорум
OpenMP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 44
1

OpenMP планировщик - добиться равномерного распределения задач

07.08.2015, 20:32. Показов 1165. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть следующий код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <unistd.h>
 
int cnttotal = 0;
int cnt1 = 0, cnt2 = 0;
 
int main()
{
    int i;
    #pragma omp parallel
    #pragma omp single nowait
    for (i = 0; i < 60; i++) {
        if (cnttotal < 1) {
            cnttotal++;
            #pragma omp task
            {
                #pragma omp atomic
                cnt1++;
                usleep(10);
                cnttotal--;
            }
        } else {
            #pragma omp task
            {
                #pragma omp atomic
                cnt2++;
                sleep(1);
            }
        }
    }
 
printf("cnt1 = %d; cnt2 = %d\n", cnt1, cnt2);
 
    return 0;
}
Чтобы не делал на выходе получаю cnt1 = 1, а cnt2 = 59.
Не могу понять почему так происходит. Есть предположение что планировщик OpenMP работает по принципу LIFO. Соответственно цикл успевает сделать вторую итерацию пока первая таска не выполнилась и запустить вторую и так далее. В итоге начнутся выполняться с конца.
Может я не прав и проблема в другом?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2015, 20:32
Ответы с готовыми решениями:

Как добиться ускорения OpenMP C++
Доброго времени суток. Я новичок в параллельном программировании. Передо мной поставили задачу...

Задача равномерного распределения
Здравствуйте, нужна помощь с поиском подходов к решению. Формально задачу можно сформулировать...

Функция равномерного распределения
Здравствуйте! Если мне нужно написать функцию которая будет равномерно генерировать значения от 1...

Преобразование равномерного распределения в трапецеидальное
Последнее время много вопросов по твимсу возникает, но что делать:) Нужно на основе стандартного...

6
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
07.08.2015, 21:43 2
deniska_fob, после parallel попробуйте написать for, может, поможет.
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 44
08.08.2015, 07:09  [ТС] 3
tnk500, нет, тут все правильно.
0
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
08.08.2015, 17:54 4
deniska_fob, а задача как звучит? Чего вы хотите добиться?
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 44
09.08.2015, 11:13  [ТС] 5
anmartex, я хочу добиться примерно равномерного распределения задач. Т.е. если N задач#1 создано, то нужно создавать задачи#2. При условии того, что время на работу тела тасок одинаковое, то распределение должно быть более или менее равномерно. Т.е. cnt1 примерно равно cnt2. Однако в цикле создаются N задач#1, а остальные задачи#2.

Пока только вот так решил. Но тут с блокировками, а это не желательно, хоть и крит.секции небольшие. Хотелось бы ограничиться атомарными операциями.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <unistd.h>
#include <omp.h>
 
int N = 4;
int cnttotal = 0;
 
int main()
{
    int i;
    omp_lock_t lock;
    omp_init_lock(&lock);
 
    #pragma omp parallel
    #pragma omp single
    for (i = 0; i < 60; i++) {
        #pragma omp task shared(cnttotal, N), untied
        {
            // avoid data race
            omp_set_lock(&lock);
            if (cnttotal < N) {
                cnttotal++;
                omp_unset_lock(&lock);
                usleep(100); // do something helpful
                // avoid data race
                omp_set_lock(&lock);
                cnttotal--;
                omp_unset_lock(&lock);
            } else {
                omp_unset_lock(&lock);
                usleep(100); // do something helpful
            }
        }
    }
    return 0;
}
0
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
10.08.2015, 06:39 6
deniska_fob, так если вам нужно равномерно распределить потоки между 2 группами задач, так не проще будет сделать что-то на подобии этого?:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main() {
    int i, cnt1 = 0, cnt2 = 0;
 
    #pragma omp parallel for shared(i, cnt1, cnt2)
    for (i = 0; i < 60; i++) {
        if (cnt1 < cnt2) {
            #pragma omp atomic
            cnt1++;
        }
        else {
            #pragma omp atomic
            cnt2++;
        }
    }
 
    printf("cnt1 = %d, cnt2 = %d\n", cnt1, cnt2);
 
    return 0;
}
Т.е. пусть потоки сами определяют за что им браться.
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 44
10.08.2015, 17:46  [ТС] 7
У меня есть ограничение на первую группу задача, в каждый момент не может выполняться более N. А вторая группа может. И по потокам не подойдет, т.к. задач больше чем потоков, поэтому таски.
0
10.08.2015, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2015, 17:46
Помогаю со студенческими работами здесь

Подбор параметров (a, b) для функции равномерного распределения
Здравствуйте. Существуют ли еще какие-то методики оценок параметров a, b для расчета функции...

Построить статистику хи-квадрат для нормального и равномерного распределения
Доброго времени суток! Задача такова: для нормального и равномерного распределения построить...

Найти функцию равномерного распределения вероятностей от двух переменных
Здраствуйте! Помогите следующую решить задачу. Условие:Задано равномерное распределение...

ГСЧ для равномерного распределения случайных чисел на заданном интервале
Доброго всем времени суток. Мне нужно получить последовательность случайных чисел типа double...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru