Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163

Почему график ускорения вычисления на разном количестве потоков - ломаный?

14.12.2013, 07:12. Показов 1665. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Меня интересует такой вопрос, почему же график ускорения ломанный при разном количестве заданных потоков?

Вообщем, суть задания - вычислить значение числа Пи, точность определяя числом итераций для каждого потока (на каждый поток число итераций одинаково).

По идеи, с увеличением числа потоков время обработки должно увеличиваться, тем самым и ускорение расти, а этого не наблюдается между 3-м и 4-м, 5-м и 6-м.
Интересно, что при работе с порожденными процессами ускорение плавно увеличивается (т.е. время обработки уменьшается).

Формула вычисления: Pi=4−4/3+4/5−4/7+ ... + ( (-1)^(n+1) * 4 )/( 2*n - 1 ).

P.S. изображения я прикрепил, в имени, где встречается "3" использованы процессы, где - "4" - потоки.

Тестил на ubuntu 13.04 в virtual box, число процессоров (intel core i7 2.4) для машины 8, разрядность 64.
Миниатюры
Почему график ускорения вычисления на разном количестве потоков - ломаный?   Почему график ускорения вычисления на разном количестве потоков - ломаный?   Почему график ускорения вычисления на разном количестве потоков - ломаный?  

Почему график ускорения вычисления на разном количестве потоков - ломаный?   Почему график ускорения вычисления на разном количестве потоков - ломаный?   Почему график ускорения вычисления на разном количестве потоков - ломаный?  

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.12.2013, 07:12
Ответы с готовыми решениями:

Параллельное программирование: при большом количестве задач и малом количестве потоков программа ломается
Есть функция вычисления интеграла, все исключения обработаны, эту функцию выполняют ThreadCount вспомогательных потоков, асинхронно,...

О разном количестве разъёмов в разных БП
Сменил я как-то в феврале блок питания на новый FSP 550-80GLN. При установке блока питания обратил внимание вот на что: 20-pin разъём...

Как построить график скорости, ускорения, тангенциального ускорения по времени в двумерной плоскости?
В архиве расписана задача

10
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
14.12.2013, 15:00
Цитата Сообщение от yol Посмотреть сообщение
Тестил на ubuntu 13.04 в virtual box
Предположу, что ответ в этом месте. Вы запускали в виртуальной машине!! Не факт, что в этом время гостевая ОС получала полностью "процессорное время". Я бы для начала повторил эксперимент без виртуализации, потом делал выводы.
0
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163
14.12.2013, 18:07  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
Предположу, что ответ в этом месте. Вы запускали в виртуальной машине!! Не факт, что в этом время гостевая ОС получала полностью "процессорное время". Я бы для начала повторил эксперимент без виртуализации, потом делал выводы.
Также проводил эксперимент на 6-ядерном мейнфрейме sun (os solaris) при работе с потоками были примерно такие же спады и подъемы.

Я предполагаю, что это такая особенность потоков, но не понимаю почему именно такая реакция?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.12.2013, 18:49
Гадать можно долго, было бы неплохо посмотреть на код.
0
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163
14.12.2013, 20:33  [ТС]
Цитата Сообщение от 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
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
    РАБОТАЮЩАЯ 23:57, 01.12.13
*/
 
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
 
#include <iostream>
#include <math.h>
#include <iomanip>
 
 
 
using namespace std;
 
struct data
    {
        int Begin;
        int End;
        double tempPi;
 
        data()
        {
            Begin=0;
            End=0;
            tempPi=0;
        }
    };
 
void* func(void *temp)
{
    data* get=(data*)temp;
    double tempSum=0;
 
    for (int j=get->Begin; j<=get->End; j++) //вычисляем текущую итерацию.
        {
            tempSum=(pow(-1.0, (j+1))*4)/(2*j-1);
            get->tempPi+=tempSum;
        }
}
 
int main()
{
    pid_t pid;
    pthread_t threads[8];
 
    double pi=0;
    double piWiki=3.1415926535897932384626433832795;
    int iter; //число итерация вычисления ПИ.
    int numTh; //число обрабатывающих потоков.
    int unit; //число итераций на поток.
 
 
    int i, j;
 
    data obj[8];
 
 
    /*cout<<"Укажите число итераций для вычисления числа ПИ\n>: ";
    cin>>iter;
 
    cout<<"Укажите число потоков\n>: ";
    cin>>numTh;*/
 
    iter=100000000;
    numTh=8;
 
 
 
    unit=iter/numTh; //число итераций на поток.
 
    for (i=0; i<numTh; i++)
        {
            if (i==0)
                obj[i].Begin=1;
            else
                obj[i].Begin=i*unit+1; //начальный номер итерации.
 
            if (i==numTh-1) //конечный номер итерации.
                obj[i].End=iter; //на случай нецелочисленного разделения кол-ва итераций на поток.
            else
                obj[i].End=(i+1)*unit;
 
            pthread_create(&threads[i], NULL, func, &obj[i]); //создаем поток.
        }
 
    for (j=0; j<numTh; j++)
        pthread_join(threads[j], NULL);
 
    for (int k=0; k<numTh; k++)
        pi+=obj[k].tempPi;
 
    cout<<"\nРезультат вычисления"<<endl;
    cout<<"PI="<<setprecision(64)<<pi<<endl;
 
    cout<<"\nПогрешность вычисления"<<endl;
    cout<<setprecision(2)<<fabs(pi-piWiki)<<endl;
 
    return 0;
}
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
16.12.2013, 16:14
У вас GCC? Тогда пробуйте еще профилировщик (gprof), может покажет что-то интересное во времени работы функций.
И еще pow функция выглядит подозрительно. Замените на итерационное вычисление знака (домножение на -1 на каждой итерации и придется протащить начальную инициализацию в data)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.12.2013, 18:24
К сожалению, ничего вменяемого сказать не могу - сходу ничего криминального в коде не вижу.
Но хотел еще спросить: как и чем замеряли время?
0
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163
16.12.2013, 18:28  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
К сожалению, ничего вменяемого сказать не могу - сходу ничего криминального в коде не вижу.
Но хотел еще спросить: как и чем замеряли время?
Использовал ide - code:blocks, там вроде gcc используется, по завершению программы выводится её время работы (т.е. все достоверно, можно верить ).
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.12.2013, 18:31
Не знаю чем кодблокс замеряет время.
Давайте попробуем воткнуть gettimeofday в начале и в конце. Ну и, понятно, замеры производить на релизной версии.
0
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163
16.12.2013, 18:58  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Не знаю чем кодблокс замеряет время.
Давайте попробуем воткнуть gettimeofday в начале и в конце. Ну и, понятно, замеры производить на релизной версии.
Сделал, как Вы советовали, разницы вообще нету (ну почти, т.к. тратится время на вывод текста, это примерно 2-3 тысячные секунды).

