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

C++

Войти
Регистрация
Восстановить пароль
 
Dima1995
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 4
#1

С++ OpenMP Код работает не совсем адекватно! - C++

28.11.2015, 11:53. Просмотров 293. Ответов 0

Здраствуйте, у меня така вот задачка: Напишите параллельную программу, которая заполняет массив из 100000 чисел случайными

числами из диапазона [-10000,10000] и находит минимальное и максимальное значение

чисел из массива. Заполнение массива числами и нахождения минимального и

максимального значений должны проводиться в параллельных секциях кода.
Код:
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
80
81
82
83
#include "stdafx.h"
 
 
#include <iostream>
#include <omp.h>
#include <ctime>
using namespace std;
 
double f(int x)
{
    return x*x;
}
 
int main()
{
    srand(unsigned(time(0)));
    int *a=new int[100000];
    #pragma omp parallel for num_threads(64)
        for(int i=0; i<100000; ++i)
        {
            a[i]=-10000+rand()%30000;
        }
    
    int max=a[0], min=a[0], NumThreads=64;
    int *maxa=new int[NumThreads], *mina=new int[NumThreads];
    #pragma omp parallel for num_threads(NumThreads) firstprivate(max) firstprivate(min) shared(maxa) shared(mina)
        for(int i=0; i<100000; ++i) // Гдето в етой области была допущена ошибка и иногда результат оказываетса неверным
        {
            if(a[i]>max) 
            {
                max=a[i];
                maxa[omp_get_thread_num()]=max;//
            }
            if(a[i]<min)            
            {
                min=a[i];
                mina[omp_get_thread_num()]=min;
            }
        }
    max=maxa[0];
    min=mina[0];
    //Поиск елементов
 
    for(int i=0; i<NumThreads; ++i)
    {
        if(maxa[i]>max) max=maxa[i];
        if(mina[i]<min) min=mina[i];
    }
    cout<<"Max: "<<max<<"\nMin: "<<min<<endl;
 
//   проверка нытей на адекватную работу
    max=a[0], min=a[0];
    for(int i=0; i<100000; ++i)
    {
        if(a[i]>max) max=a[i];
        if(a[i]<min) min=a[i];
    }
    cout<<"Max: "<<max<<"\nMin: "<<min<<endl;
    delete []a;
    delete []mina;
    delete []maxa;
    int n, ax, bx;
    double h, integr;
    ax=-5; bx=5;
    n=100;
    h=double(bx-ax)/n;
    integr=(f(ax)+f(bx))/2;
    #pragma omp parallel for num_threads(64) reduction(+:integr) 
    for(int i=ax; i<=bx-1; ++i)
    {
        integr+=f(i);
    }
    cout<<"Integral: "<<integr*h<<endl;
 
    double pi=0;
    #pragma omp parallel for num_threads(64) reduction(+:pi)
    for(int i=0; i<=100; ++i)
    {
        pi+=pow(-1.,i)/(2*i+1);
    }
cout<<"Pi: "<<pi*4<<endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2015, 11:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ OpenMP Код работает не совсем адекватно! (C++):

Циферблат аналоговых часов, есть код но он работает не совсем корректно - C++ Builder
Здравствуйте, собственно написал код для вывода циферблата часов, просто по нажатию на кнопку. Код работает но некорректно. 12 часов...

Написал код в Full Debug, потом переделал в Release - и написанный код не работает - C++ Builder
Кто сталкивался с проблемой, написал код в Full Debug потом переделал в Release и написанный код не работает (((

Код работает не совсем корректно со строками - C++
почему-то при любом количестве строк,которое я задаю,он позволяет написать только одну,а потом переходит к следующему пункту и вообще...

Не совсем понятно как работает такой код - C++
Есть консольное приложение, которое при работе выводит данные. Непонятно как работает такой код: for (;;) { char option; ...

Не работает openmp - C++
Написал простенькую программку с распараллеливанием собрал откомпилил, но распараллеливания нет. Программка выглядит так: ...

OpenMP. Время выполнения программы больше чем без OpenMP - C++
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там сказано:&quot;Директива #pragma omp for...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2015, 11:53
Привет! Вот еще темы с ответами:

не совсем понимаю код *указатели - C++
изучаю указатели, столкнулся с кодом не совсем могу понять что происходит в функции *g_s, особенно это условие *p2 &amp;&amp; *p2 == *p ...

setlocale не совсем работает - C++
есть код: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; using namespace std; int main() { setlocale...

Пытаюсь переписать код с циклом for, в код с циклом while, но не совсем получается - C++
Возникло пару вопросов: #include &lt;iostream&gt; using namespace std; int main () { for (int i = 0; i&lt;=10; i++) cout &lt;&lt;...

Программа работает, не не совсем правильно... - C++
Напечатать вектор первых букв слова, которые начинаются и заканчиваются на указаный символ (т.е. надо вывести адрес строки и адреса первых...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru