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

Преобразование последовательного кода в параллельный - C++

Восстановить пароль Регистрация
 
Redginald
0 / 0 / 0
Регистрация: 12.04.2014
Сообщений: 37
23.04.2014, 15:02     Преобразование последовательного кода в параллельный #1
Программа karp вычисляет PI, используя интегральную аппроксимацию. Вам предоставлена последовательная версия программы karp, и от вас требуется модифицировать ее в параллельную версию в форме SPMD.
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
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * Parallelizing for MPI Lab
 * Karp Example
 * karp.c
 * Last revised RYL 2/6/95
 */
 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
#define f(x) ((double)(4.0/(1.0+x*x)))
#define pi ((double)(4.0*atan(1.0)))
 
void startup (void);
int solicit (void);
void collect (double sum);
 
int main()
     
{
  /* This simple program approximates pi by computing pi = integral
   * from 0 to 1 of 4/(1+x*x)dx which is approximated by sum 
   * from k=1 to N of 4 / ((1+[(1/N)*(k-1/2)]**2) and then
   * multiplying the sum by (1/N). (This numerical integration rule
   * is called "Midpoint rule" and can be found in most numerical
   * analysis text books) The only input data 
   * required is N.                                       
   */
  double sum, w;
  int i, N;
 
  /*
   * The startup routine will create parallel tasks 
   */
  /* startup(); */
 
  /* 
   * The solicit routine will get and propagate the value of N
   */
  N = solicit();
 
  while (N > 0) {
    w = 1.0/(double)N;
    sum = 0.0;
    for (i = 1; i <= N; i++)
      sum = sum + f(((double)i-0.5)*w);
    sum = sum * w;
    /*
     * The collect routine will collect and print results
     */
    collect (sum);
    N = solicit ();
  }
 
  return (0);
}
 
/*  --------------------------------------------------------------  */
void startup (void)
{
}
 
/*  --------------------------------------------------------------  */
int solicit (void)
{
  int N;
  printf ("Enter number of approximation intervals:(0 to exit)\n");
  scanf("%d",&N);
  return (N);
}
 
/*  --------------------------------------------------------------  */
void collect(double sum)
{
  double err;
  err = sum - pi;
  printf("sum, err = %7.5f, %10e\n", sum, err);
}
Формат входного файла:
10
100
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 15:02     Преобразование последовательного кода в параллельный
Посмотрите здесь:

C++ Преобразование двоичного кода в текст
Преобразование кода C++
C++ Преобразование кода в bat
C++ Преобразование кода клавиши в int
C++ Преобразование кода для Visual C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
23.04.2014, 15:29     Преобразование последовательного кода в параллельный #2
Цитата Сообщение от Redginald Посмотреть сообщение
Вам предоставлена последовательная версия программы karp,

Не по теме:

это роботский голос компьютера на первом космическом корабле? Кому представлена - то? Ахахах Нам? Или Вам

Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2014, 15:30     Преобразование последовательного кода в параллельный #3
нужно взять вот этот кусок и распараллелить
C++
1
2
    for (i = 1; i <= N; i++)
      sum = sum + f(((double)i-0.5)*w);
Вообще, советую объяснять вопрос простым языком, чтоб я не лез в википедию за словом SPMD. Учительнице своей на уроке информатике крутыми терминами понтоваться лучше, а на форуме хотелось бы, чтоб как можно больше людей тебя понимало (это вам кстати по алгебре или по информатике задали?)

как вариант предлагаю сделать что-то вроде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double sum;
boost::mutex sum_mtx;
void calculator(int start, int end){
    double localsum = 0.0;
    for (i = start; i < end; i++)
         localsum = localsum + f(((double)i-0.5)*w);
    boost::unique_lock<boost::mutex> lock(sum_mtx);
    sum+=localsum;
}
int main(){
    boost::thread_group tg;
    const int group_size=N/5;
    sum=0.0;
    for(int i=1; i<N; i+=group_size){
        if (i+group_size<N) tg.add_thread(calculator, i, i+group_size);
        else  tg.add_thread(i, N);
    }
    tg.join_all();
    collect (sum);
}
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
23.04.2014, 15:51     Преобразование последовательного кода в параллельный #4
openMP же
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.04.2014, 15:55     Преобразование последовательного кода в параллельный #5
Цитата Сообщение от monolit Посмотреть сообщение
openMP же
Прочитайте вторую строчку исходника в первом посте.
Redginald
0 / 0 / 0
Регистрация: 12.04.2014
Сообщений: 37
23.04.2014, 16:31  [ТС]     Преобразование последовательного кода в параллельный #6
тогда получается надо критическую секцию объявлять если делать через мьютекс и семафор?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2014, 16:36     Преобразование последовательного кода в параллельный #7
Цитата Сообщение от Redginald Посмотреть сообщение
тогда получается надо критическую секцию объявлять если делать через мьютекс и семафор?
шта? этот вопрос по какой части программы?
Redginald
0 / 0 / 0
Регистрация: 12.04.2014
Сообщений: 37
23.04.2014, 16:45  [ТС]     Преобразование последовательного кода в параллельный #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
шта? этот вопрос по какой части программы?
ну у меня прога начала ругаться на
C++
1
boost::mutex sum_mtx;
говорит следующее
C++
1
2
3
4
5
6
7
8
9
10
11
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(49): error C2653: boost: не является именем класса или пространства имен
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(49): error C2065: mutex: необъявленный идентификатор
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(49): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "sum_mtx"
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(49): error C2065: sum_mtx: необъявленный идентификатор
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(50): error C2601: calculator: недопустимые локальные определения функций
1>          c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(45): эта строка содержит "{", которая пока не имеет парной
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(57): error C2601: main: недопустимые локальные определения функций
1>          c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(45): эта строка содержит "{", которая пока не имеет парной
1>c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(68): fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{" в "c:\users\антон\documents\visual studio 2010\projects\22\22\1.cpp(45)"
1>
1>СБОЙ построения.
newbie666
Заблокирован
23.04.2014, 17:01     Преобразование последовательного кода в параллельный #9
Цитата Сообщение от Redginald Посмотреть сообщение
ну у меня прога начала ругаться на
а чё слабо прочитать, на что твоя "прога" ругается? Тебе ж даже по русский пишут.
BOOST устанавливай и подключай
Redginald
0 / 0 / 0
Регистрация: 12.04.2014
Сообщений: 37
23.04.2014, 17:44  [ТС]     Преобразование последовательного кода в параллельный #10
Цитата Сообщение от newbie666 Посмотреть сообщение
а чё слабо прочитать, на что твоя "прога" ругается? Тебе ж даже по русский пишут.
BOOST устанавливай и подключай
а нельзя сделать без него. просто мне эту лабку сдавать надо, а на компах универских вряд ли все это есть
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.04.2014, 17:46     Преобразование последовательного кода в параллельный #11
Redginald, вы прежде чем кидаться следовать тысяче советов задание сформулируйте. А именно: вам каким инструментом нужно распараллелить? Наверняка при получении задания это оговаривалось. В комментариях к коду я вижу MPI, но мало ли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 18:27     Преобразование последовательного кода в параллельный
Еще ссылки по теме:

C++ Преобразование кода
C++ Преобразование кода со статическим выделением памяти в динамическое
Параллельный set_difference C++

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

Или воспользуйтесь поиском по форуму:
newbie666
23.04.2014, 18:27     Преобразование последовательного кода в параллельный
  #12

Не по теме:

а вообще иди лучше со своей "лабкой" на форум "помоги студенту на халяву", тут форум вроде как для программистов, а не для бесплатного изготовления чужих заданий в универе

Yandex
Объявления
23.04.2014, 18:27     Преобразование последовательного кода в параллельный
Ответ Создать тему
Опции темы

Текущее время: 12:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru