Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.95
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
#1

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 19:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос OpenMP, создание потоков (C++):

Создание потоков в openmp - C++
Доброго времени суток. Мне удалось распараллелить цикл for, но внутри данного цикла, помимо прочего, содержится ещё один цикл for,...

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

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

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

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

OpenMP. Время выполнения программы больше чем без OpenMP - C++
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там сказано:"Директива #pragma omp for...

14
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 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
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 20:19  [ТС] #3
Пишу в VS2010.
А чем ваш вариант отличается от моего?
Мне нужно чтобы работало так:
- запустилась прога
- потом создался отдельны поток и в нем начала выполняться функция с первыми параметрами
- потом создался второй поток и в нем начала выполняться функция с вторыми параметрами
- основной поток, функция main начала выполняться дальше
Т.е. в результате 3 отдельных потока.

В вашем примере всего одна функция printf и по всей видимости выполняется 2 раза...
Покажите пожалуйста как сделать чтобы
printf("Hello 1")
выполнелось в одном отдельном от main потоке, а
printf("Hello 2")
во втором.
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 20:23 #4
Цитата Сообщение от Union Посмотреть сообщение
А чем ваш вариант отличается от моего?
Я привёл код, к-рый однозначно рабочий. Если у вас он не запускается, нужно скорее всего добавить ключи для компиляции.
0
Union
17 / 17 / 2
Регистрация: 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
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 21:04 #6
Цитата Сообщение от Union Посмотреть сообщение
Может можно как-то так реализовать:
Предполагаю, для этого нужен #pragma omp parallel for
0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 18:02  [ТС] #7
Не компилируется:
Требуется цикл For, следующий за директивой OpenMP "parallel for"
я хочу реализовать без цикла for

Разобрался как запускать куски кода в отделных потоках без цикла, нужно заключать их в
#pragma omp section
осталось разобраться с циклом while, может кто подскажет? или OpenMP самое плохое решение многопоточности и никто никогда её не применял?
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
31.08.2010, 18:18 #8
А что, while на for нельзя заменить ?
0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 19:08  [ТС] #9
Можно, но зачем, если нет смысла? Во многих случая while удобнее и правильнее.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2010, 19:10 #10
Union, Идентичные циклы елки палки. На вкус и цвет. Где-то удобнее while, где-то for. Но они взаимно-заменяемые
0
Union
17 / 17 / 2
Регистрация: 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
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
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
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
16.11.2014, 23:26 #14
Цитата Сообщение от Cra3y Посмотреть сообщение
всего то 4 года прошло...
Едрить-растудыть, эк меня ж угораздило...

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 23:33
Привет! Вот еще темы с ответами:

Создание потоков - C++
Здравствуйте, я создал два потока, но не знаю, как можно проверить, точно ли я их создал и точно ли всё выполняется в отдельном потоке, а...

Создание потоков в Borland c - C++
Есть ли возможность создание как минимум двух потоков процессора в borland c в консольке?

VS 12 ограничение на создание потоков - C++
Использую реализацию OpenMP для распараллеливания вычислений. Почему то больше 64 потоков не создает. 2х ядерный процессор, 3гб оперативки,...

Создание потоков по нажатию кнопок - C++
Написал программу, которая создает потоки (круг1/2) которые движутся по экрану. Как сделать так, чтобы шары появлялись по нажатию какой...


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

Или воспользуйтесь поиском по форуму:
15
16.11.2014, 23:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.