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

Инлайн-функция замедляет работу - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Даны шесть различных чисел. Определить максимальное из них http://www.cyberforum.ru/cpp-beginners/thread834829.html
Даны шесть различных чисел. Определить максимальное из них. (Определить функцию, находящую максимум из двух различных чисел.) Еще одна подобная тема, и последуют санкции.
C++ Выяснить является ли хоть одно из данных чисел палиндромом(перевёртышем) Даны 2 натуральных числа выяснить является ли хоть одно из них палиндромом(перевёртышем) тоесть таким числом десятичная запись которого читается одинаково слева на право и справо на лево.(определить функции позволяющие распозновать числа палиндромы) http://www.cyberforum.ru/cpp-beginners/thread834825.html
C++ Лучшие ресурсы в Интернет - разработчикам C++
Все источники широко известны - но тем не менее: http://strongcpp.blogspot.ru/2013/04/c.html
C++ Получить все шестизначные счастливые номера
Получить все шестизначные счастливые номера. Счастливым называют такое шестизначное число, в котором сумма ею первых трех цифр равна сумме его последних трех цифр. (Определить функцию для расчета суммы цифр трехзначного числа. Перечитайте правила форума. Тема должна быть создана в соответствующем разделе. Название темы должно быть информативным.
C++ перегрузка оператора вычитания строк http://www.cyberforum.ru/cpp-beginners/thread834812.html
#include "stdafx.h" #include <string.h> #include <iostream> using namespace std; class Stroka{ char str; int len;
C++ Что быстрее, операция присваивания или сравнения? Всем доброго времени суток, такой вод у меня дурацкий вопрос сидит в голове, "Что быстрее, операция присваивания или сравнения?". Вот конкретная задача, почему я это спрашиваю: Пишу приложение в Builder, на форме есть несколько edit-ов, храню булевскую переменную, у которой устанавливаю значение в true если на каком-либо из edit-ов произошло событие onchenge, перед тем как присвоить, я сравниваю,... подробнее

Показать сообщение отдельно
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
11.04.2013, 16:12     Инлайн-функция замедляет работу
Здравствуйте! видимо что-то делаю неправильно...имею код. Запускаю скомпилированную программу - работает с одной скоростью. Копипастю код в инлайн функцию - скорость выполнения резко уменьшается.
если кому интересно - вот начальный код
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Task3.cpp: определяет точку входа для консольного приложения.
//
 
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>
#include <iostream>
#include <omp.h>
 
using namespace std;
 
 
int main(int argc, char **argv)
{
    int threads = atoi(argv[2]);
    int n = atoi(argv[1]);
    
 
//Задание 2
    struct timeval StartTime;
    struct timeval EndTime;
    
    double* result = new double[n*n];
    double* A = new double[n*n];
    double* B = new double[n*n];
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            result[i*n+j] = 0;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            A[i*n+j] = i+1;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            B[i*n+j] = 1.0/(j+1);
    int i,k;
    double *indres,*indA,*indB,*ind1B,*ind2B,*ind3B,*ind4B,*ind5B,*ind6B,*ind7B,*ind8B,*ind9B;
    gettimeofday(&StartTime,NULL);
 
#pragma omp parallel num_threads(threads) private(i,k,indres,indA,indB,ind1B,ind2B,ind3B,ind4B,ind5B,ind6B,ind7B,ind8B,ind9B) shared(result,A,B)
    {
#pragma omp for schedule(dynamic,25)
        for ( i = 0; i < n; i++)
    {
        indB = B;
        ind1B = B+n;
        ind2B = ind1B+n;
        ind3B = ind2B+n;
        ind4B = ind3B+n;
        ind5B = ind4B+n;
        ind6B = ind5B+n;
        ind7B = ind6B+n;
        ind8B = ind7B+n;
        ind9B = ind8B+n;
        indA = A+i*n;
        for(k =0; k < n; k+=10)
        {
            double *endres = result+(i+1)*n;
            for ( indres = result+i*n; indres < endres; indB+=5, ind1B+=5,ind2B+=5,ind3B+=5,ind4B+=5,ind5B+=5,ind6B+=5,ind7B+=5,ind8B+=5,ind9B+=5 ,indres+=5 )
            {
                indres[0] += indA[k] * indB[0];
                indres[1] += indA[k] * indB[1];
                indres[2] += indA[k] * indB[2];
                indres[3] += indA[k] * indB[3];
                indres[4] += indA[k] * indB[4];
                
                indres[0] += indA[k+1] * ind1B[0];
                indres[1] += indA[k+1] * ind1B[1];
                indres[2] += indA[k+1] * ind1B[2];
                indres[3] += indA[k+1] * ind1B[3];
                indres[4] += indA[k+1] * ind1B[4];
                
                indres[0] += indA[k+2] * ind2B[0];
                indres[1] += indA[k+2] * ind2B[1];
                indres[2] += indA[k+2] * ind2B[2];
                indres[3] += indA[k+2] * ind2B[3];
                indres[4] += indA[k+2] * ind2B[4];
                
                indres[0] += indA[k+3] * ind3B[0];
                indres[1] += indA[k+3] * ind3B[1];
                indres[2] += indA[k+3] * ind3B[2];
                indres[3] += indA[k+3] * ind3B[3];
                indres[4] += indA[k+3] * ind3B[4];
                
                indres[0] += indA[k+4] * ind4B[0];
                indres[1] += indA[k+4] * ind4B[1];
                indres[2] += indA[k+4] * ind4B[2];
                indres[3] += indA[k+4] * ind4B[3];
                indres[4] += indA[k+4] * ind4B[4];
                //
                indres[0] += indA[k+5] * ind5B[0];
                indres[1] += indA[k+5] * ind5B[1];
                indres[2] += indA[k+5] * ind5B[2];
                indres[3] += indA[k+5] * ind5B[3];
                indres[4] += indA[k+5] * ind5B[4];
                
                indres[0] += indA[k+6] * ind6B[0];
                indres[1] += indA[k+6] * ind6B[1];
                indres[2] += indA[k+6] * ind6B[2];
                indres[3] += indA[k+6] * ind6B[3];
                indres[4] += indA[k+6] * ind6B[4];
                
                indres[0] += indA[k+7] * ind7B[0];
                indres[1] += indA[k+7] * ind7B[1];
                indres[2] += indA[k+7] * ind7B[2];
                indres[3] += indA[k+7] * ind7B[3];
                indres[4] += indA[k+7] * ind7B[4];
                
                indres[0] += indA[k+8] * ind8B[0];
                indres[1] += indA[k+8] * ind8B[1];
                indres[2] += indA[k+8] * ind8B[2];
                indres[3] += indA[k+8] * ind8B[3];
                indres[4] += indA[k+8] * ind8B[4];
                
                indres[0] += indA[k+9] * ind9B[0];
                indres[1] += indA[k+9] * ind9B[1];
                indres[2] += indA[k+9] * ind9B[2];
                indres[3] += indA[k+9] * ind9B[3];
                indres[4] += indA[k+9] * ind9B[4];
            }
            indB+=9*n;
            ind1B+=9*n;
            ind2B+=9*n;
            ind3B+=9*n;
            ind4B+=9*n;
            
            ind5B+=9*n;
            ind6B+=9*n;
            ind7B+=9*n;
            ind8B+=9*n;
            ind9B+=9*n;
        }
    }
    }
    gettimeofday(&EndTime,NULL);
    double time = (EndTime.tv_sec - StartTime.tv_sec) + (EndTime.tv_usec-StartTime.tv_usec)/1000000.0;
 
    cout<<"Time - "<<fixed<<time<<" sec"<<endl;
 
    cout<<"Perfomance - "<<fixed<<2*((double)n/time)*((double)n*(double)n/1000000.0)<<" MegaFlops\n";
    cout<<fixed<<result[0];
    cout<<fixed<<"\t"<<result[n-1]<<endl;
    cout<<fixed<<result[(n-1)*n];
    cout<<fixed<<"\t"<<result[(n-1)*n+n-1]<<endl;
    cout<<"Threads count = "<<threads<<endl;
    
        delete[] result;
        delete[] A;
        delete[] B;
//Задание 2
    return 0;       
}
А это уже вставленный в функцию
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Task3.cpp: определяет точку входа для консольного приложения.
//
 
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>
#include <iostream>
#include <omp.h>
 
using namespace std;
 
inline void Mult(double *A, double *B, double *result)
{
int i,k,n=500;
int threads = 1;
    double *indres,*indA,*indB,*ind1B,*ind2B,*ind3B,*ind4B,*ind5B,*ind6B,*ind7B,*ind8B,*ind9B;
 
#pragma omp parallel num_threads(threads) firstprivate(n) private(i,k,indres,indA,indB,ind1B,ind2B,ind3B,ind4B,ind5B,ind6B,ind7B,ind8B,ind9B) shared(result,A,B)
    {
#pragma omp for schedule(dynamic,25)
        for ( i = 0; i < n; i++)
    {
        indB = B;
        ind1B = B+n;
        ind2B = ind1B+n;
        ind3B = ind2B+n;
        ind4B = ind3B+n;
        ind5B = ind4B+n;
        ind6B = ind5B+n;
        ind7B = ind6B+n;
        ind8B = ind7B+n;
        ind9B = ind8B+n;
        indA = A+i*n;
        for(k =0; k < n; k+=10)
        {
            double *endres = result+(i+1)*n;
            for ( indres = result+i*n; indres < endres; indB+=5, ind1B+=5,ind2B+=5,ind3B+=5,ind4B+=5,ind5B+=5,ind6B+=5,ind7B+=5,ind8B+=5,ind9B+=5 ,indres+=5 )
            {
                indres[0] += indA[k] * indB[0];
                indres[1] += indA[k] * indB[1];
                indres[2] += indA[k] * indB[2];
                indres[3] += indA[k] * indB[3];
                indres[4] += indA[k] * indB[4];
                
                indres[0] += indA[k+1] * ind1B[0];
                indres[1] += indA[k+1] * ind1B[1];
                indres[2] += indA[k+1] * ind1B[2];
                indres[3] += indA[k+1] * ind1B[3];
                indres[4] += indA[k+1] * ind1B[4];
                
                indres[0] += indA[k+2] * ind2B[0];
                indres[1] += indA[k+2] * ind2B[1];
                indres[2] += indA[k+2] * ind2B[2];
                indres[3] += indA[k+2] * ind2B[3];
                indres[4] += indA[k+2] * ind2B[4];
                
                indres[0] += indA[k+3] * ind3B[0];
                indres[1] += indA[k+3] * ind3B[1];
                indres[2] += indA[k+3] * ind3B[2];
                indres[3] += indA[k+3] * ind3B[3];
                indres[4] += indA[k+3] * ind3B[4];
                
                indres[0] += indA[k+4] * ind4B[0];
                indres[1] += indA[k+4] * ind4B[1];
                indres[2] += indA[k+4] * ind4B[2];
                indres[3] += indA[k+4] * ind4B[3];
                indres[4] += indA[k+4] * ind4B[4];
                //
                indres[0] += indA[k+5] * ind5B[0];
                indres[1] += indA[k+5] * ind5B[1];
                indres[2] += indA[k+5] * ind5B[2];
                indres[3] += indA[k+5] * ind5B[3];
                indres[4] += indA[k+5] * ind5B[4];
                
                indres[0] += indA[k+6] * ind6B[0];
                indres[1] += indA[k+6] * ind6B[1];
                indres[2] += indA[k+6] * ind6B[2];
                indres[3] += indA[k+6] * ind6B[3];
                indres[4] += indA[k+6] * ind6B[4];
                
                indres[0] += indA[k+7] * ind7B[0];
                indres[1] += indA[k+7] * ind7B[1];
                indres[2] += indA[k+7] * ind7B[2];
                indres[3] += indA[k+7] * ind7B[3];
                indres[4] += indA[k+7] * ind7B[4];
                
                indres[0] += indA[k+8] * ind8B[0];
                indres[1] += indA[k+8] * ind8B[1];
                indres[2] += indA[k+8] * ind8B[2];
                indres[3] += indA[k+8] * ind8B[3];
                indres[4] += indA[k+8] * ind8B[4];
                
                indres[0] += indA[k+9] * ind9B[0];
                indres[1] += indA[k+9] * ind9B[1];
                indres[2] += indA[k+9] * ind9B[2];
                indres[3] += indA[k+9] * ind9B[3];
                indres[4] += indA[k+9] * ind9B[4];
            }
            indB+=9*n;
            ind1B+=9*n;
            ind2B+=9*n;
            ind3B+=9*n;
            ind4B+=9*n;
            
            ind5B+=9*n;
            ind6B+=9*n;
            ind7B+=9*n;
            ind8B+=9*n;
            ind9B+=9*n;
        }
    }
    }
}
 
int main(int argc, char **argv)
{
//Задание 2
    struct timeval StartTime;
    struct timeval EndTime;
    int n=500;
    
    double* result = new double[n*n];
    double* A = new double[n*n];
    double* B = new double[n*n];
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            result[i*n+j] = 0;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            A[i*n+j] = i+1;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            B[i*n+j] = 1.0/(j+1);
    
    gettimeofday(&StartTime,NULL);
    Mult(A,B,result);
    gettimeofday(&EndTime,NULL);
    double time = (EndTime.tv_sec - StartTime.tv_sec) + (EndTime.tv_usec-StartTime.tv_usec)/1000000.0;
 
    cout<<"Time - "<<fixed<<time<<" sec"<<endl;
 
    cout<<"Perfomance - "<<fixed<<2*((double)n/time)*((double)n*(double)n/1000000.0)<<" MegaFlops\n";
    cout<<fixed<<result[0];
    cout<<fixed<<"\t"<<result[n-1]<<endl;
    cout<<fixed<<result[(n-1)*n];
    cout<<fixed<<"\t"<<result[(n-1)*n+n-1]<<endl;
    
        delete[] result;
        delete[] A;
        delete[] B;
//Задание 2
    return 0;       
}
Компилятор интеловский. Если замерять время выполнения программы внутри самой функции, то производительность так же оказывается уменьшенной...что не так - понять не могу...первый вариант чуть ли не в 2 раза быстрее работает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru