Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 09.03.2018, 22:25   #1
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 46
По умолчанию Расчёт значения функции, параллельное программирование

Добрый вечер! Требуется параллельно вычислить значение функции из третьего варианта. У меня был соблазн "запихнуть" шаг функции в цикл for, но циклов с вещественными счётчиками не бывает. Если бы счётчик x был целым, а шаг функции вещественным (по условию нужно разделить номер варианта на количество расчётов), то цикл получился бы бесконечным и программа никогда бы не завершила работу. Как грамотно переделать и распараллелить цикл и куда лучше всего "совать" шаг моей функции?

Исходный код на C++:
Код:
#include "stdafx.h"
#include <omp.h>
#include <time.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <conio.h>
using namespace std;
 
void CalcFunction(int n, int p, int k) {
    double a, b, h, y, x;
    a = n;
    b = 2*n;
    h = (double)(n / p);
    omp_set_dynamic(0);
    omp_set_num_threads(k);
    #pragma omp parallel for
    for(x = 1; x < (n+1); x += h) {
        y = (double)((1 / (2*b))*exp((double)(-(fabs(x - a) / b))));
        cout << "y(" << x << ") = " << y << endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    clock_t st, et;
    double iv;
    int n, p, k;
    cout << "Enter your ID:\n";
    cin >> n;
    cout << "Enter number of calculations:\n";
    cin >> p;
    cout << "Enter number of threads:\n";
    cin >> k;
    cout << "y(x) = (1 / (2*b))*exp(-(fabs(x - a) / b)):\n";
      st = clock();
  CalcFunction(n, p, k);
  et = clock();
  iv = (double)(et-st)/CLOCKS_PER_SEC;
  printf("time is %f\n", iv);
  _getch();
    return 0;
}
Изображения
Тип файла: jpg скрин-задания.jpg (73.1 Кб, 128 просмотров)
Тип файла: jpg скрин-вариантов-функции.jpg (24.4 Кб, 84 просмотров)
VolodyaBuzin вне форума Ответить с цитированием
Старый 10.03.2018, 12:37   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Сообщений: 46
По умолчанию

Пытался сделать так:

Код:
void CalcFunction(int n, int p, int k) {
    double a, b, h, y, x;
    int i;
    x = 1;
    a = n;
    b = 2*n;
    h = (double)(n / p);
    omp_set_dynamic(0);
    omp_set_num_threads(k);
    #pragma omp parallel for reduction(+: x)
    for(i = 0; i < 10000000000; i++) {
        y = (double)((1 / (2*b))*exp((double)(-(fabs(x - a) / b))));
        cout << "y(" << x << ") = " << y << endl;
        x += h;
        if (x > (n + 1)) {
            break;
        }
    }
}
Но компилятор почему-то ругается на break:

1>function-value.cpp(28): error C3010: 'break' : jump out of OpenMP structured block not allowed
1>
1>Build FAILED.

Пожалуйста, напишите в комментариях к коду, что нужно сделать на самом деле!
VolodyaBuzin вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параллельное программирование в С++ Live_Death Помощь студентам 1 12.12.2017 12:31
Параллельное программирование DENiskaKURT Помощь студентам 2 26.02.2011 13:31
Параллельное программирование L10n Помощь студентам 5 05.08.2010 14:13
Параллельное программирование Renegad Фриланс 5 10.06.2008 17:11
Параллельное программирование Ugly Win Api 7 16.03.2008 15:33


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS