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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
#1

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

13.05.2013, 18:04. Просмотров 2075. Ответов 16
Метки нет (Все метки)

Скажите, кто-нибудь занимался распараллеливанием в си++? В моих попытках что-либо распараллелить через omp все выходило только в несколько раз медленнее. По сути у меня 8 ядер на ноуте, но их задействовать что-то не получается. По большей степени мне надо распараллеливать циклы. Если кто-то баловался этим, то помогите мне рабочим примером.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 18:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос распараллеливание (C++):

Распараллеливание - C++
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с...

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

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

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

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

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

16
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
13.05.2013, 18:21 #2
тебе нужна многопоточность, вообще многопроцессорность, но почитай про многопоточность))
0
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 18:34 #3
Можете описать на конкретных примерах, что именно не получается ?
0
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2013, 18:39 #4
mat_for_c, Мне 1 раз надо было сделать прекальк расстановки магарадж, так вот я врубил 8 процессов независимых и даже не парился с openmp, кстати в omp нужно очень аккуратно.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
13.05.2013, 19:00  [ТС] #5
Цитата Сообщение от Убежденный Посмотреть сообщение
Можете описать на конкретных примерах, что именно не получается ?
Например, мне можно распараллелить следующий цикл:
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma omp parallel for
    for (i = 0; i < col_count - 1; ++i) {
        Mw[i].resize(indexW_size);
        Mnw[i].resize(indexnW_size);
        for (j = 0; j < maximum_index; ++j) {
            if (j < indexW_size)
                Mw[i][j] = Data[indexW[j]][i];
            if (j < indexnW_size)
                Mnw[i][j] = Data[indexnW[j]][i];
        }
    }
с использованием #pragma omp parallel for работает 3 миллисекунды, а без - 0. Но это пока массив данных маленький...

и еще вопрос. Если в цикле используется контейнер vector<> и его метод push_back(), то можно ли распараллелить такой цикл?
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,040
13.05.2013, 19:24 #6
Цитата Сообщение от mat_for_c Посмотреть сообщение
с использованием #pragma omp parallel for работает 3 миллисекунды, а без - 0.
Объемы вычислений смешные. Классический пример - напишите перемножение матриц большого размера, проведите замеры.

Добавлено через 2 минуты
Цитата Сообщение от mat_for_c Посмотреть сообщение
и еще вопрос. Если в цикле используется контейнер vector<> и его метод push_back(), то можно ли распараллелить такой цикл?
Этот метод не является потокобезопасным.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
13.05.2013, 20:00  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Объемы вычислений смешные. Классический пример - напишите перемножение матриц большого размера, проведите замеры.
Сделал ... Вот результаты
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
#include <iostream>
#include <ctime>
#include <omp.h>
 
using namespace std;
 
int main(void)
{
    srand(time(NULL));
    short a[2000][100], b[100][3000];//, p[2000][3000]; --- места на него не хватило :)
    int i, j, k, sum;
    for (i = 0; i < 2000; ++i)
        for (j = 0; j < 100; ++j) {
            a[i][j] = rand()%10;
        }
    for (i = 0; i < 100; ++i)
        for (j = 0; j < 3000; ++j) {
            b[i][j] = rand()%10;
        }
    
    //без  -- 2096 мс
    clock_t beg = clock();
//#pragma omp parallel for -- 9297 мс
    for (i = 0; i < 2000; ++i) {
    //#pragma omp parallel for  //-- 5439 мс
        for (j = 0; j < 3000; ++j) {
            sum = 0;
            //#pragma omp parallel for // оооочень долго
            for (k = 0 ; k < 100; ++k)
                sum += a[i][k]*b[k][j];
            //p[i][j] = sum; - т.к. массива нет
        }
    }
    clock_t end = clock();
    cout << end - beg << endl;
    system("pause");
    return 0;
}
время указано там, где использовался omp для конкретного цикла. почему такие результаты большие???
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,040
13.05.2013, 20:29 #8
Цитата Сообщение от mat_for_c Посмотреть сообщение
p[2000][3000]; --- места на него не хватило
Ну сделайте ж динамическое выделение памяти.

Функция clock ситает процессорное время. Воспользуйтесь какой-нибудь gettimeofday.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
14.05.2013, 11:30  [ТС] #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну сделайте ж динамическое выделение памяти.
Это не особо важно. Основной смысл перемножения расписан.


Цитата Сообщение от 0x10 Посмотреть сообщение
Функция clock ситает процессорное время. Воспользуйтесь какой-нибудь gettimeofday.
как я понял, gettimeofday в линуксе работает, в то время как у меня винда стоит, да и в статье про нее писали, что все же лучше получить процессорное время...
http://ccfit.nsu.ru/~kireev/lab1/lab1time.htm
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 12:00 #10
Время можно замерить при помощи самого 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
#include <omp.h>
#include <cstdio>
#include <cmath>
 
int main()
{
    double  start;
    double  result[8];
 
    start = omp_get_wtime();
 
    #pragma omp parallel for
    for ( int i = 0; i < 8; i++ ) {
        result[i] = 0;
        for ( int j = 0; j < 1000000; j++ ) {
            result[i] += (pow( i + 1, 1.1 )) * sqrt( i * j );
        }
    }
 
    printf( "Elapsed = %.2f\n", omp_get_wtime() - start );
 
    for ( int i = 0; i < 8; i++ ) {
        printf( "%2d: %.4f\n", i, result[i] );
    }
 
    return 0;
}
2
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,040
14.05.2013, 12:06 #11
mat_for_c, в статье говорится о времени процесса - т.е. о том времени, которое процесс занимал процессор. Оно точнее отражает время выполнения программы в многозадачной системе по сравнению с системным временем.

Функция clock возвращает количество тиков процессора. Т.е. если параллельно выполнялось два потока и время первого N, второго - K, то с использованием функции clock получим N+K.

Ну выше уже написали, что в openmp есть функция для измерения времени.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
14.05.2013, 18:47  [ТС] #12
lazybiz, а правильно ли я понимаю, что небольшие циклы распараллеливать смысла нет? скажем в вашем примере я j изменял до 1000 и при использовании omp работало только медленнее...
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 21:54 #13
Цитата Сообщение от mat_for_c Посмотреть сообщение
а правильно ли я понимаю, что небольшие циклы распараллеливать смысла нет? скажем в вашем примере я j изменял до 1000 и при использовании omp работало только медленнее...
Внутренний цикл с переменной j не распараллеливается. Поэтому, скорее всего, вы меня поняли не правильно.
В данном примере распараллеливается только цикл с переменной i. Поэтому, если у цикла как минимум 2 итерации, то есть смысл его распараллелить.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
14.05.2013, 22:12  [ТС] #14
Цитата Сообщение от lazybiz Посмотреть сообщение
Внутренний цикл с переменной j не распараллеливается. Поэтому, скорее всего, вы меня поняли не правильно.
Я параллелил внешний цикл, но при условии, что j меняется до 1000, а не до 1000000. При этом время работы ухудшалось. Попробуйте пожалуйста проделать то же самое и дайте ответ, какие у Вас результаты и что Вы думаете по этому поводу.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 22:32 #15
У меня с 0 <= j < 1000, независимо от того, использую я OpenMP или нет, результат времени == 0. Т.е. это слишком "слабый" цикл.
Я понял что вы имеете в виду. Разумеется, что если вам заранее известно, что цикл занимает очень мало процессорного времени, то нет смысла его распаралелливать.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 22:32
Привет! Вот еще темы с ответами:

Распараллеливание алгоритмов - 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
Yandex
Объявления
14.05.2013, 22:32
Ответ Создать тему
Опции темы

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