102 / 93 / 36
Регистрация: 01.04.2013
Сообщений: 649
1

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

24.09.2013, 12:42. Показов 2207. Ответов 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;
}
Не вычисленными остаются последние элементы матрицы. Получается, что когда в каком-то из потоков счётчик достигает числа элементов матрицы, вычисления приостанавливаются во всех потоках?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2013, 12:42
Ответы с готовыми решениями:

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

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

Распараллеливание
Подскажите, что не так. Есть массив из 13 элементов, мне нужно разбить на три блока, один блок...

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

6
Заблокирован
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? - я думаю нет и в этом ошибка.

Мутекс надо захватывать непосредственно перед обращением к охраняемой области памяти, а не где захочется.
1
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
24.09.2013, 12:58 3
А ведь верно
достаточно захватить мьютекс считать значение count в лакальную переменную потока tcount например увеличить сount и освободить мьютекс. А в дальнейшем алгоритме использовать tcount вместо count таким образом поток застолбит нужную себе ячейку результирующей матрицы и позволит другим потокам обрабатывать отальные.
А я блин весь код лопатил вникал
2
102 / 93 / 36
Регистрация: 01.04.2013
Сообщений: 649
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);
                ......
вот так примерно? че-то результат такой же
0
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
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);
    ....
1
102 / 93 / 36
Регистрация: 01.04.2013
Сообщений: 649
24.09.2013, 13:31  [ТС] 6
Благодарю. Вроде всё заработало как надо. Даже не верится. Надо будет несколько раз проверить.
0
Заблокирован
24.09.2013, 21:19 7
Firework,
ну или можно было оставить все как есть, изменить только этот фрагмент:
C
1
2
3
4
if (tcount>=num_elements) {
  ReleaseMutex(hMutex);
  ExitThread(NULL);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2013, 21:19
Помогаю со студенческими работами здесь

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

Распараллеливание циклов
Доброго времени суток. Возникла необходимость распараллелить один численный алгоритм средствами...

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

Распараллеливание цикла
есть цикл for (unsigned n = 0; n &lt; threads; n++) { func (sigma, sub_noisy, sub_basic,...


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

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

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