Вот доработанный код:
Кликните здесь для просмотра всего текста
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
    РАБОТАЮЩАЯ 23:57, 01.12.13
*/
 
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
 
#include <iostream>
#include <math.h>
#include <iomanip>
 
#include <sys/time.h>
 
 
using namespace std;
 
struct data
    {
        int Begin;
        int End;
        double tempPi;
 
        data()
        {
            Begin=0;
            End=0;
            tempPi=0;
        }
    };
 
void* func(void *temp)
{
    data* get=(data*)temp;
    double tempSum=0;
 
    for (int j=get->Begin; j<=get->End; j++) //вычисляем текущую итерацию.
        {
            tempSum=(pow(-1.0, (j+1))*4)/(2*j-1);
            get->tempPi+=tempSum;
        }
}
 
int main()
{
    pid_t pid;
    pthread_t threads[8];
 
    double pi=0;
    double piWiki=3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273;
    int iter; //число итерация вычисления ПИ.
    int numTh; //число обрабатывающих потоков.
    int unit; //число итераций на поток.
 
 
    int i, j;
 
    data obj[8];
 
    struct timeval time1, time2;
    long time, sec, usec;
    gettimeofday(&time1, NULL);
 
    /*cout<<"Укажите число итераций для вычисления числа ПИ\n>: ";
    cin>>iter;
 
    cout<<"Укажите число потоков\n>: ";
    cin>>numTh;*/
 
    iter=1000000000;
    numTh=6;
 
 
 
    unit=iter/numTh; //число итераций на поток.
 
    for (i=0; i<numTh; i++)
        {
            if (i==0)
                obj[i].Begin=1;
            else
                obj[i].Begin=i*unit+1; //начальный номер итерации.
 
            if (i==numTh-1) //конечный номер итерации.
                obj[i].End=iter; //на случай нецелочисленного разделения кол-ва итераций на поток.
            else
                obj[i].End=(i+1)*unit;
 
            pthread_create(&threads[i], NULL, func, &obj[i]); //создаем поток.
        }
 
    for (j=0; j<numTh; j++)
        pthread_join(threads[j], NULL);
 
    for (int k=0; k<numTh; k++)
        pi+=obj[k].tempPi;
 
 
    gettimeofday(&time2, NULL);
    sec=time2.tv_sec-time1.tv_sec;
    usec=time2.tv_usec-time1.tv_usec;
    time=((sec)*1000+usec/1000.0)+0.5;
 
    cout<<"\nВремя работы программы: "<<time<<"мс."<<endl;
 
    cout<<"\nРезультат вычисления"<<endl;
    cout<<"PI="<<setprecision(64)<<pi<<endl;
 
    cout<<"\nПогрешность вычисления"<<endl;
    cout<<setprecision(2)<<fabs(pi-piWiki)<<endl;
 
    return 0;
}
0
11 / 11 / 0
Регистрация: 13.10.2012
Сообщений: 163
16.12.2013, 19:01  [ТС]
Вот скрин замера времени, на нем наглядно видно всё.
Миниатюры
Почему график ускорения вычисления на разном количестве потоков - ломаный?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2013, 19:01
Помогаю со студенческими работами здесь

Авторасчёт тенденции при разном количестве элементов
Добрый день! Товарищи, помогите, автоматизировать расчёт Тенденции - как то не выходит у меня. Смысл в том, что будут подставляться...

В кондитерский отдел поступило 15 видов конфет по разной цене и в разном количестве
В кондитерский отдел поступило 15 видов конфет по разной цене и в разном количестве. Зная данные о ценах и количестве товаров, найти,...

Копирование диапазона строк из одной книги в другую, при разном количестве строк
Добрый день ! Вопрос такой: есть две книги(например 7.1 и 7.2 ) с расшифровками счетов, счета идентичные , но информация о счетах разная. ...

Ошибки на большом количестве потоков с сокетами
У меня проблема следующего характера, есть многопоточное приложение которое парсит по спискам ссылок инфу. Каждый поток выполняет следующий...

График ускорения
Определить какое ускорение точки M, лежащей в пределах AB и написать формулу по которой вычисляется ускорение точки M.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru