Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/37: Рейтинг темы: голосов - 37, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 36
1

Перемножения матриц с OpenMP дольше чем...

29.04.2012, 13:32. Просмотров 6953. Ответов 8
Метки нет (Все метки)

Здравствуйте!
Написал 2 программы перемножения матриц, одну с использованием OpenMP, другую - просто.
2 матрицы 1000х1000 с использованием OpenMP высчитываются дольше.
Процессор Intel Atom N570, поддержка OpenMP в проекте включена.
Собственно, вопрос: почему дольше и что не так сделал?
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
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <clocale>
#include <omp.h>
#include <iomanip>
using namespace std;
int main() 
{
    setlocale(LC_ALL,"russian");
    double t1,t2,dt;
    t1=omp_get_wtime();
    int n;
    int i,j,k;
    cout << "Введите размерность матриц А и В " ;
    cin >> n;
 
    int **a=new int *[n];
    for (int k=0;k<n;k++)
        a[k]=new int [n];
 
    int **b=new int *[n];
    for (int k=0;k<n;k++)
        b[k]=new int [n];
 
    int **c=new int *[n];
    for (int k=0;k<n;k++)
        c[k]=new int [n];
 
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++)
            a[i][j]=rand()%10; }
 
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++)
            b[i][j]=rand()%10; }
/*  
    cout << endl;
    cout << "Матрица А: " << endl;
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++)
            cout << a[i][j] << " ";
        cout << endl; }
 
    cout << endl;
    cout << "Матрица В: " << endl;
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++)
            cout << b[i][j] << " ";
        cout << endl; }*/
 
    omp_set_num_threads(omp_get_num_procs());
    
    #pragma omp parallel for shared(c, a, b) private(i, j, k) schedule(static, n / omp_get_num_threads()) 
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            c[i][j] = 0;
                for (int k = 0; k < n; k++)
                    c[i][j] += a[i][k] * b[k][j]; } }
    
    cout << endl;
    cout << "Матрица С: " << endl;
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) 
            cout<<setw(4) << c[i][j] << " ";
        cout << endl; }
    
    t2=omp_get_wtime();
    dt=t2-t1;
    cout << "Runtime = " << dt << " seconds " << endl;
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2012, 13:32
Ответы с готовыми решениями:

Функция перемножения матриц, с классом для выражения матриц
Вот поставленная задача: Написать функцию, которая будет вычислять произведению двух матриц, или...

OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там...

Алгоритм перемножения матриц
Вот код, что я делаю не так??? вроде все правильно написал, сможет кто помочь? import numpy as...

Ошибка перемножения матриц
столкнулся с ошибкой перемножения матриц и не знаю в чем засада! Умножаю НормаРасходаТР(157;35) *...

8
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.04.2012, 15:47 2
а какие результаты на 10000 и 100000 и более?
0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 36
29.04.2012, 16:01  [ТС] 3
оу, не пробовал, при 1000х1000 примерно 45 минут выполняется вывод результирующей матрицы..страшно представить сколько при 100000
то есть результат будет виден при еще большем количестве элементов?
0
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.04.2012, 16:06 4
SLaFko_0, а вы не выводите матрицу на экран, выводите только время, операции ввода/вывода забирают много времени

Не по теме:

Цитата Сообщение от SLaFko_0 Посмотреть сообщение
45 минут
Цитата Сообщение от SLaFko_0 Посмотреть сообщение
Intel Atom
это ж калькулятор:D

1
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 36
29.04.2012, 16:07  [ТС] 5
попробуем-с))
0
Эксперт С++
2119 / 1558 / 231
Регистрация: 29.05.2011
Сообщений: 3,236
29.04.2012, 17:20 6
Если интересно, то вот результаты на моём двухядерном E6600, linux/x86_64, GCC 4.5.3
(вывод матрицы выкинул)

OpenMP используется:
$ g++ -DNDEBUG -O3 -fopenmp mult.cpp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 3.46544 seconds

6.13user 0.03system 0:03.50elapsed 176%CPU (0avgtext+0avgdata 53200maxresident)k
0inputs+0outputs (0major+3388minor)pagefaults 0swaps


OpenMP не используется:
$ g++ -DNDEBUG -O3 mult.cpp -lgomp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 6.1084 seconds

6.08user 0.04system 0:06.14elapsed 99%CPU (0avgtext+0avgdata 53136maxresident)k
0inputs+0outputs (0major+3384minor)pagefaults 0swaps


результат, как видно, почти в 2 раза отличается в пользу OpenMP
2
952 / 891 / 133
Регистрация: 19.02.2010
Сообщений: 2,810
30.04.2012, 21:37 7
grizlik78, Это астрономическое время получилось меньше (из-за распараллеливания). Затраченное же процессором физическое время одинаково в обоих случаях. Ибо 3.46544сек*1.76загрузкиЦПУ=6.10сек. Разница в одну сотую (6.10 вместо 6.11) - скорее всего из-за использования Л1,Л2-кэшей второго ядра процессора.
0
Эксперт С++
2119 / 1558 / 231
Регистрация: 29.05.2011
Сообщений: 3,236
30.04.2012, 22:06 8
VTsaregorodtsev, спасибо, конечно, но суть OpenMP как-раз в распараллеливании. В чудеса-то я давно не верю
Просто распараллеливание получается почти-что бесплатно, без необходимости вручную создавать потоки, думать о синхронизации и так далее. Жаль только, что распараллеливаются только простые конструкции.

Добавлено через 10 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
это ж калькулятор
Кстати, про калькуляторы Я тут вспомнил, что у меня есть Atom N270 и Atom D510.

N270 (2 потока: одно ядро + гипертрейдинг)

С OpenMP
$ g++ -DNDEBUG -O3 -fopenmp mult.cpp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 22.6136 seconds

44.84user 0.04system 0:22.86elapsed 196%CPU (0avgtext+0avgdata 52352maxresident)k
0inputs+0outputs (0major+3338minor)pagefaults 0swaps


Без OpenMP
$ g++ -DNDEBUG -O3 mult.cpp -lgomp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 35.6496 seconds

35.83user 0.05system 0:35.89elapsed 99%CPU (0avgtext+0avgdata 52304maxresident)k
0inputs+0outputs (0major+3335minor)pagefaults 0swaps


D510 (4 потока: 2 ядра + гипертрейдинг)

С OpenMP
$ g++ -DNDEBUG -O3 -fopenmp mult.cpp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 8.16212 seconds

32.81user 0.03system 0:08.38elapsed 391%CPU (0avgtext+0avgdata 52384maxresident)k
0inputs+0outputs (0major+3332minor)pagefaults 0swaps


Без OpenMP
$ g++ -DNDEBUG -O3 mult.cpp -lgomp
$ echo 1000 | /usr/bin/time ./a.out
Введите размерность матриц А и В Runtime = 24.0335 seconds

24.23user 0.02system 0:24.26elapsed 99%CPU (0avgtext+0avgdata 52304maxresident)k
0inputs+0outputs (0major+3324minor)pagefaults 0swaps


Медленнее? Да, конечно. Калькуляторы? Мне так не кажется
1
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.05.2012, 01:23 9
> 6.95679 seconds
> 1.80312 seconds
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2012, 01:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Оптимизация перемножения матриц
В конечном итоге нужно получить результат не менее 2500 (самый последний вывод). Вот код: ...

Функция перемножения матриц.
Функция mult, прошу помощи, ибо не пойму в чем ошибка. #include &lt;iostream&gt; #include &lt;math.h&gt;...

Оператор перемножения матриц
не работает оператор* двух матриц, никак не могу понять как сделать так, чтобы в операторе была уже...

Программа перемножения 2 матриц
ДОброго времени суток прошу помочь написать программу перемножения 2 матриц,матрицы вводятся с...


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

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

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