1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
1

Как распаралелить цикл с помощью второго потока?

16.12.2014, 20:13. Показов 461. Ответов 4
Метки нет (Все метки)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Y(double p)
{
return sin(p);
}
void PrM ( double a1, double b1, int n1, double h1)
 { double  sum = 0, x, res=0;
   for (int i = 0; i < n1; i++)
    {
      x = a1 + i * h1;
      sum += Y(x);
    }
    res = sum * h1;
    cout<<" res: "<< res <<endl;
  }
Как правильно распаралелить цикл в WINAPI.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2014, 20:13
Ответы с готовыми решениями:

Как вне потока запустить цикл который был остановлен
Вот поток есть допустим 100 циклов for, прошло 36 и в catch вылезла ошибка, типо сервис...

Цикл: Как реализовать цикл или что-то другое, чтобы возвращаться в окно редактирования с помощью букв "Y" и"N".
Как реализовать цикл или что-то другое чтобы не возвращаться в окно редактирования не с помощью...

Как распараллелить цикл с помощью Parallel.For?
Подскажите, как данный цикл for (int i = 0; i &lt; round_segments; i++) ...

Как лучше распаралелить задачи, если их количество больше ядер процессора?
Есть много задач Task task1 = new Task(() =&gt; { ...

4
7100 / 6095 / 2780
Регистрация: 14.04.2014
Сообщений: 26,225
16.12.2014, 22:51 2
А что не так с циклом?
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
17.12.2014, 10:01  [ТС] 3
с циклом все нормально. просто не могу понять как его правильно распаралелить.
делаю так:
C++ (Qt)
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
84
85
86
87
88
89
90
91
92
93
94
95
#include <vcl.h>
#include <math.h>
#pragma hdrstop
using namespace std;
#include <iostream.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
   float a = 0;
   float b = M_PI;
   
   double Y(double p)
{
return sin(p);
}
float PrM ( float a, float b, int n, float h)
 { float  sum = 0, x, res=0;
  // double t = GetTickCount();
   for (int i = 0; i < n; i++)
    {
      x = a + i * h;
      sum += Y(x);
    }
    res = sum * h;
    //t= GetTickCount() - t;
   //   cout<<" WINAPI Integral pryamougolnik: "<< res <<endl;
   //   cout<<" WINAPI parallrl (pryamougolnik) Vremya raboti v s: "<< (t/1000)  <<endl<<endl;
    return res;
  }
  class APIIntegral
{
public:
    APIIntegral( float _a, float _b, int _n, float _h)
    {
        a = _a; //параметры
        b = _b;
        n = _n;
        h = _h;
    }
 
public:
    float a;
    float b;
    int n;
    float h;
 
    string nameFunc; // название функции
    float (*func) ( float, float, int,float ); // указатель на функцию
};
 
DWORD WINAPI thread( void * pointer )
{
    Sleep( rand() % 10 + 1 );
 
    HANDLE mutex = CreateMutex(NULL, FALSE, "MyMutex");
 
    WaitForSingleObject(mutex, INFINITE);
 
    APIIntegral par = *(APIIntegral *) pointer;
 
    float a = par.a;
    float b = par.b;
    int n = par.n;
    float h = par.h;
    double t = GetTickCount();
   //   time_t t = clock();
     float res = par.func(a,b,n,h);
    //t = clock() - t;
    t= GetTickCount() - t;
    Sleep( 4000 );
 
    string name = par.nameFunc;
    //cout << name.c_str() << ": " << ceil(result) << " time: " << t << " ms" << "\n";
    cout<< name.c_str() << ": " << (res)  <<endl<<endl;
    cout<<" WINAPI parallrl vremya raboti v s: "<< (t/1000)  <<endl<<endl;
    ReleaseMutex(mutex);
 
    return 0;
}
int main( )
{
        float  h ;
        int n;
        cout << "Kolichestvo yzlow  n: "; cin >> n; cout<<endl<<endl;
        h=(b-a)/n;
      
   APIIntegral *PrM = new APIIntegral(a,b,n,h);
   PrM->func = pryamougolnikM;
   PrM->nameFunc = "pryamougolnikM";
 
   CreateThread(NULL, 0, thread, (void *) PrM,  0, NULL);
        getchar(); getchar(); return 0;
}
и время выполнения не отличается от последовательного.

Добавлено через 6 минут
Нужен какой-нибудь пример.
Как правильно задавать количество выполняемых параллельно потоков? тк приложение создает только один поток.
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
17.12.2014, 10:27 4
Mars74, я сомневаюсь, что в данном случае, ввод дополнительных затрат на передачу данных из цикла в другой поток, как-то ускорит вычисление.
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
17.12.2014, 11:09  [ТС] 5
Но при большом n, (например n=1000000) использование OpenMP для распараллеливания вычисления: sum += Y(x) между потоками дает хороший результат.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2014, 11:09

Как записать цикл коротко, с помощью рекурсии
Всем привет. Если честно, хотел сам решить данную задачу, но вот уже второй день ничего не выходит,...

С помощью нерекурсивного перебора с возвратом найти гамильтонов цикл в графе, заданном с помощью матрицы смежности.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Заполнение буфера из второго потока
Я пока не до конца сам понял проблему, но при заполнении буферов из второго потока (std::thread) на...

Обращение к виджету из второго потока
Доброго времени! Ребята. Подскажите (Я только начал изучать Python): Есть на форме Label. Как из...


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

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

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