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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Firework
60 / 84 / 23
Регистрация: 01.04.2013
Сообщений: 584
#1

Распараллеливание вычислений - C++

24.09.2013, 12:42. Просмотров 920. Ответов 6
Метки нет (Все метки)

Вычисляю произведение матриц несколькими потоками (количество задаётся пользователем).
Потоки "засыпают" на 1 мс.
При вычислении матриц размерами больше 5 проблем не возникает. А вот при вычислении матриц размерами 3х4, 2х4
остаются не вычисленные элементы.
Когда я убираю Sleep(), то вычисления происходят нормально, но при малых размерах матрицы только одним потоком.
Вот код моей функции, адрес которой я передаю потокам для вычисления элементов матрицы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DWORD WINAPI thread_func(LPVOID Param)
{
    while (count < num_elements) {
        dwWaitResult = WaitForSingleObject( hMutex, INFINITE );
        int i = count/cols;
        if (i >= cols) {
            ExitThread(NULL);
            return 0;
        }
        int j = q%k;
        M3[i][j] = 0;
        for (int g = 0; g < rows; ++g) {
            M3[i][j] += M1[i][g] * M2[g][j]; 
        }
        ++count;  // счётчик элементов матрицы
        ReleaseMutex(hMutex);
        Sleep(1);
    }
    return 0;
}
Не вычисленными остаются последние элементы матрицы. Получается, что когда в каком-то из потоков счётчик достигает числа элементов матрицы, вычисления приостанавливаются во всех потоках?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 12:42     Распараллеливание вычислений
Посмотрите здесь:

Распараллеливание вычислений - C++
Здравствуйте. Может кто сможет подсказать как мне решить следующую задачу: необходимо распараллелить следующий последовательный код:...

Распараллеливание - C++
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с...

распараллеливание - C++
Скажите, кто-нибудь занимался распараллеливанием в си++? В моих попытках что-либо распараллелить через omp все выходило только в несколько...

Распараллеливание алгоритмов - C++
Доброго дня всем. Встал вопрос о выборе темы,связанной с распараллеливанием алгоритмов. Какие задачи наиболее &quot;восприимчивы&quot; к...

Странное распараллеливание - C++
Добрый вечер, коллеги. У меня следующая проблема. Преподаватель сказал распараллелить программу, обрабатывающую изображения в папке....

Распараллеливание программы - C++
Помогите эту последовательную программу распараллелить на параллельных 2 процесса. #include &lt;iostream&gt; #include&lt;thread&gt; using...

Распараллеливание циклов - C++
Возникли трудности с освоением OpenMP Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
24.09.2013, 12:51     Распараллеливание вычислений #2
C
1
2
3
4
5
6
dwWaitResult = WaitForSingleObject( hMutex, INFINITE );
        int i = count/cols;
        if (i >= cols) {
            ExitThread(NULL);
            return 0;
        }
если у какого-то потока выполнится условие, он освободит мутекс при выполнении ExitThread? - я думаю нет и в этом ошибка.

Мутекс надо захватывать непосредственно перед обращением к охраняемой области памяти, а не где захочется.
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
24.09.2013, 12:58     Распараллеливание вычислений #3
А ведь верно
достаточно захватить мьютекс считать значение count в лакальную переменную потока tcount например увеличить сount и освободить мьютекс. А в дальнейшем алгоритме использовать tcount вместо count таким образом поток застолбит нужную себе ячейку результирующей матрицы и позволит другим потокам обрабатывать отальные.
А я блин весь код лопатил вникал
Firework
60 / 84 / 23
Регистрация: 01.04.2013
Сообщений: 584
24.09.2013, 13:05  [ТС]     Распараллеливание вычислений #4
C++
1
2
3
4
5
6
7
8
DWORD WINAPI calculate (LPVOID lpdwThreadParam)
{
    //dwWaitResult = WaitForSingleObject( hMutex, INFINITE );
    while (count < num_elements) {
        int tcount = count;
        ++count;
        ReleaseMutex(hMutex);
                ......
вот так примерно? че-то результат такой же
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
24.09.2013, 13:21     Распараллеливание вычислений #5
Я бы изменил так
C++
1
2
3
4
5
6
7
8
9
DWORD WINAPI calculate (LPVOID lpdwThreadParam)
{
    
    while (true)
    dwWaitResult = WaitForSingleObject( hMutex, INFINITE );
    int tcount = count++;
        ReleaseMutex(hMutex);
    if (tcount>=num_elements) ExitThread(NULL);
    ....
Firework
60 / 84 / 23
Регистрация: 01.04.2013
Сообщений: 584
24.09.2013, 13:31  [ТС]     Распараллеливание вычислений #6
Благодарю. Вроде всё заработало как надо. Даже не верится. Надо будет несколько раз проверить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 21:19     Распараллеливание вычислений
Еще ссылки по теме:

Распараллеливание через omp.h - C++
// labaOMP.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;omp.h&gt; ...

Распараллеливание арифметических выражений - C++
Здравствуйте. Есть задача - распараллелить вычисление арифмитического выражения, подобное виду (a+b)+(c+(d+e+f))+h т.е....

Распараллеливание с помощью OpenMP - C++
Здравствуйте, уважаемые участники форума! Имеется цикл вида:for (i=1; i&lt;number; i++) { do something; }Цикл выполняется...

Распараллеливание циклов с ипользованием OpenMP - C++
Есть проблема , получился парадокс - время роботы программы с распараллеливанием дольше на 1 сек чем без распараллеливания, ожидалось...

Распараллеливание программы с библиотекой TBB - C++
Всем Привет! Пытаюсь распараллелить программу, которая совершает сортировку, посмотрел в интернете много разных примеров, получилось...


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

Или воспользуйтесь поиском по форуму:
rrrFer
Заблокирован
24.09.2013, 21:19     Распараллеливание вычислений #7
Firework,
ну или можно было оставить все как есть, изменить только этот фрагмент:
C
1
2
3
4
if (tcount>=num_elements) {
  ReleaseMutex(hMutex);
  ExitThread(NULL);
}
Yandex
Объявления
24.09.2013, 21:19     Распараллеливание вычислений
Ответ Создать тему
Опции темы

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