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

Падение производительности на gcc - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Файловый и консольный ввод и вывод http://www.cyberforum.ru/cpp-beginners/thread454794.html
нужно написать программы одна чтобы вводила функцию консольно, а другая файлово
C++ Работа с allocator (управление памятью) Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование принципы и практика С++ Страуструп, но там так и реализацию функции для своего аллокатора , только дали интерфейс класс ), понял что есть 4 основные функции temlpate<class T> class allocator { // ... T* allocate(int n); void deallocate(T* p, int n); void construct(T *p,... http://www.cyberforum.ru/cpp-beginners/thread454785.html
Исчезает всё нарисованное на gdi+ C++
Доброго времени суток! Пишу подобие своего gui на gdi+.. Всё бы хорошо, но через некоторое время (около минуты), исчезает всё нарисованное.. и никакой Invalidate не помогает(( Что же делать?? Может где-то я не освобождаю ресурсы?? другого объяснения найти не могу( После каждого движения мышкой проверяю положения курсора, и если он попал в кнопку, то отрисовываю картинку с помощью...
Заполнение списка с возможностью перестановки его строк C++
Как написать программу которая string загоняет в список, чтоб потом можно было переставлять строки и.т.п?
C++ Класс с динамическим массивом http://www.cyberforum.ru/cpp-beginners/thread454744.html
доброго времени суток! помогите мне немножко: создать клас vector для сохранения массиву, розмеры от 10 до 10к, память виделите динамчно. забаспечте индексацыю елементов.
C++ Найти объединение и симметрическая разность Пожалуйста, помогите написать программу, находящую объединение и симметрическую разность элементов двух множеств подробнее

Показать сообщение отдельно
Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340

Падение производительности на gcc - C++

28.02.2012, 22:31. Просмотров 766. Ответов 9
Метки (Все метки)

Кто-нибудь сталкивался с тем, что при компиляции gcc, если разносить определение класса и реализацию в заголовочный и, соответственно, в cpp файл, то падает производительность?
Привожу код "без разнесения"
показать

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
117
118
119
120
121
122
123
#include "stdio.h"
#include  "time.h"
#include  "stdlib.h"
#include  "math.h"
 
//g++ -O3 -msse -msse3 -msse2 main.cpp
#include "pmmintrin.h"
#include "emmintrin.h"
#include "xmmintrin.h"
//__m128d x128 = {
//#include "complex.h"
 
 
__declspec(align(16)) 
struct dComplex
{
        union compl_value
        {
            __m128d value;
            struct re_im_ { double re, im; } re_im;
        } value_un;
#define Re value_un.re_im.re
#define Im value_un.re_im.im
#define Value value_un.value
#define to_xmm(v) *((__m128d*)(&(v)))
#define to_compl(v) *((dComplex*)(&(v)))
        dComplex()
        { }
        dComplex(double re, double im)
        { 
            Re = re;
            Im = im;
        }
        dComplex(const __m128d & val_xmm)
        { 
            Value = val_xmm;
        }
        dComplex(const dComplex & orig)
        { 
            Value = to_xmm(orig);
        }
 
        double Module()
        {
            compl_value x_un;
            x_un.value = _mm_sub_pd(Value, Value);
            return sqrt(x_un.re_im.re + x_un.re_im.im);
        }
        
        double Argument()
        {
            return atan2(Im, Re);
        }
        
        dComplex operator + (const dComplex & val)
        {
            return dComplex(_mm_add_pd(Value,val.Value));
        }
        dComplex operator - (const dComplex & val)
        {
            return dComplex(_mm_sub_pd(Value,to_xmm(val)));
        }
        
 
        dComplex operator * (const dComplex & val)
        {   
        //  return dComplex(Re * val.Re - Im * val.Im, Re * val.Im + Im * val.Re);
            return dComplex(_mm_addsub_pd(
                _mm_mul_pd(Value, _mm_movedup_pd(val.Value)),
                _mm_mul_pd(
                    _mm_shuffle_pd(Value ,Value, 1),
                    _mm_shuffle_pd(val.Value, val.Value, 3)
                    )
                ));
        }
        
        dComplex operator / (const dComplex & val)
        {   
            __m128d x = _mm_mul_pd(val.Value,val.Value),
                r = _mm_shuffle_pd(Value ,Value, 1);
 
            return dComplex(_mm_div_pd(
                _mm_add_pd(
                    _mm_mul_pd(Value,_mm_movedup_pd(val.Value)),//_mm_shuffle_pd(val.Value, val.Value, 0)),
                    _mm_mul_pd(
                        r,
                        _mm_shuffle_pd(val.Value, val.Value, 3)
                    )),
                _mm_hadd_pd(x,x)
                ));
        }
        dComplex& operator = (const dComplex & val)
        {
            return to_compl(Value = to_xmm(val));
        }
        dComplex& operator = (double val)
        {
            Re = val;
            Im = 0;
        }
        dComplex& operator = (const double values[])
        {
            Re = values[0];
            Im = values[1];
        }
};
 
 
int main()
{
    dComplex C(1,2), C1(2,4), C2(-1,-1);
    int tm = clock();
    double c1, c2 , c;
    for (int i = 0; i < 10000000; ++i)
    {
        C1.Re = 1.0 * rand() / RAND_MAX;
        C = C1 * (C1 / C2 + C2 * C2) * C1 * C2;
    }
    tm = clock() - tm;
    printf("time: %f\n",tm * 0.001);
    printf("%f %f\n",C.Re,C.Im);
    return 0;
}

Компилируется сие так
g++ -O3 -msse -msse3 -msse2 main.cpp
Запустите, покажет время выполнения.

Если создать файл complex.h и complex.cpp, перенести в них структуру и откомпилировать
g++ -O3 -msse -msse3 -msse2 main.cpp complex.cpp,
то у меня работает на 40% дольше.
В студии такого не возникает.
В чем причина? Может есть дополнительные опции компиляции, чтоб избежать такого?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru