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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
SLaFko_0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 35
29.04.2012, 13:32     Перемножения матриц с OpenMP дольше чем... #1
Здравствуйте!
Написал 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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.04.2012, 15:47     Перемножения матриц с OpenMP дольше чем... #2
а какие результаты на 10000 и 100000 и более?
SLaFko_0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 35
29.04.2012, 16:01  [ТС]     Перемножения матриц с OpenMP дольше чем... #3
оу, не пробовал, при 1000х1000 примерно 45 минут выполняется вывод результирующей матрицы..страшно представить сколько при 100000
то есть результат будет виден при еще большем количестве элементов?
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.04.2012, 16:06     Перемножения матриц с OpenMP дольше чем... #4
SLaFko_0, а вы не выводите матрицу на экран, выводите только время, операции ввода/вывода забирают много времени

Не по теме:

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

SLaFko_0
0 / 0 / 0
Регистрация: 27.02.2010
Сообщений: 35
29.04.2012, 16:07  [ТС]     Перемножения матриц с OpenMP дольше чем... #5
попробуем-с))
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
29.04.2012, 17:20     Перемножения матриц с OpenMP дольше чем... #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
VTsaregorodtsev
303 / 283 / 38
Регистрация: 19.02.2010
Сообщений: 1,227
30.04.2012, 21:37     Перемножения матриц с OpenMP дольше чем... #7
grizlik78, Это астрономическое время получилось меньше (из-за распараллеливания). Затраченное же процессором физическое время одинаково в обоих случаях. Ибо 3.46544сек*1.76загрузкиЦПУ=6.10сек. Разница в одну сотую (6.10 вместо 6.11) - скорее всего из-за использования Л1,Л2-кэшей второго ядра процессора.
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
30.04.2012, 22:06     Перемножения матриц с OpenMP дольше чем... #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


Медленнее? Да, конечно. Калькуляторы? Мне так не кажется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2012, 01:23     Перемножения матриц с OpenMP дольше чем...
Еще ссылки по теме:

Алгоритм Штрассена для быстрого перемножения матриц C++
C++ Перемножение матриц блоками. OpenMP
Переделать программу перемножения матриц с использованием указателей C++
C++ Функция перемножения матриц выдает неверный результат
Оптимизация алгоритма перемножения двух матриц C++

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

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.05.2012, 01:23     Перемножения матриц с OpenMP дольше чем... #9
> 6.95679 seconds
> 1.80312 seconds
Yandex
Объявления
01.05.2012, 01:23     Перемножения матриц с OpenMP дольше чем...
Ответ Создать тему
Опции темы

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