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

[OMP] Как распараллелить for - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обработка массива структур http://www.cyberforum.ru/cpp-beginners/thread719414.html
Всем привет. Помогите найти ошибку. Программа должна вывесть имя младшего ребенка если отца зовоут "ivan" Младший ребенок находится тока по году рождения. #include "stdafx.h" #include "iostream" #include "conio.h" #include <windows.h> using namespace std;
C++ Поиск по условию в уже введённых данных Известны данные о моделях ноутбуков к их стоимости. Необходимо обеспечить ввод этих данных в программу, после этого следует найти ноутбук, стоимость которого максимально близка к средней стоимости, вычисленной по всем ноутбукам. http://www.cyberforum.ru/cpp-beginners/thread719410.html
C++ Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте
№3 - строки Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте. 5.16 - Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
C++ Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент
№2 - двумерный массив Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент. Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик. 5.16 - Запрещено создавать темы с множеством вопросов во...
C++ Вывести числа Армстронга от 1 до n http://www.cyberforum.ru/cpp-beginners/thread719393.html
Натуральное число, в записи которого z цифр, называется числом Амстронга, если сумма его цифр, возведенная в степень z, равна самому числу. Найти все числа Амстронга от 1 до n. Пожалуйста, посмотрите код, что в нем не так? первый раз работаю с функцией. Хочу разобраться. #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; int Armstrong(int);
C++ Составить список? в котором сохраняются результаты сессии группы (структуры) Помогите пожалуйста запутался в программе задача Составить список в котором сохраняются результаты сесии группы . НАписать программу расчёта стипендии по результатам сесии #include<iostream> #include<ctime> #include<cmath.h> using namespace std; struct gruppa// { char Kod;//название группы подробнее

Показать сообщение отдельно
Kill100
 Аватар для Kill100
360 / 249 / 33
Регистрация: 11.12.2010
Сообщений: 1,069
Завершенные тесты: 1
05.12.2012, 16:03     [OMP] Как распараллелить for
Надо написать вычисление интеграла и распараллелить его.
Я написал левыми прямоугольниками. Но проблема в том что #pragma omp parallel for принимает только for с типом int а у меня double
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
#include "stdafx.h"
#include "omp.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <time.h>
using namespace std;
 
//сама F(x)
double Fx(double x)
{
    return (0.5 * x + x * log(x));
}
//Численный метод прямоугольников
//H - количество фигур на которое разбиваем
double Integral(double a, double b, double H)
{
    double P = 0;//ответ
    double h = (b - a) / H;//шаг
    omp_set_dynamic(1);//Динамичное распределение потоков
//само рзспараллливание
#pragma omp parallel for reduction(+: P)
    for (double x = a; x < b; x += h)
    {
        P += ((Fx(x) + Fx(x + h)) / 2);
    }
    //printf("%d\n",omp_get_num_threads());
    return P * h;
}
int _tmain(int argc, _TCHAR* argv[])
{
    time_t t1, t2;
    t1 = clock();
    printf("%f\n",Integral(1,2,99999990));//ответ
    t2 = clock();
    double duration = ((double)t2-(double)t1)/double(CLOCKS_PER_SEC);
    printf("%f\n",duration);//время выполнения
    system("pause");
    return 0;
}
Добавлено через 18 часов 53 минуты
Всем спасибо за внимание
В итоге получил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 //Расчет интеграла, распараллеливание for + редукция
    double Integral(double a, double b, int H)
    {
        //ответ
        double P = 0;
        //шаг
        double h = (b - a) / H;
        omp_set_dynamic(1);
        omp_set_num_threads(8);
        //параллельный блок
#pragma omp parallel  
        {
#pragma omp for reduction(+: P)
            for (int dd=0; dd < H; dd ++)
            {
                P += ((Fx((dd*h+a)) + Fx((dd+1)*h+a)) / 2);
            }
            //вывод количества испльзуемых потоков
#pragma omp critical
            printf("%d\n",omp_get_num_threads());
        }
        return P * h;
    }
Можно ли еще как ни будь улучшить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru