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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
SLaFko_0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 35
#1

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

29.04.2012, 13:32. Просмотров 2867. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2012, 13:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перемножения матриц с OpenMP дольше чем... (C++):

Какой максимальный размер матриц можно задать для перемножения? - C++
Привет кодеры! Тут вопрос такой. Решил я перемножить матрицы и заинтересовался какой максимальный допустимый размер матрицы я могу задать...

Написать алгоритм для перемножения скобок вида (4-А)* (3-А) - C++ Builder
Нужно написать алгоритм для перемножения скобок вида (4-А)*(3-А). Причем таких скобок может быть больше, и всегда в скобках вычитается А....

OpenMP - Visual C++
здравствуйте, народ я делал консольное приложение с openmp, решил вот красиво оформить в формочку, а тут ошибка Command line error...

Загадка перемножения матрицы на вектор с применением nVidia CUDA - Visual C++
Загадка перемножения матрицы на вектор с применением nVidia CUDA/ http://landwatersun.ru/viewtopic.php?id=170

OpenMP. Время выполнения программы больше чем без OpenMP - C++
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там сказано:&quot;Директива #pragma omp for...

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

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

Не по теме:

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

1
SLaFko_0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 35
29.04.2012, 16:07  [ТС] #5
попробуем-с))
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
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
VTsaregorodtsev
361 / 343 / 50
Регистрация: 19.02.2010
Сообщений: 1,453
30.04.2012, 21:37 #7
grizlik78, Это астрономическое время получилось меньше (из-за распараллеливания). Затраченное же процессором физическое время одинаково в обоих случаях. Ибо 3.46544сек*1.76загрузкиЦПУ=6.10сек. Разница в одну сотую (6.10 вместо 6.11) - скорее всего из-за использования Л1,Л2-кэшей второго ядра процессора.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
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
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.05.2012, 01:23 #9
> 6.95679 seconds
> 1.80312 seconds
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2012, 01:23
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
01.05.2012, 01:23
Ответ Создать тему
Опции темы

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