Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Добрый вечер! Требуется параллельно вычислить значение функции из третьего варианта. У меня был соблазн "запихнуть" шаг функции в цикл 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
Сообщений: 56
По умолчанию

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

Код:
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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