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

OpenMP, создание потоков

30.08.2010, 19:23. Показов 11347. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В инете нашел много примеров по распараллеливание циклов, но никак не могу понять, как просто написать чтобы конкретная функция выполнялась в отдельном потоке?

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    #pragma omp parallel
           {
              start_log("gsd", 34, "link", "proj");
           }
    #pragma omp parallel
           {
              start_log("rfs", 35, "klik", "proj");
           }
}
Вот пример, нерабочий естесно.
Нужно чтобы функция void start_st каждый раз при вызове запускалась в отдельном потоке. Т.е. должно получится в данном случае 3 потока (1 - основной и 2 - функция start_st с разыми параметрами)
Подскажите как правильно написать?
Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2010, 19:23
Ответы с готовыми решениями:

Создание потоков в openmp
Доброго времени суток. Мне удалось распараллелить цикл for, но внутри данного цикла, помимо...

Как контролировать число создаваемых потоков? OpenMP
Здравствуйте. Начал изучать OpenMP. Имеется вопрос - когда мы делаем #pragma omp parallel for ...

OpenMP. Назначение числа потоков во время исполнения
Задача проста - есть готовые вектора, с которыми надо проводить операции. Размер их очень большой,...

OpenMP. Время выполнения программы увеличивается с количеством потоков
Задача: найти сумму максимальных элементов строк матрицы. Я составил код программы и распараллелил...

14
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 20:06 2
Какой компилятор ? Дополнительные ключи компиляции используешь ?

Добавлено через 3 минуты
Вот пример кода, к-рый должен работать:

C++
1
2
3
4
5
6
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
    printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 20:19  [ТС] 3
Пишу в VS2010.
А чем ваш вариант отличается от моего?
Мне нужно чтобы работало так:
- запустилась прога
- потом создался отдельны поток и в нем начала выполняться функция с первыми параметрами
- потом создался второй поток и в нем начала выполняться функция с вторыми параметрами
- основной поток, функция main начала выполняться дальше
Т.е. в результате 3 отдельных потока.

В вашем примере всего одна функция printf и по всей видимости выполняется 2 раза...
Покажите пожалуйста как сделать чтобы
printf("Hello 1")
выполнелось в одном отдельном от main потоке, а
printf("Hello 2")
во втором.
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 20:23 4
Цитата Сообщение от Union Посмотреть сообщение
А чем ваш вариант отличается от моего?
Я привёл код, к-рый однозначно рабочий. Если у вас он не запускается, нужно скорее всего добавить ключи для компиляции.
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 21:02  [ТС] 5
Andrew_Lvov работает, но не так, как мне нужно

Добавлено через 37 минут
Может можно как-то так реализовать:
Код
int a=0;
#pragma omp parallel
while (a++ != 10) {
 запустить и обработать printf( "%i",  a); в отдельном потоке
}
?
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 21:04 6
Цитата Сообщение от Union Посмотреть сообщение
Может можно как-то так реализовать:
Предполагаю, для этого нужен #pragma omp parallel for
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 18:02  [ТС] 7
Не компилируется:
Требуется цикл For, следующий за директивой OpenMP "parallel for"
я хочу реализовать без цикла for

Разобрался как запускать куски кода в отделных потоках без цикла, нужно заключать их в
#pragma omp section
осталось разобраться с циклом while, может кто подскажет? или OpenMP самое плохое решение многопоточности и никто никогда её не применял?
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
31.08.2010, 18:18 8
А что, while на for нельзя заменить ?
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 19:08  [ТС] 9
Можно, но зачем, если нет смысла? Во многих случая while удобнее и правильнее.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2010, 19:10 10
Union, Идентичные циклы елки палки. На вкус и цвет. Где-то удобнее while, где-то for. Но они взаимно-заменяемые
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 20:31  [ТС] 11
Допустим мне необходимо считывать строки из базы и на каждую запускать отдельный поток.
Через цикл while это будет так:
C++
1
2
3
4
while( ( row = mysql_fetch_row(result)) != NULL ) {
   printf("id: %s,  tp: %s:%s \n", row[0], row[1], row[2]); // Выводим содержимое строки
   start_thread(row[0], row[1], row[2]) // Запускаем в отдельном потоке функцию start_thread с параметрами из базы
}
Через цикл For это будет так:

C++
1
2
3
4
5
6
7
8
9
result = mysql_store_result(conn); // Получаем кол-во строк
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < result; ++i) // Тут мог намудрить, надо проверить, но смысл остаётся тот-же
   row = mysql_fetch_row(result));
   printf("id: %s,  tp: %s:%s \n", row[0], row[1], row[2]); // Выводим содержимое строки
   start_thread(row[0], row[1], row[2]) // Запускаем в отдельном потоке функцию start_thread с 
}
В общем тут гораздо больше всего ненужного...
В первом примере осталось только запустить функцию в отдельном потоке.
Во втором всё, что заключено в цикл for в каждом цикле будет создаваться новый поток и выполняться в нём, если я правильно понял... хотя на некоторых сайтах пишут что потоки динамически добавляться не могут и устанвливаются вначале столько, сколько ядер. Тогда если у меня рассчитано что функция исполняется неограниченное время - программа зависне, т.к. функция не будет запущена столько раз, сколько строк в базе.

Да, так и есть, с циклом for выходит фигня

Добавлено через 13 минуты
Я неправильно задал вопрос... как с помощью OpenMP указать что такую-то функцию нужно выполнить в отдельном потоке? В таком случае не важно какой цикл используется.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.11.2014, 23:16 12
Цитата Сообщение от Union Посмотреть сообщение
Нужно чтобы функция void start_st каждый раз при вызове запускалась в отдельном потоке. Т.е. должно получится в данном случае 3 потока (1 - основной и 2 - функция start_st с разыми параметрами)
Подскажите как правильно написать?
Если я правильно понял постановку вопроса, то так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <omp.h>
#include <stdio.h>
 
int main (void)
{
#pragma omp parallel sections
  {
 
#pragma omp section
    {
      printf ("section1, thread=%d\n", omp_get_thread_num());
      start_log ("gsd", 34, "link", "proj");
    }
 
#pragma omp section
    {
      printf ("section2, thread=%d\n", omp_get_thread_num());
      start_log ("rfs", 35, "klik", "proj");
    }
  }
 
  return 0;
}
Добавлено через 1 минуту
Но при этом внутри секций надо не забывать работать с синхронизацией. Так я в примере воткнул в обе паралkельные ветки вызов printf'а, который в общем случае может и не уметь правильно работать в потоках (т.е. печати от обоих printf'ов за счёт параллельного исполнения в консоли могут перемешаться)
0
Max Dark
16.11.2014, 23:22
  #13

Не по теме:

всего то 4 года прошло...

0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.11.2014, 23:26 14
Цитата Сообщение от Cra3y Посмотреть сообщение
всего то 4 года прошло...
Едрить-растудыть, эк меня ж угораздило...

Добавлено через 36 секунд
В тему попал, ковыряясь в гугле, на дату чота не обратил внимания
0
castaway
16.11.2014, 23:33     OpenMP, создание потоков
  #15

Не по теме:

Алкоголь он такой...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2014, 23:33

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом...

OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там...

Остановка всех потоков OpenMP
Всем привет, уважаемые форумчане! Хочу у вас спросить о такой проблеме: &quot;Как остановить выполнение...

Создание потоков
Разработать программу, определяющую основные параметры загруженности компьютера, работающего под...


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

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