Форум программистов, компьютерный форум CyberForum.ru

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

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

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

30.08.2010, 19:23. Просмотров 5883. Ответов 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 с разыми параметрами)
Подскажите как правильно написать?
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 19:23     OpenMP, создание потоков
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

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

Разобрался как запускать куски кода в отделных потоках без цикла, нужно заключать их в
#pragma omp section
осталось разобраться с циклом while, может кто подскажет? или OpenMP самое плохое решение многопоточности и никто никогда её не применял?
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
31.08.2010, 18:18     OpenMP, создание потоков #8
А что, while на for нельзя заменить ?
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 19:08  [ТС]     OpenMP, создание потоков #9
Можно, но зачем, если нет смысла? Во многих случая while удобнее и правильнее.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
31.08.2010, 19:10     OpenMP, создание потоков #10
Union, Идентичные циклы елки палки. На вкус и цвет. Где-то удобнее while, где-то for. Но они взаимно-заменяемые
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 20:31  [ТС]     OpenMP, создание потоков #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 указать что такую-то функцию нужно выполнить в отдельном потоке? В таком случае не важно какой цикл используется.
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
16.11.2014, 23:16     OpenMP, создание потоков #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'ов за счёт параллельного исполнения в консоли могут перемешаться)
Max Dark
16.11.2014, 23:22
  #13

Не по теме:

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

Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
16.11.2014, 23:26     OpenMP, создание потоков #14
Цитата Сообщение от Cra3y Посмотреть сообщение
всего то 4 года прошло...
Едрить-растудыть, эк меня ж угораздило...

Добавлено через 36 секунд
В тему попал, ковыряясь в гугле, на дату чота не обратил внимания
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 23:33     OpenMP, создание потоков
Еще ссылки по теме:

Создание потоков в рекурсивной функции - C++
Почему при создании потоков в рекурсивных функциях скорость падает ? Добавлено через 1 минуту простейший пример: //...

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

OpenMP - C++
есть код в общем виде... #pragma omp parallel for for (i = 0; i &lt; n; ++i) { temp = B; // обращаемся for (j = 0; j &lt; k; ++j)...

OpenMP - C++
#pragma omp parallel private(i) shared(j) { #pragma omp for for (j = 0; j &lt; n; j++) { for (i = 0; i &lt; m;...

Магия OpenMP - C++
Есть такой код: Expr = ... // vector&lt;pair&lt;size_t, double&gt;&gt; #ifdef _OPENMP #pragma omp parallel num_threads( 2==(size_level-ptr) ? 1...


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

Или воспользуйтесь поиском по форуму:
castaway
16.11.2014, 23:33     OpenMP, создание потоков
  #15

Не по теме:

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

Yandex
Объявления
16.11.2014, 23:33     OpenMP, создание потоков
Ответ Создать тему
Опции темы

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