Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вычисление числа пи с использованием потоков / 22 сообщений из 22, страница 1 из 1
05.05.2013, 23:16
    #38248358
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Добрый вечер,подскажите пожалуйста, начал изучать изучение многопоточности микроядерных ОС семейства unix
Для понимания хочу вычислить число пи
такой код:
Код: plaintext
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
#include <stdio.h>
#include <pthread.h>

#define INTERVALS 100000
#define THREADS 4

float global_sum = 0.0;
pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER;

void *pi_calc(void *num)
{
  float my_sum = 0.0;
  int myid = *(int*)num;
  float h = 1.0 / INTERVALS;
  int start = (INTERVALS / THREADS) * myid;
  int end = start + (INTERVALS / THREADS);

  float x;
  int i;
  for (i = start; i < end; i++)
  {
    x = h * ((float)i - 0.5);
    my_sum += x;
  }

  pthread_mutex_lock(&global_lock);
  global_sum += my_sum;
  pthread_mutex_unlock(&global_lock);
}

int main ()
{
  pthread_t tid[THREADS];
  int i;
  int t_num[THREADS];

  for (i = 0; i < THREADS;i++)
  {
    t_num[i] = i;
    pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);
  }

  for (i = 0; i < THREADS; i++)
    pthread_join (tid[i], NULL);

  printf ("Sum = %f\n", global_sum);
}



в результате на консоле Sum = 49999.000000 не пойму почему?
...
Рейтинг: 0 / 0
06.05.2013, 02:37
    #38248440
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stell,

Что-то я сильно сомневаюсь, что просуммировав индексы в цикле можно получить число, имеющее хоть какое-то отношение к Пи
...
Рейтинг: 0 / 0
08.05.2013, 19:14
    #38252288
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stell, твой вопрос состоит из 2-х частей. Собственно мультипоточности. И формулы расчёта числа Пи.
По первому пункту всё просто. А второе - непонятно. Что за формулу ты использовал? Откуда?
...
Рейтинг: 0 / 0
12.05.2013, 19:24
    #38254439
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
mayton,

да,согласен,это помутнение,извините.
а что Вы имеете в виду, под словом всё просто?
...
Рейтинг: 0 / 0
12.05.2013, 20:47
    #38254496
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Просто в том плане что туториал под unix с использованием потоков найти не сложно.

Сложно будет обосновать что нужно его применить для расчёта числа Пи. Тоесть говоря
простыми словами это надуманная или высосанная из пальца постановка. А такие
постановки - всегда спорны.
...
Рейтинг: 0 / 0
12.05.2013, 20:52
    #38254499
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
mayton,

Можете подсказать?



создаю поток, следующим образом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include <pthread.h>

int main (){
 ......
 ......
 pthread_t	our_thread_id;
 pthread_create(&our_thread_id,NULL,pi_calc,NULL); //Создаю поток


при компиляции выдает
Description Resource Path Location Type
initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' threads.cc /threads line 50 C/C++ Problem

pi_calc -фунция подсчета числа, проверил даже на примере из справки,не рабтает,
т.е.
Код: plaintext
1.
2.
//прототип
void *pi_calc();




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
7void *pi_calc()
{
	           printf("functionA active\n");
		sleep(5);
		printf ("functionA is finished.\n");
		return(NULL);
}



Компилируется в среде QNX
...
Рейтинг: 0 / 0
12.05.2013, 21:07
    #38254508
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stell//прототип
Код: sql
1.
void* pi_calc();


Код: sql
1.
void* (*)(void*)


Найди отличие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.05.2013, 21:39
    #38254524
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Dimitry Sibiryakov,

ага,спасибо,разобрался - заработало.
...
Рейтинг: 0 / 0
13.05.2013, 19:12
    #38255679
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Ребят,чтобы не плодить тем, можно вопрос?
хочу добиться многопоточности,скажу сразу,пока новичек.
хотя бы получить в общем виде результат,
что на данный момент сделано?
1) Есть прототип функции
2)сама функция
Код: plaintext
1.
void *pi_calc(void*arg)

Без использования потоков функция возвращает результат вычисления
3)в main
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
           int id, result;
	pthread_t	our_thread_id;
	id = 1;
           result = pthread_create(&our_thread_id,NULL,&pi_calc,&id);
    	if (result != 0) {
         perror("Creating the first thread");
         return EXIT_FAILURE;
       }
..............
..............
          pthread_join(our_thread_id, NULL);
          pause();



так вот,может уже на данном этапе проблема,если в принципе всё так,то не пойму следующее:
компилится всё ок,поток создается, но результат функции потока я не вижу,может я суть потерял?
т.е. если грубо, то нужно чтобы вычисление вычислялось многопоточно,распараллеливание вычислений
...
Рейтинг: 0 / 0
13.05.2013, 20:07
    #38255731
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stellнужно чтобы вычисление вычислялось многопоточно,распараллеливание
вычислений
Для этого нужно чтобы алгоритм был распараллеливаемый. Потом его надо собственно
распараллелить, т.е. разделить на части, каждая из которых может вычисляться независимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2013, 20:46
    #38255770
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stellкомпилится всё ок,поток создается, но результат функции потока я не вижу,может я суть потерял?


