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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Добрый вечер! Требуется параллельно вычислить значение функции из третьего варианта. У меня был соблазн "запихнуть" шаг функции в цикл 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
Просмотров: 82
Размер:	73.1 Кб
ID:	92172  
Изображения
 
VolodyaBuzin вне форума   Ответить с цитированием
Старый 10.03.2018, 13:37   #2
VolodyaBuzin
Пользователь
 
Регистрация: 10.11.2017
Адрес: г. Строитель, Белгородская область
Сообщений: 24
Репутация: 10
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


10:01.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.