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

Многопоточный расчет числа пи - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Массивы, критика кода http://www.cyberforum.ru/cpp-beginners/thread706255.html
Дорогие друзья, такой вопрос что не так в моем коде?#include <iostream> #include <stdlib.h> using namespace std; int main() { int Matrix; cout << "Enter number: "<< endl; int n;
C++ Реверс списка Скажите пожалуйста правильна ли логика реверса void IntList::Revers() { ListItem *tmp, *ptr = NULL; while(last->next==0) { tmp = first->next; first->next = ptr; ptr = first; http://www.cyberforum.ru/cpp-beginners/thread706253.html
C++ Определить, есть ли среди элементов массива такие, которые равны сумме двух других
Дано натуральное число n и целые числа a(1), a(2), ..a(n) (n<100). Определить, есть ли среди этих чисел такие, которые равны сумме двух других. Напечатать эти числа в форме a(k) = a(i) + a(j) #include <iostream> using namespace std; int main () { int *a,n,i,j,k;
C++ Сортировка масивов
Посмотрите пжл что не так# include <iostream> using namespace std; int main() {int a={10,12,6,4,1,8,17,2,9}; int c,is; for(int i=0;i<10;i++) cout <<a<<" "; do{is=0; for(int i=1;i<10;i++) if(a>a)
C++ Напечатать таблицу изменения концентрации хлора для интервала времени от 0 до 5 часов с шагом 0.5 часа http://www.cyberforum.ru/cpp-beginners/thread706219.html
Есть такая вот задачка. Концентрация хлора в бассейне, объем какого м3, составляет 10 г/л. Через одну трубу вливают чистую воду с объемной скоростью м3/год., через вторую трубу с такой же скоростью вода выливается. При условии идеального перемешивания концентрация хлорной известки изменяется за законом, где - время; C0 – начальная концентрация. Напечатать таблицу изменения концентрации хлора...
C++ Указатели Наткнулся на вот такой цикл for (char p=str; *p!=(char)0; ++p) ,поясните пожалуйста что значит *p!=(char)0 подробнее

Показать сообщение отдельно
IMAGINARIUM
0 / 0 / 0
Регистрация: 06.01.2011
Сообщений: 17
23.11.2012, 02:02     Многопоточный расчет числа пи
Здравствуйте, уважаемые коллеги.

Мне нужно по учебе написать многопоточное приложение для вычисления числа пи с помощью WinAPI. Халявы не ищу, нужно просто поговорить как следует, если можно, помогите пожалуйста комментами в примере ниже.
Вот ТЗ:
"Напишите параллельную программу, вычисляющую число пи с точностью N знаков после запятой по следующей формуле:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi = \frac{1}{n}\sum_{i = 0}^{n-1}\frac{4}{1+{{x}_{i}}^{2}}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{i} = \frac{i+0.5 }{n}

Установите n=1000000000. Создание потоков выполняйте с помощью функции CreateThread. Рекомендуется сразу в начале программы сразу создать необходимое количество потоков в приостановленном состоянии.
Произведите замер времени выполнения вашей программы. Проведите эксперименты для определения количества потоков в программе (от одного до 16), при котором достигается наибольшая скорость выполнения.

Используемые функции Win32 API: CreateThread, ResumeThread, SuspendThread
"

Причем надо реализовать два способа:

1) Статическое распределение итераций блоками (размер блока 100) по потокам.
Первый блок из 100 итераций выполняет нулевой поток, второй блок – следующий и т.д. до последнего потока, затем распределение снова начинается с нулевого потока
.

2) Статическое распределение итераций блоками (размер блока 100) по потокам.
Сначала каждый поток 100 итераций, тот поток, который заканчивает выполнение своей порции итераций, получает следующую свободную порцию из 100 итераций. Освободившиеся потоки получают новые порции итераций до тех пор, пока все порции не будут исчерпаны
.

Отсюда следующие вопросы:
1) я пока читаю книгу и курю MSDN, на нем есть большой пример с указанными функциями, но если честно, я не очень его понимаю, т.к. никогда ранее не работал с многопоточными приложениями и ничего о них не читал, мне хотелось бы, чтобы мне подсказали, откуда начинать и каким именно образом включать формулу. Даже не знаю, к чему больше относится мой вопрос: к теории или скорее к синтаксису, пока большой разрыв между теоретическими лекциями и книгами и реальным кодом в примере.
Вот код примера:
Кликните здесь для просмотра всего текста
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
 
#define MAX_THREADS 3
#define BUF_SIZE 255
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
void ErrorHandler(LPTSTR lpszFunction);
 
// Sample custom data structure for threads to use.
// This is passed by void pointer so it can be any data type
// that can be passed using a single void pointer (LPVOID).
typedef struct MyData {
    int val1;
    int val2;
} MYDATA, *PMYDATA;
 
 
int _tmain() /*пока неясен смысл всего мейна- понимаю, что создаются потоки, создается для них массив, а дальше непонятно*/
{
    PMYDATA pDataArray[MAX_THREADS];
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
 
    // Create MAX_THREADS worker threads.
 
    for( int i=0; i<MAX_THREADS; i++ )
    {
        // Allocate memory for thread data.
 
        pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                sizeof(MYDATA));
 
        if( pDataArray[i] == NULL )
        {
           // If the array allocation fails, the system is out of memory
           // so there is no point in trying to print an error message.
           // Just terminate execution.
            ExitProcess(2);
        }
 
        // Generate unique data for each thread to work with.
 
        pDataArray[i]->val1 = i;
        pDataArray[i]->val2 = i+100;
 
        // Create the thread to begin execution on its own.
 
        hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier 
 
 
        // Check the return value for success.
        // If CreateThread fails, terminate execution. 
        // This will automatically clean up threads and memory. 
 
        if (hThreadArray[i] == NULL) 
        {
           ErrorHandler(TEXT("CreateThread"));
           ExitProcess(3);
        }
    } // End of main thread creation loop.
 
    // Wait until all threads have terminated.
 
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
 
    // Close all thread handles and free memory allocations.
 
    for(int i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
        if(pDataArray[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, pDataArray[i]);
            pDataArray[i] = NULL;    // Ensure address is not reused.
        }
    }
 
    return 0;
}
 
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam ) /* Как работает эта функция? В чем суть ее многопоточного применения?*/
{ 
    HANDLE hStdout;
    PMYDATA pDataArray;
 
    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;
 
    // Make sure there is a console to receive output results. 
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;
 
    // Cast the parameter to the correct data type.
    // The pointer is known to be valid because 
    // it was checked for NULL before the thread was created.
 
    pDataArray = (PMYDATA)lpParam;
 
    // Print the parameter values using thread-safe functions.
 
    StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"), 
        pDataArray->val1, pDataArray->val2); 
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
    WriteConsole(hStdout, msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
 
    return 0; 
} 
 
 
 
void ErrorHandler(LPTSTR lpszFunction) 
{ 
   //...... аварийная функция
}

2) Затем мне это же надо будет сделать с помощью OpenMP, но у меня эта библиотека на работает на MS VS 2008 Express, подскажите пожалуйста, как можно ее вкрутить в студию экспресс?

Большое спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru