2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
1

Параллельное приложение

17.01.2017, 00:27. Показов 1509. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Хотела бы спросить, может, кто знает, как лучше реализовать следующую задачу.
Имеется 3 метода: первый читает текстовый файл с числовой матрицей, второй производит вычисления (находит среднее каждой строки матрицы), а третий - выводит результат в новый текстовый файл.
Суть в том, чтобы реализовать данную задачу параллельно. Да, по факту, задача исключительно последовательная, но хотелось бы распараллелить по частям, на сколько это возможно. Естественно, со смещением, то есть второй метод не сможет сразу работать параллельно без данных от первого и т.д.
Может быть, можно как-то это реализовать, используя мьютекс или критические секции... плохо знакома с функциями API для параллельного программирование. Подскажите, если не сложно.

Просто методы приложения.
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
double** Reading()
{
    ifstream inp("D:\\test\m.txt");
    int m, n;
    n = 50;
    m = 50;
    inp >> m >> n;
    double **arr;
    arr = new double*[m];
    for (int i = 0; i<m; i++)
    {
        arr[i] = new double[n];
        for (int j = 0; j<n; j++)
        {
            inp >> arr[i][j];
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
 
double* Calculation(double** x, int k, int l)
{
    double *arr;
    arr = new double[l];
    double d;
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < l; j++)
        {
            d = d + x[i][j];
        }
        arr[i] = d;
    }
    return arr;
}
 
void Write(double* arr, int k)
{
    fstream f;
    f.open("C://test.txt", fstream::in | fstream::out);
 
    for (int i = 0; i < 4; i++)
        f << arr[i] << endl;
    f.close();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2017, 00:27
Ответы с готовыми решениями:

Параллельное вычисление
Необходимо реализовать последовательный и параллельный алгоритм вычисления факториала N!. Есть...

Параллельное действие
Как сделать действие параллельным? Если например сделать что бы слово всегда меняло цвет, то...

Межпроцессное взаимодействие и параллельное программирование. Литература
Доброго времени суток. Собственно просьба видна из заголовка треда. Прошу порекомендовать хорошие...

Расчёт значения функции, параллельное программирование
Добрый вечер! Требуется параллельно вычислить значение функции из третьего варианта. У меня был...

4
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
17.01.2017, 15:22 2
Цитата Сообщение от Аруми Посмотреть сообщение
параллельного программирование
параллельного или многопоточного? это не одно и то же.
хотя, думается мне, исходя из того, что вы писали, имелась ввиду многопоточность.
Цитата Сообщение от Аруми Посмотреть сообщение
плохо знакома с функциями API
почему не использовать средства организации многопоточности стандартной библиотеки С++ (С++11/14)? в ней есть такие полезности. или вам win api и баста?
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
17.01.2017, 16:13  [ТС] 3
retmas, тогда, полагаю, правда ошиблась) пусть будет многопоточностью))
и, да, мне нужно именно с помощью winapi реализовать
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
18.01.2017, 02:14 4
без проверок и обработки ошибок. и вообще хз, не проверял, не запускал. проверяйте
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
127
128
129
130
131
132
133
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <queue>
#include <numeric>
#include <iterator>
#include <vector>
#include <windows.h>
 
using value_queue_t = std::queue<double>;
using array_queue_t = std::queue<std::vector<double>>;
 
array_queue_t array_queue;
CRITICAL_SECTION arr_queue_sc;
HANDLE arr_queue_sem;
 
value_queue_t sum_queue;
CRITICAL_SECTION sum_queue_cs;
HANDLE sum_queue_sem;
 
DWORD WINAPI read_file(PVOID p)
{
    std::ifstream inp(static_cast<const char*>(p));
    std::istringstream iss;
    std::string line;
    
    while(std::getline(inp, line))
    {
        iss.clear();
        iss.str(line);
        std::istream_iterator<value_queue_t::value_type> beg(iss), end;
        
        EnterCriticalSection(&arr_queue_sc);
        array_queue.emplace(beg, end);
        ReleaseSemaphore(arr_queue_sem, 1, NULL);
        LeaveCriticalSection(&arr_queue_sc);
    }
    
    EnterCriticalSection(&arr_queue_sc);
    ReleaseSemaphore(arr_queue_sem, 1, NULL);
    LeaveCriticalSection(&arr_queue_sc);
    return 0;
}
 
