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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.96
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
05.07.2011, 23:34     Распараллеливание #1
Всем добрый вечер.
Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с помощью одной строчке в коде,как я поняла это какая то функция,не подскажите?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
06.07.2011, 00:02     Распараллеливание #2
В стандартном С++ нет параллельных процессов.
Jupiter
06.07.2011, 00:05
  #3

Не по теме:

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
В стандартном С++ нет параллельных процессов.
в g++ под линем уже есть) а под виндой пока только через буст

ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
06.07.2011, 00:10     Распараллеливание #4
Ну, в Qt - тоже есть.
Но не понятно, что препод имел ввиду - одна строчка текста... О_о
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
06.07.2011, 00:11     Распараллеливание #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
sever1313,

Средствами OpenMP можно так..:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
omp_set_num_threads(omp_get_num_procs()); //устанавливаем количество потоков равным количеству доступных процессоров в системе
 
#pragma omp parallel for shared(result, matrix_1, matrix_2) private(i, j, k) schedule(static, N / omp_get_num_threds()) 
// устанавливаем перемножаемые и результирующую матрицу общими для всех потоков;
 //переменные i, j, k делаем частными, т.е. для каждого потока своя;
 //устанавливаем статическое планирование распределения итераций по потокам (делим общее число итераций на потоки),
 //каждый поток будет выполнять примерно одинаковое количество итераций
for (i = 0; i < N; i++)
{
   for (j = 0; j < N; j++)
   {
      result[i][j] = 0;
      for (k = 0; k < N; k++)
         result[i][j] += matrix_1[i][k] * matrix_2[k][j];
   }
}
C
1
#pragma omp parallel for shared(result, matrix_1, matrix_2) private(i, j, k) schedule(static, N / omp_get_num_threds())
Собственно одна строчка и задает распараллеливание;
Не забудьте подключить <omp.h>
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
06.07.2011, 00:43     Распараллеливание #6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
под виндой пока только через буст
А WinAPI морально-нравственные принципы использовать не позволяют?

sever1313, это почитайте...
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
06.07.2011, 00:59  [ТС]     Распараллеливание #7
Не много почитав информации,не понятны не которые вещи.
C++
1
omp_set_num_threads(omp_get_num_procs());
//устанавливаем количество потоков равным количеству доступных процессоров в системе
Что есть число процессоров(потоки)?
Если не трудно можно по подробнее,как это будет выглядеть?
теорию распараллеливания перемножения матриц просмотрела,пример видела.Но,что то не до поняла.
К примеру как зависит вычисление программы от заданного количества потоков?
я понимаю вопросы тупые,но всё же..
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,819
Завершенные тесты: 2
06.07.2011, 08:57     Распараллеливание #8
Цитата Сообщение от easybudda Посмотреть сообщение
А WinAPI морально-нравственные принципы использовать не позволяют?

sever1313, это почитайте...
Если не ошибаюсь распараллеливание - это когда одна часть алгоритма выполняется на одном процессоре, а другая часть - на другом процессоре. С помощью CreateThread можно создать потоки, но вот как указать на каком процессоре выполнять этот поток? Я думаю указать невозможно.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
06.07.2011, 09:38     Распараллеливание #9
Цитата Сообщение от Евгений М. Посмотреть сообщение
Если не ошибаюсь распараллеливание - это когда одна часть алгоритма выполняется на одном процессоре, а другая часть - на другом процессоре.
Если не ошибаюсь, распараллеливание - это когда один поток работает параллельно с другим, а то как бы это на компах с одним процессором многозадачность реализовывали? Так, что, соглашусь с ValeryLaptev,
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
не понятно, что препод имел ввиду - одна строчка текста...
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
06.07.2011, 15:20  [ТС]     Распараллеливание #10
Кто нибудь может мне на пальцах объяснить как происходит параллельное перемножение матриц,я не могу в этом разобраться,пожалуйста.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.07.2011, 15:59     Распараллеливание #11
гуглите ленточное перемножение матриц

Добавлено через 10 секунд
вот например http://www.hpcc.unn.ru/?dir=808

Добавлено через 1 минуту
Цитата Сообщение от easybudda Посмотреть сообщение
А WinAPI морально-нравственные принципы использовать не позволяют?
угу) если есть возможность заюзать объектную обертку то почему бы нет)
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
06.07.2011, 19:17     Распараллеливание #12
Цитата Сообщение от sever1313 Посмотреть сообщение
Кто нибудь может мне на пальцах объяснить как происходит параллельное перемножение матриц,я не могу в этом разобраться,пожалуйста.
Грубо говоря, сколько у матриц строк-столбцов - столько и тредов. На каждое значение матрицы-результата - отдельный тред получается. Одновременно работают столько, сколько у первой матрицы строк (у второй - столбцов).
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
22.07.2011, 12:38  [ТС]     Распараллеливание #13
Я написала с вашей помощью программу,но теперь не могу понять она работает или нет,считает то правильно,а как узнать за какое время выполнятся программа если не распараллеливать и наоборот.Ставлю time но он почему то постоянно выводит 0.
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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
 
#ifdef _DEBUG
#undef _DEBUG
#include <omp.h>
#define _DEBUG
#else
#include <omp.h>
#endif
 
using namespace std;
const int n=50;
const int k=50;
const int m=50;
int mas_3[k][m];
int umn_matr(int mas_1[n][k],int mas_2[k][m])
{
    omp_set_num_threads(omp_get_num_procs()); //устанавливаем количество потоков равным количеству доступных процессоров в системе
    #pragma omp parallel for shared(result, matrix_1, matrix_2) private(i, j, k) schedule(static, N / omp_get_num_threds()) 
    // устанавливаем перемножаемые и результирующую матрицу общими для всех потоков;
     //переменные i, j, k делаем частными, т.е. для каждого потока своя;
    //устанавливаем статическое планирование распределения итераций по потокам (делим общее число итераций на потоки),
    //каждый поток будет выполнять примерно одинаковое количество итераций
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            mas_3[i][j] = 0;
            for (int k = 0; k < n; k++)
            {
                mas_3[i][j] += mas_1[i][k] * mas_2[k][j];
            }
            printf(" %i ",mas_3[i][j]);
            
        }
        printf("\n");
    }
    return mas_3[k][m];
}
int main()
{   
    time_t start_time, stop_time;
    start_time=0;
    stop_time=0;
    
    int mas_1[n][k];
    int mas_2[k][m];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            mas_1[i][j]=rand()%3;
            mas_2[i][j]=rand()%3;
            printf(" %i",mas_1[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    time(&start_time);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf(" %i",mas_2[i][j]);
        }
        printf("\n");
    }
    time(&stop_time);
    printf("TIME   %d second\n", stop_time-start_time);
    umn_matr(mas_1,mas_2);
    
    getch();
}
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
22.07.2011, 12:51     Распараллеливание #14
sever1313, просто матрицы маленькие. Сделайте матрицы хотя бы 1000 на 1000
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
31.08.2011, 01:19  [ТС]     Распараллеливание #15
вернулась снова к этой проблеме,выяснилось что моя программа без распараллеливания выполняется за тоже самое время,разве так может быть?помогите разобраться.
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
include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
// #include <dos.h>
#define n 1000
#ifdef _DEBUG
#undef _DEBUG
#include <omp.h>
#define _DEBUG
#else
#include <omp.h>
#endif
void umn_matr(int **mas_1,int **mas_2,int **mas_3)
{
    int p=0;
    p=omp_get_num_procs();
    omp_set_num_threads(4);     // задаём количество параллельных процессов
    #pragma omp parallel for
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            mas_3[i][j] = 0;
            for (int k = 0; k < n; k++)
            {
                mas_3[i][j] += mas_1[i][k] * mas_2[k][j];
            }
        }
    }
}
int main()
{   
    using namespace std;
    setlocale(LC_ALL, "rus");
    clock_t start, end;
    int **mas_1=new int *[n];
    int **mas_2=new int *[n];
    int **mas_3=new int *[n];
    for (int i=0; i<n; i++) 
    {
        mas_1[i] = new int [n];
        mas_2[i] = new int [n];
        mas_3[i] = new int [n];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            mas_1[i][j]=rand()%3;
            mas_2[i][j]=rand()%3;
        }
    }
    start = clock();
    umn_matr(mas_1,mas_2,mas_3);
    end = clock()-start;
    printf("Время выполнения программы с использованием распараллеливания: %f\n",end/(double)CLOCKS_PER_SEC );
    delete[]mas_1;
    delete[]mas_2;
    delete[]mas_3;
    getch();
}
если убрать те самые строчки,где задается распараллеливание,то программа работает так же,без изменений,не быстрее и не медленнее.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 02:12     Распараллеливание #16
sever1313, а у вас нет в выводе компилятора ничего вроде этого:

Код
warning: ignoring #pragma omp parallel|
?
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
31.08.2011, 09:31     Распараллеливание #17
sever1313, если работаете в студии, то нужно включить поддержку openmp в свойствах проекта: Configuration Properties, C/C++, Language и изменить значение свойства OpenMP Support.
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
31.08.2011, 10:06     Распараллеливание #18
Цитата Сообщение от sever1313 Посмотреть сообщение
вернулась снова к этой проблеме,выяснилось что моя программа без распараллеливания выполняется за тоже самое время,разве так может быть?помогите разобраться.
если убрать те самые строчки,где задается распараллеливание,то программа работает так же,без изменений,не быстрее и не медленнее.
Распараллеливание работает, если в компе хотя бы два ядра.
Да, и включить поддержку OpenMP, как тут сказали уже.
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
31.08.2011, 11:21  [ТС]     Распараллеливание #19
вот характеристики моего ноутбука
AMD Turion(tm) 64 mobile
Technology MK-36
1.99 ГГц, 1,00 ГБ ОЗУ
тоесть если у меня одноядерный программа будет работать не правильно?

Добавлено через 1 минуту
openmp подключила,ведь компилятор распознает функции openmp в программе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 12:10     Распараллеливание
Еще ссылки по теме:

Распараллеливание через omp.h C++
Распараллеливание вычислений C++
Распараллеливание программы с библиотекой TBB C++
C++ Странное распараллеливание
Распараллеливание программы C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 12:10     Распараллеливание #20
Цитата Сообщение от sever1313 Посмотреть сообщение
тоесть если у меня одноядерный программа будет работать не правильно?
Да нет, правильно. Только распараллеливания не будет - всё будет крутиться в одном потоке.

Добавлено через 2 минуты
Вот тут можно почитать про OpenMP (англ.)
Yandex
Объявления
31.08.2011, 12:10     Распараллеливание
Ответ Создать тему
Опции темы

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