
2.2 Алгоритм роботи потоків
Після завершення виконання основних етапів побудови паралельного алгоритму, необхідно перейти до планування обчислень, тобто виконання розподілу задач по процесорам компютерної системи. Даний пункт виконується у відповідності з етапами, виконаними вище.
В цьому алгоритмі таблично описуються операції, що повинні виконуватися кожним з потоків багатопоточної програми: вводи та виводи даних, операції над ними та над самими потоками. У відповідності з отриманим алгоритмом вже програмно оформлюється код програми.
Розподіл задач між потоками дозволяє значно спростити процес написання програми, оскільки на цьому етпі вже стає видно помилки, допущені під час проектування, декомпозиції та об’єднання. Алгоритм роботи потоків заданої програми наведений у таблиці 2.1.
Таблиця 2.1 - Алгоритм роботи потоків
Tгол |
То |
Т1 |
Т2,Тк-1 |
1.Введення похибки
|
1.Ведення вектора Х |
1.Створення матриці МА |
1.Очикування То |
2.Введення розміру матриці |
2. Сигнал до Т1 |
2.Сигнал до Т0 |
2.Очикування Т1 |
3.Створення потоків |
3.Сигнал до Т2 |
3.Сигнал до Т2 |
2.Бар’єр |
4.Ініціалізація потоків і симафорів |
4.Очикування Т1 |
4.Очикування Т0 |
3.Обчислення |
5.Приєднання потоків- |
5.Бар’єр(за примером 5.2 лекции 5) |
5.Бар’єр |
4. Бар’єр |
6.Виведення результату |
6.Обчислення |
6.Обчислення |
|
|
7. .Бар’єр |
7. .Бар’єр |
|
Наступним і завершальним етапом після побудови паралельного алгоритму є безпосередньо програмна реалізація: огляд програмних засобів, які використовуються для розробки програми, визначення глобальних змінних, визначення функцій, які безпосередньо стосуються виконання завдання тощо.
ДОДАТКИ
Додаток А
Лістинг
послідовної програми
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
void main(){
int n, i, j, count = 0;
float **a, *b, *x, *tmp_x, exp, e;
printf("Введіть розміри ситеми:\n");
printf("n = ");
scanf("%i", &n);
a = (float**)malloc(n*sizeof(float*));
for(i = 0; i < n; i++){
a[i] = (float*)malloc(n*sizeof(float));
}
b = (float*)malloc(n*sizeof(float));
x = (float*)malloc(n*sizeof(float));
tmp_x = (float*)malloc(n*sizeof(float));
printf("Введіть коефіцієнти системи:\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
scanf("%f", &a[i][j]);
}
}
printf("Введіть вектор вільних елементів:\n");
for(i = 0; i < n; i++){
scanf("%f", &b[i]);
x[i] = 0;
}
printf("Введіть точність обчислення: ");
scanf("%f", &e);
do{
count++;
for(i = 0; i < n; i++){
tmp_x[i] = 0.0;
for(j = 0; j < n; j++){
if(i != j){
tmp_x[i] = tmp_x[i] + (a[i][j] * x[j]);
}
}
tmp_x[i] = (b[i] - tmp_x[i]) / a[i][i];
}
exp = 0;
for(i = 0; i < n; i++){
if(fabs(x[i] - tmp_x[i]) > exp){
exp = fabs(x[i] - tmp_x[i]);
}
x[i] = tmp_x[i];
}
}while(exp
>
e);
free(tmp_x);
for(i = 0; i < n; i++){
free(a[i]);
}
free(a);
free(b);
printf("Розвязок ситеми:\n");
for(i = 0; i < n; i++){
printf("x[%d] = %.6f\n", i+1, x[i]);
}
free(x);
}