Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/125: Рейтинг темы: голосов - 125, средняя оценка - 4.98
0 / 0 / 1
Регистрация: 23.11.2009
Сообщений: 61
1

Распараллеливание

05.07.2011, 23:34. Показов 24694. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер.
Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с помощью одной строчке в коде,как я поняла это какая то функция,не подскажите?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2011, 23:34
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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

0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
06.07.2011, 00:10 4
Ну, в Qt - тоже есть.
Но не понятно, что препод имел ввиду - одна строчка текста... О_о
0
Эксперт С++
342 / 306 / 36
Регистрация: 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
06.07.2011, 00:43 6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
под виндой пока только через буст
А WinAPI морально-нравственные принципы использовать не позволяют?

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

sever1313, это почитайте...
Если не ошибаюсь распараллеливание - это когда одна часть алгоритма выполняется на одном процессоре, а другая часть - на другом процессоре. С помощью CreateThread можно создать потоки, но вот как указать на каком процессоре выполнять этот поток? Я думаю указать невозможно.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
06.07.2011, 09:38 9
Цитата Сообщение от Евгений М. Посмотреть сообщение
Если не ошибаюсь распараллеливание - это когда одна часть алгоритма выполняется на одном процессоре, а другая часть - на другом процессоре.
Если не ошибаюсь, распараллеливание - это когда один поток работает параллельно с другим, а то как бы это на компах с одним процессором многозадачность реализовывали? Так, что, соглашусь с ValeryLaptev,
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
не понятно, что препод имел ввиду - одна строчка текста...
0
0 / 0 / 1
Регистрация: 23.11.2009
Сообщений: 61
06.07.2011, 15:20  [ТС] 10
Кто нибудь может мне на пальцах объяснить как происходит параллельное перемножение матриц,я не могу в этом разобраться,пожалуйста.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
06.07.2011, 15:59 11
гуглите ленточное перемножение матриц

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

Добавлено через 1 минуту
Цитата Сообщение от easybudda Посмотреть сообщение
А WinAPI морально-нравственные принципы использовать не позволяют?
угу) если есть возможность заюзать объектную обертку то почему бы нет)
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
06.07.2011, 19:17 12
Цитата Сообщение от sever1313 Посмотреть сообщение
Кто нибудь может мне на пальцах объяснить как происходит параллельное перемножение матриц,я не могу в этом разобраться,пожалуйста.
Грубо говоря, сколько у матриц строк-столбцов - столько и тредов. На каждое значение матрицы-результата - отдельный тред получается. Одновременно работают столько, сколько у первой матрицы строк (у второй - столбцов).
1
0 / 0 / 1
Регистрация: 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
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
22.07.2011, 12:51 14
sever1313, просто матрицы маленькие. Сделайте матрицы хотя бы 1000 на 1000
0
0 / 0 / 1
Регистрация: 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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 02:12 16
sever1313, а у вас нет в выводе компилятора ничего вроде этого:

Код
warning: ignoring #pragma omp parallel|
?
1
Эксперт С++
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
31.08.2011, 09:31 17
sever1313, если работаете в студии, то нужно включить поддержку openmp в свойствах проекта: Configuration Properties, C/C++, Language и изменить значение свойства OpenMP Support.
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
31.08.2011, 10:06 18
Цитата Сообщение от sever1313 Посмотреть сообщение
вернулась снова к этой проблеме,выяснилось что моя программа без распараллеливания выполняется за тоже самое время,разве так может быть?помогите разобраться.
если убрать те самые строчки,где задается распараллеливание,то программа работает так же,без изменений,не быстрее и не медленнее.
Распараллеливание работает, если в компе хотя бы два ядра.
Да, и включить поддержку OpenMP, как тут сказали уже.
1
0 / 0 / 1
Регистрация: 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 в программе.
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 12:10 20
Цитата Сообщение от sever1313 Посмотреть сообщение
тоесть если у меня одноядерный программа будет работать не правильно?
Да нет, правильно. Только распараллеливания не будет - всё будет крутиться в одном потоке.

Добавлено через 2 минуты
Вот тут можно почитать про OpenMP (англ.)
1
31.08.2011, 12:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2011, 12:10
Помогаю со студенческими работами здесь

Распараллеливание программы
Помогите эту последовательную программу распараллелить на параллельных 2 процесса. #include...

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

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

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


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

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