ГДЕ ты хочешь увидеть результат функции?
Тем более, что ты вызываешь

Код: plaintext
1.
pthread_join(our_thread_id, NULL);
...
Рейтинг: 0 / 0
19.05.2013, 13:46
    #38263803
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
MasterZiv,
Anatoly Moskovsky,
mayton,
Dimitry Sibiryakov,
Ребят,хочу всё таки разобраться с потоками,прочитал статьи на хабре вроде этой
написал это в qnx momentics 6.5
Код: plaintext
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <sys/neutrino.h>
#include <pthread.h>
#include <errno.h>
#include <sched.h>
#include <unistd.h>
#include <math.h>

#define INTERVALS 100000
#define THREADS 2


using namespace std;

double global_sum = 0.0;
pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER;

void *pi_calc(void *);

int main ()
{
  pthread_t tid[THREADS];
  int i,result;
  int t_num[THREADS];

  for (i = 0; i < THREADS; i++)
  {
    t_num[i] = i;
    result = pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);
    if (result != 0) {
     perror("Creating the thread");
     return EXIT_FAILURE;
    }
  }

  for (i = 0; i < THREADS; i++){
      result = pthread_join (tid[i], NULL);
      if (result != 0) {
                perror("Joining the first thread");
                return EXIT_FAILURE;
              }
  }
  cout<<"Результат : "<<setprecision(20)<< global_sum<< endl;
}

void *pi_calc(void *)
{
  double my_pi = 0.0;
  double h = 1.0 / INTERVALS;
  double x;
  int i;
  for (i = 1; i < INTERVALS; i++)
  {
    x = ((double)i - 0.5)*h;
    my_pi = my_pi+ 4.0 / (1.0 + x * x);
  }

  pthread_mutex_lock(&global_lock);
  global_sum = my_pi*h;
  pthread_mutex_unlock(&global_lock);
}



чисто визуально всё ок.
в консоле всё выводится, но не могу объективно понять, правильно ли я работаю с потоками?чисто теоретически,да и практически
целевая система поднята на виртуалке,1 процессор.
...
Рейтинг: 0 / 0
19.05.2013, 13:47
    #38263805
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
...
Рейтинг: 0 / 0
19.05.2013, 13:52
    #38263808
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
реализацию с помощью openMP не смог сделать,точнее не смог подключить хидер omp.h
в теории,если конечно верно, нужно в целевой собрать omp.h должно заработать, но не хватает знаний как это сделать.
если есть мысли или полезные статьи, буду благодарен.
...
Рейтинг: 0 / 0
19.05.2013, 14:19
    #38263824
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stell,

Начнем с того, что вы запускаете несколько потоков, но они не анализируют переданный параметр и делают одно и то же, и в конце по очереди перезаписывают результаты друг друга в глобальной переменной. А так как результаты одинаковые, то вам кажется что "чисто визуально всё ок"
...
Рейтинг: 0 / 0
20.05.2013, 00:01
    #38263872
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Anatoly Moskovsky,

не совсем понимаю,можете показать на моей программе или объяснить?
...
Рейтинг: 0 / 0
20.05.2013, 01:35
    #38263903
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
denis_stell,

А что тут объяснять.

Вот вы N раз создаете потоки, передавая в них t_num[i]:
Код: plaintext
1.
result = pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);


А ваши потоки игнорируют переданный параметр и каждый из них вычисляет некое значение не зависящее от внешних параметров, т.е. они делают одно и то же.
Код: plaintext
1.
2.
3.
4.
5.
void *pi_calc(void *)
{
...
 global_sum = ...; 
}


Посмотрите в ваше первое сообщение - там потоки рассчитывают разные значения исходя из параметра. Вам только нужно правильный алгоритм рассчета пи применить (какой правильный я не знаю, но не тот что там есть).

К сожалению, подробнее уже объяснять некуда.
...
Рейтинг: 0 / 0
20.05.2013, 09:08
    #38264007
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Ну если под qnx - вы бы лучше на qnx.org.ru поспрашивали
Там есть некоторая специфика
...
Рейтинг: 0 / 0
20.05.2013, 09:11
    #38264012
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Да и вот

Вычисление N-го знака числа Пи без вычисления предыдущих
http://habrahabr.ru/post/179829/
...
Рейтинг: 0 / 0
20.05.2013, 09:29
    #38264039
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Лучше сразу заходить
http://qnx.org.ru/forum
...
Рейтинг: 0 / 0
20.05.2013, 11:35
    #38264229
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
Anatoly Moskovsky,
спасибо, доберусь до домашнего компа, буду пробовать.
...
Рейтинг: 0 / 0
20.05.2013, 11:36
    #38264230
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление числа пи с использованием потоков
landy,
Спасибо,ознакомлюсь.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вычисление числа пи с использованием потоков / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]