DWORD WINAPI do_calc(PVOID)
{
    bool finished = false;
    
    while(!finished)
    {
        array_queue_t::value_type arr;
        
        WaitForSingleObject(arr_queue_sem, INFINITE);
        
        EnterCriticalSection(&arr_queue_sc);
        if(array_queue.empty())
        {
            finished = true;
            LeaveCriticalSection(&arr_queue_sc);
            continue;
        }
        arr.swap(array_queue.front());
        array_queue.pop();
        LeaveCriticalSection(&arr_queue_sc);
 
        value_queue_t::value_type sum = std::accumulate(arr.begin(), arr.end(),
                                                        value_queue_t::value_type());
        
        EnterCriticalSection(&sum_queue_cs);
        sum_queue.push(sum);
        ReleaseSemaphore(sum_queue_sem, 1, NULL);
        LeaveCriticalSection(&sum_queue_cs);
    }
    
    EnterCriticalSection(&sum_queue_cs);
    ReleaseSemaphore(sum_queue_sem, 1, NULL);
    LeaveCriticalSection(&sum_queue_cs);
    return 0;
}
 
DWORD WINAPI write_file(PVOID p)
{
    std::ofstream out(static_cast<const char*>(p));
    bool finished = false;
    
    while(!finished)
    {
        value_queue_t::value_type val;
 
        WaitForSingleObject(sum_queue_sem, INFINITE);
        
        EnterCriticalSection(&sum_queue_cs);
        if(sum_queue.empty())
        {
            finished = true;
            LeaveCriticalSection(&sum_queue_cs);
            continue;
        }
        val = sum_queue.front();
        sum_queue.pop();
        LeaveCriticalSection(&sum_queue_cs);
 
        out << val << ' ';
    }
    return 0;
}
 
int main()
{
    const int thr_num = 3;
    HANDLE threads[thr_num]{};
    const char input_file[]{"input.txt"};
    const char output_file[]{ "output.txt" };
 
    InitializeCriticalSection(&arr_queue_sc);
    InitializeCriticalSection(&sum_queue_cs);
    arr_queue_sem = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
    sum_queue_sem = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
 
    threads[0] = CreateThread(NULL, 0, read_file, (PVOID)input_file, 0, NULL);
    threads[1] = CreateThread(NULL, 0, do_calc, NULL, 0, NULL);
    threads[2] = CreateThread(NULL, 0, write_file, (PVOID)output_file, 0, NULL);
 
    WaitForMultipleObjects(thr_num, threads, TRUE, INFINITE);
    DeleteCriticalSection(&arr_queue_sc);
    DeleteCriticalSection(&sum_queue_cs);
    CloseHandle(arr_queue_sem);
    CloseHandle(sum_queue_sem);
    for(int i = 0; i < thr_num; ++i)
        CloseHandle(threads[i]);
    return 0;
}
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
18.01.2017, 22:17  [ТС] 5
retmas, а не могли бы вы прокомментировать данный вариант кода? пожалуйста)

Добавлено через 4 часа 17 минут
со всем разобралась, всё работает, спасибо)
0
18.01.2017, 22:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2017, 22:17
Помогаю со студенческими работами здесь

Параллельное программирование, задание процессу определенного ядра в процессоре
Привет ребят!! проблема такая, перерыл интернет и не могу разобраться в двух функциях .. Я начал...

Параллельное программирование: явным образом задать процессу определенное ядро
Привет ребят!! проблема такая, перерыл интернет и не могу разобраться в двух функциях .. Я начал...

Запустить приложение, и получить результат, который вернуло отработавшее приложение
Всем привет! Народ подскажите апишку(ки) для реализации следующей задачи. Мне нужно проверить...

Параллельное программирование
Посоветуйте книги\материальі по параллельному программированию на С\С++(можна и на C#). Нужно...


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

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

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