Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 06.01.2011
Сообщений: 17
1

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

23.11.2012, 02:02. Показов 3601. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые коллеги.

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

Большое спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2012, 02:02
Ответы с готовыми решениями:

Бинарные числа! Перевод простого числа в бираное и расчет.
Здравствуйте!Я понимаю, что моя просьба банальна, но я правда не могу никак разобраться с бинарными...

Многопоточный расчет
Добрый день! Написал такую программу private void Btn_Eval_Click(object sender, EventArgs e) ...

Расчет числа пи.
Здравствуйте. Хочу расчитать число пи, которое равняется 3,1415926535897932384626433832795…....

Расчет апроксимации числа Пи
In this exercise we will calculate an approximation of π (Pi). The technique is as follows:...

0
23.11.2012, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2012, 02:02
Помогаю со студенческими работами здесь

Расчет палиндрома числа 89
Всем привет. Ребят всю голову сломал, решая задачу - поиска бага в очередной итерации (если быть...

Расчет цикломатического числа
Привет, форумчане! Делал себе дискетку и внезапно(!) наткнулся на непонятные мне действия. Суть...

Расчет числа Шредера
Получается посчитать только до 18-го числа последовательности, нужно до 1000 Вот код: private...

Расчет факториала натурального числа n
Помогите, пожалуйста.. Составить программу для расчета факториала натурального числа n (факториал...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru