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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.96
sever1313
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 61
#1

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

05.07.2011, 23:34. Просмотров 9612. Ответов 20
Метки нет (Все метки)

Всем добрый вечер.
Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с помощью одной строчке в коде,как я поняла это какая то функция,не подскажите?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2011, 23:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание (C++):

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

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

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

Распараллеливание вычислений - C++
Вычисляю произведение матриц несколькими потоками (количество задаётся пользователем). Потоки "засыпают" на 1 мс. При вычислении...

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

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

20
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.07.2011, 00:02 #2
В стандартном С++ нет параллельных процессов.
0
Jupiter
06.07.2011, 00:05
  #3

Не по теме:

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

0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.07.2011, 00:10 #4
Ну, в Qt - тоже есть.
Но не понятно, что препод имел ввиду - одна строчка текста... О_о
0
nameless
Эксперт С++
334 / 298 / 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>
4
easybudda
Модератор
Эксперт CЭксперт С++
9680 / 5630 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
06.07.2011, 00:43 #6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
под виндой пока только через буст
А WinAPI морально-нравственные принципы использовать не позволяют?

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от easybudda Посмотреть сообщение
А WinAPI морально-нравственные принципы использовать не позволяют?
угу) если есть возможность заюзать объектную обертку то почему бы нет)
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.07.2011, 19:17 #12
Цитата Сообщение от sever1313 Посмотреть сообщение
Кто нибудь может мне на пальцах объяснить как происходит параллельное перемножение матриц,я не могу в этом разобраться,пожалуйста.
Грубо говоря, сколько у матриц строк-столбцов - столько и тредов. На каждое значение матрицы-результата - отдельный тред получается. Одновременно работают столько, сколько у первой матрицы строк (у второй - столбцов).
1
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();
}
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
22.07.2011, 12:51 #14
sever1313, просто матрицы маленькие. Сделайте матрицы хотя бы 1000 на 1000
0
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();
}
если убрать те самые строчки,где задается распараллеливание,то программа работает так же,без изменений,не быстрее и не медленнее.
0
31.08.2011, 01:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 01:19
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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