Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Алгоритм шифрования DES (необходимо ускорить любым доступным способом)

17.12.2012, 01:25. Показов 3648. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть алгоритм шифрования дес, он работает но работает медленно ну или скажем так ... недостаточно быстро для того чтобы препод его принял. Посоветуйте как можно ускорить его в каком-либо месте. Часть функций я не привожу так как я уверен что там оптимизировать нечего либо оптимизация не даст прироста потому что эти функции всё равно выполняются один раз.

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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
//блок чтобы облегчить выделение байтов при шифровании
 
#define low word[0] // 0 - 31
#define high word[1] // 31 - 63
 
union Block
{
    uint8_t byte[8];
    uint32_t word[2];
    uint64_t dword;
};
 
 
#define NUMOFSUBKEYS 16
class DES
{
    uint64_t key;//ключ который позже будет сжат и в последствии испорчен
 
    uint64_t subkeys[NUMOFSUBKEYS];//подключи для шифрования / дешифрования
 
 
protected:
 
    /****************Работа с блоком****************************/
    //начальная перестановка блока (один раз)
    uint64_t initialPeremutation(const uint64_t& block) const
    {
        //начальные перестановки битов (mod 64 - val)
        static const size_t IP[64]=
                       {6,14,22,30,38,46,54,62,
                        4,12,20,28,36,44,52,60,
                        2,10,18,26,34,42,50,58,
                        0,8,16,24,32,40,48,56,
                        7,15,23,31,39,47,55,63,
                        5,13,21,29,37,45,53,61,
                        3,11,19,27,35,43,51,59,
                        1,9,17,25,33,41,49,57};
        uint64_t result = 0;
        for (size_t i = 0; i < 64; ++i)
        {
            result <<= 1;
            result |= (block & (1ULL << (IP[i]))) >> (IP[i]);
        }
        return result;
    }
 
    //средняя перестановка (та что каждый цикл)
    uint32_t averagePermutation(uint32_t word) const
    {
        //средняя перестановка (mod - 32)
        static const size_t P[32]    = 
                {16,25,12,11,3,20,4,15,
                31,17,9,6,27,14,1,22,
                30,24,8,18,0,5,29,23,
                13,19,2,26,10,21,28,7};
 
        uint32_t result = 0;
        for (int i = 0; i < 32; ++i)
        {
            result <<= 1;
            result |= (word & (1ULL << (P[i]))) >> P[i];
        }
        return result;
 
    }
 
    //конечная перестановка для блока
    uint64_t EndPermutation(uint64_t& word) const
    {
        //конечная перестановка (модифицированная 64-value)
        static const size_t IPend[64]=
                       {24,56,16,48,8,40,0,32,
                        25,57,17,49,9,41,1,33,
                        26,58,18,50,10,42,2,34,
                        27,59,19,51,11,43,3,35,
                        28,60,20,52,12,44,4,36,
                        29,61,21,53,13,45,5,37,
                        30,62,22,54,14,46,6,38,
                        31,63,23,55,15,47,7,39};
 
 
 
        uint64_t result = 0;
        for (int i = 0; i < 64; ++i)
        {
            result <<= 1;
            result |= (word & (1ULL << (IPend[i]))) >> IPend[i];
        }
        return result;
    }
 
 
    //расширение блока с 32 до 48
    uint64_t blockExpansion(const int32_t half) const
    {
        return uint64_t  result;
    }
 
 
    //преобразования по S-Box'ам (S-BOX'ы отдельно в .h файле)
    uint32_t SBoxPermutation(uint64_t src) const
    {
        Block temp;
        temp.dword = 0ULL;
 
        //проходимся по всем S-Box'ам
        for (int i = 0; i < 8; ++i) {
            temp.byte[i] = Sbox[i][src & 0x3F];
            src >>= 6;
        }
 
        //сдвигаем результат в одно 32х байтное целое
        uint32_t res = 0;
        for (int i = 3; i >= 0; --i) {
            res |= temp.byte[2*i] | temp.byte[2*i + 1];
            res <<= 8;
        }
 
        return res;
    }
    /////////////////////////Работа с блоком//////////////////////////////////
 
 
    /*****************Работа с ключем***************************/
    //получение из 64х битного ключа 56битного
    uint64_t keyShrink(uint64_t key) const
    {
        return uint64_t result;
    }
 
    //окончательное перемешивание ключа
    //по табличке PC2
    uint64_t keyPermute(const uint64_t& key) const
    {
        return uint64_t result;
    }
 
    //генерация 16 подключей
    void GenerateSubKeys(uint64_t& key, uint64_t* subkeys)
    {
        ....
    }
 
 
public:
    DES()
    { }
 
    DES(const uint64_t& key)
        :key(key)
    {
        GenerateSubKeys(this->key, subkeys);
    }
 
 
    //пошифровать блок
    uint64_t EnCrypt(const uint64_t& value) const
    {
        static Block block;
        block.dword = initialPeremutation(value);
 
        uint32_t Left = block.high;
        uint32_t Right = block.low;
 
        uint32_t TempRight;
        uint32_t Temp;
 
        uint64_t RightEX;
        for(size_t i=0 ;i<NUMOFSUBKEYS; i++)
        {
            Temp = averagePermutation(
                SBoxPermutation ( blockExpansion(Right) ^ subkeys[i] )
                );
 
            TempRight = Right;
            Right = Left^Temp;
            Left = TempRight;
        }
 
        block.low = Left;
        block.high = Right;
 
        return EndPermutation(block.dword);
    }
 
    //пошифровать n блоков
    void EnCrypt(uint64_t* value, size_t size)
    {
        static Block block;
        while(--size)
        {
            static Block block;
            block.dword = initialPeremutation(*value);
 
            uint32_t Left = block.high;
            uint32_t Right = block.low;
 
            uint32_t TempRight;
            uint32_t Temp;
 
            uint64_t RightEX;
            for(size_t i=0 ;i<NUMOFSUBKEYS; i++)
            {
                Temp = averagePermutation(
                    SBoxPermutation ( blockExpansion(Right) ^ subkeys[i] )
                    );
 
                TempRight = Right;
                Right = Left^Temp;
                Left = TempRight;
            }
 
            block.low = Left;
            block.high = Right;
 
            *value = EndPermutation(block.dword);
            value++;
        }
    }
 
    //дешифровать блок
    uint64_t DeCrypt(const uint64_t& value) const
    {
        Block block;
        uint32_t Temp;
        uint32_t TempRight;
 
        block.dword = initialPeremutation(value);
 
        uint32_t Left = block.high;
        uint32_t Right = block.low;
 
        uint64_t RightEX;
        for(int i = (NUMOFSUBKEYS-1) ;i>=0; i--)
        {
            Temp = averagePermutation (
                SBoxPermutation
                    ( blockExpansion(Right ) ^ subkeys[i] )
                );
 
            TempRight = Right;
            Right = Left^Temp;
            Left = TempRight;
        }
 
        block.low = Left;
        block.high = Right;
 
        return EndPermutation(block.dword);
    }
 
    //дешифровать n блоков
    void DeCrypt(uint64_t* value, size_t size)
    {
        while(--size)
        {
            Block block;
            uint32_t Temp;
            uint32_t TempRight;
 
            block.dword = initialPeremutation(*value);
 
            uint32_t Left = block.high;
            uint32_t Right = block.low;
 
            uint64_t RightEX;
            for(int i = (NUMOFSUBKEYS-1) ;i>=0; i--)
            {
                Temp = averagePermutation (
                    SBoxPermutation
                        ( blockExpansion(Right ) ^ subkeys[i] )
                    );
 
                TempRight = Right;
                Right = Left^Temp;
                Left = TempRight;
            }
 
            block.low = Left;
            block.high = Right;
 
            *value = EndPermutation(block.dword);
            value++;
        }
    }
 
};
Примечание: s-box'ы сгенерированы так что их улучшать некуда поэтому здесь они не приводятся.
Посоветуйте хоть что-нибудь ато я в отчаянии, вроде и не особо говнкодил, но по лимиту времени совсем же не прохожу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2012, 01:25
Ответы с готовыми решениями:

Алгоритм шифрования DES и цифровая подпись MD5
Необходимо разработать консольное приложение, выполняющее следующий набор операций с помощью...

Алгоритм шифрования DES
Требуется написать программу реализующую симметричный алгоритм шифрования DES. В Инете много...

Реализовать шифрование текста любым простым способом (+ ключ)
Здравствуйте! мне нужно шифрования текста простым способом (+ ключ) думаю, неплохая идея была бы,...

Алгоритм сортировки массива ( Любым способом )
В общем мне сказали что это очень просто но я вообще не понимаю как это делать ( если кто сможет...

18
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 01:30 2
Цитата Сообщение от Gepar Посмотреть сообщение
for (int i = 3; i >= 0; --i) {
* * * * * * res |= temp.byte[2*i] | temp.byte[2*i + 1];
* * * * * * res <<= 8;
* * * * }
цикл можешь развернуть
это первое что бросилось в глаза
сейчас еще посмотрю
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 01:50  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
сейчас еще посмотрю
Сам понимаешь не слишком поможет Но сейчас сделаю это. Моё решение сейчас проигрывает варианту препода в 4.2 раза, а должно МАКСИМУМ в 3.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.12.2012, 01:55 4
а ты сделай хронометраж. и увидишь. что тормозит больше всего. может оказаться, что вовсе не там, где ты полагаешь.
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 02:06  [ТС] 5
Вообще реально не понимаю чего мой вариант такой медленный получился, вроде же не так фигово я всё написал

Добавлено через 1 минуту
К слову: а как-то в студии можно посмотреть ээээ план выполнения чтоли, ну в общем как в sql сервере чтобы, я хочу помотреть где больше всего времени тратиться, хотя оно и так понятно что в цикле шифрования блока, но всё равно идея в принципе неплохая взгялунть на процентное соотношение сожранного процессорного врмени, можно так? Ну чтобы автоматом в студии как-то если она это умеет? Если руками дописывать куски мерялок и сверяться то не пойдёт, слишком долго и пользы мало.

Добавлено через 6 минут
Нашёл в студии анализ производительности ...
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 02:07 6
профилировщиком проходил?
вот статья про него
http://msdn.microsoft.com/ru-r... 37887.aspx
честно говоря сам только нашел в гугле еще не читал
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 02:46  [ТС] 7
ValeryS, прошёлся, он тупой Сначала попробовал прогнать мой код который выполняется менее 10 секунд так он и отчёта не дал. Потом сунул ему другой код где есть вызов функции, он сказал что время жрёт мейн (в мейне был вызов той функции), потом попробовал полноценное приложение им прогнать так он сказал что больше всего времени жрал выбор файла для шифрования и собственно само шифрование (без подробностей даже какая конкретно функция), короче им можно отлаживать огромные приложения разве что чтобы смотреть какой компонент твоего мега приложения жрёт больше всего чего-то, для мелкой шифровалки он не справляется.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 02:52 8
а статью прочитал
там вроде написано как построчно посмотреть
вот тебе еще одна ссылка
http://citforum.ru/book/optimize/chapter1.shtml
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 13:47  [ТС] 9
ValeryS, спасибо конечно, но если я ещё и за профилировщики возьмусь то на дес совсем не хватит. Тут и так понятно что вызывается то функция шифрования блока и дешифрования. А в ней вызываются в цикле 16 раз:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//средняя перестановка (та что каждый цикл)
    uint32_t averagePermutation(uint32_t word) const
    {
        //средняя перестановка (mod - 32)
        static const size_t P[32]    = 
                {16,25,12,11,3,20,4,15,
                31,17,9,6,27,14,1,22,
                30,24,8,18,0,5,29,23,
                13,19,2,26,10,21,28,7};
 
        uint32_t result = 0;
        for (int i = 0; i < 32; ++i)
        {
            result <<= 1;
            result |= (word & (1ULL << (P[i]))) >> P[i];
        }
        return result;
 
    }
+ обмены местами и сбоксы, а также нач. и конечные перестановки по разу. У меня повсюду для перестановки как видишь используеться цикл примерно похожий, возможно есть какие-то предложения как в 32х битном целом поменять битики местами по табличке максимально быстро, может там есть какое-то крутое решение чтобы сдвигов было поменьше чем у меня или ещё чего ... это бы мне сильно помогло.

Добавлено через 1 час 9 минут
К слову ещё вопросы (ответы на которые мне помогли бы оптимизировать работу).
1)Быстрее вызов void функции с передчей параметра uint64_t по ссылке и возврат результата через этот же параметр VS вызов функции с const аргументом переданным по ссылке и возврат результирующего значения uint64_t
2)При работе с union Block в котором максимум храниться 64 бита как сделать лучше:
//uint64_t value;
Block block;
block.dword = value;

или можно попытаться написать
Block* block = &value;
или же юнион в котором хранится 64 бита не обязательно сам размером 64 бита и эта штука не проконает ?

Добавлено через 6 минут
И ещё вопрос: на данный момент у меня мой класс вместе с функциями (те то что я привёл выше) всё в .h файле. Повлияет ли как-то на скорость выполнения программы если я разделю на файл заголовков и реализаций (.h и .cpp файл), или это только на читабельность повлияет, а на скорость никак? Я просто раньше как-то не заморачивался над этим и не экономил доли секунд.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 14:27 10
Цитата Сообщение от Gepar Посмотреть сообщение
Повлияет ли как-то на скорость выполнения программы если я разделю на файл заголовков и реализаций (.h и .cpp файл), или это только на читабельность повлияет, а на скорость никак? Я просто раньше как-то не заморачивался над этим и не экономил доли секунд.
по моему нет
Цитата Сообщение от Gepar Посмотреть сообщение
static const size_t P[32] =
{16,25,12,11,3,20,4,15,
31,17,9,6,27,14,1,22,
30,24,8,18,0,5,29,23,
13,19,2,26,10,21,28,7};
ты же больше нигде не используешь эту таблицу?
забей сразу значение ключей
типа
C++
1
2
static const unsigned int 0 P[32] = 
    {0x00010000, 0x02000000
ну и так далее
избавишься от этого сдвига
Цитата Сообщение от Gepar Посмотреть сообщение
1ULL << (P[i])
далее

Цитата Сообщение от Gepar Посмотреть сообщение
result |= (word & (1ULL << (P[i]))) >> P[i];
это ты выставляешь младший бит если установлен флаг?
может перейти к булю
C++
1
result |=(int)( (word &P[i])!=0);
разверни цикл
этим ты увеличишь скорость, может быть во много раз если код не попадает в кэш
и можно будет избавится от таблицы (значит от адресной арифметики) скорость еще увеличится
например так
C++
1
2
 result |=(word&0x00010000)<<15; //загнали в 31 бит 
 result |=(word&0x02000000)<<5; // загнали в 30 бит
ну и так далее
да читабельность потеряется может придется делать комментарии
но скорость увеличится, тем более если процессору удастся спараллелить команды


Цитата Сообщение от Gepar Посмотреть сообщение
1)Быстрее вызов void функции с передчей параметра uint64_t по ссылке и возврат результата через этот же параметр VS вызов функции с const аргументом переданным по ссылке и возврат результирующего значения uint64_t
тут уже надо смотреть листинг
но при возврате значения будут задействованы два регистра EAX EDX а при ссылке будет работа с памятью
но повторюсь надо смотреть


Цитата Сообщение от Gepar Посмотреть сообщение
но если я ещё и за профилировщики возьмусь то на дес совсем не хватит.
ну а как еще искать слабые места, иногда они возникают на пустом месте например из-за того что память не выравнена на параграф

Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
или можно попытаться написать
Block* block = &value;
здесь ты берешь адрес
а при юнион нет выигрыш
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 14:34  [ТС] 11
Развернул цикл средних перестановок (те что каждый цикл) до 32 написанных руками + там где блок добавил использование указателя (почему-то когда выделяешь руками через new память под блок и используешь потом указатели то быстрее работает где-то на 1/15), вроде теперь прохожу по лимиту времени, хотя и не факт. Я сейчас тестирую на процессоре амд, а сдавать на интел. Мне там говорили что интеловский компилятор творит якобы чудеса ... вопрос: можно ли собрать на АМД процессоре интеловским компилятором приложение оптимизированное под процессоры ИНТЕЛ ? Ну пускай оно у меня на амд хоть и в 5 раз медленее работает, важно чтобы при сдаче на интеловском процессоре оно работало быстро-быстро.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и так далее
избавишься от этого сдвига
ок, в принципе дельный совет, это ещё поможет ускориться. Думаю тогда будет достаточно для сдачи, хотя разоваричавание цикла вот так уже дало в 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
    //средняя перестановка (те что каждый цикл)
    uint32_t averagePermutation(uint32_t word) const
    {
        //средняя перестановка (mod - 32)
        static const size_t P[32]    = 
                {16,25,12,11,3,20,4,15,
                31,17,9,6,27,14,1,22,
                30,24,8,18,0,5,29,23,
                13,19,2,26,10,21,28,7};
 
        uint32_t result = 0;
        /*
        for (int i = 0; i < 32; ++i)
        {
            result <<= 1;
            result |= (word & (1ULL << (P[i]))) >> P[i];
        }
        */
        result <<= 1;
        result |= word & (1ULL << 16) >> 16;
 
        result <<= 1;
        result |= word & (1ULL << 25) >> 25;
        result <<= 1;
        result |= word & (1ULL << 12) >> 12;
        result <<= 1;
        result |= word & (1ULL << 11) >> 11;
        result <<= 1;
        result |= word & (1ULL << 3) >> 3;
        result <<= 1;
        result |= word & (1ULL << 20) >> 20;
        result <<= 1;
        result |= word & (1ULL << 4) >> 4;
        result <<= 1;
        result |= word & (1ULL << 15) >> 15;
        result <<= 1;
        result |= word & (1ULL << 31) >> 31;
        result <<= 1;
        result |= word & (1ULL << 17) >> 17;
        result <<= 1;
        result |= word & (1ULL << 9) >> 9;
        result <<= 1;
        result |= word & (1ULL << 6) >> 6;
        result <<= 1;
        result |= word & (1ULL << 27) >> 27;
        result <<= 1;
        result |= word & (1ULL << 14) >> 14;
        result <<= 1;
        result |= word & (1ULL << 1) >> 1;
        result <<= 1;
        result |= word & (1ULL << 22) >> 22;
        result <<= 1;
        result |= word & (1ULL << 30) >> 30;
        result <<= 1;
        result |= word & (1ULL << 24) >> 24;
        result <<= 1;
        result |= word & (1ULL << 8) >> 8;
        result <<= 1;
        result |= word & (1ULL << 18) >> 18;
        result <<= 1;
        result |= word & (1ULL << 0) >> 0;
        result <<= 1;
        result |= word & (1ULL << 5) >> 5;
        result <<= 1;
        result |= word & (1ULL << 29) >> 29;
        result <<= 1;
        result |= word & (1ULL << 23) >> 23;
        result <<= 1;
        result |= word & (1ULL << 24) >> 24;
 
        result <<= 1;
        result |= word & (1ULL << 13) >> 13;
        result <<= 1;
        result |= word & (1ULL << 19) >> 19;
        result <<= 1;
        result |= word & (1ULL << 2) >> 2;
        result <<= 1;
        result |= word & (1ULL << 26) >> 26;
        result <<= 1;
        result |= word & (1ULL << 10) >> 10;
        result <<= 1;
        result |= word & (1ULL << 21) >> 21;
        result <<= 1;
        result |= word & (1ULL << 28) >> 28;
        result <<= 1;
        result |= word & (1ULL << 7) >> 7;
 
 
 
 
        return result;
 
    }
Я, если честно, не ожидал такого прироста и думал что компилятор и так на макс. оптимизации хорошо угадывает ... хотя может это только у меня на процессоре амд с маленьким кешем так (у меня старый атлон двуядерный, они ещё не очень угадывали), а на новом i5где это будет сдаваться это прироста в 3 раза и не даст и хорошо если будет вообще прирост хоть в пол раза ...
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 14:43 12
Цитата Сообщение от Gepar Посмотреть сообщение
хотя может это только у меня на процессоре амд с маленьким кешем так (у меня старый атлон двуядерный, они ещё не очень угадывали), а на новом i5где это будет сдаваться это прироста в 3 раза и не даст и хорошо если будет вообще прирост хоть в пол раза ...
а может дать еще больше
представь процессор не угадал ему придется выбросить весь кэш и забить заново, при большом кэше это гораздо больше времени

Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
C++
1
2
result <<= 1;
     result |= word & (1ULL << 25) >> 25;
у тебя здесь три сдвига И и ИЛИ
я же тебе показал
Цитата Сообщение от ValeryS Посмотреть сообщение
result |=(word&0x02000000)<<5; // загнали в 30 бит
один сдвиг И и ИЛИ

Добавлено через 3 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
и думал что компилятор и так на макс. оптимизации хорошо угадывает ...
угадывает не компилятор а процессор на стадии выполнения
посему линейный код быстрее чем ветвления (угадывать не надо)
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2012, 15:05 13
ValeryS, Про развертку циклов - изврат же. Для этого спец. опция компилятора есть. К примеру в gcc -funroll-loops. А вручную развертывать циклы... это... кхм.
ТС, используй profiler. Он тебе покажет, ГДЕ у тебя есть проблема в скорости.
1
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
17.12.2012, 15:21 14
Цитата Сообщение от ForEveR Посмотреть сообщение
Про развертку циклов - изврат же.
серьезно
а как насчет этого
Цитата Сообщение от Gepar Посмотреть сообщение
хотя разоваричавание цикла вот так уже дало в 3 раза прирост аж:
Цитата Сообщение от ForEveR Посмотреть сообщение
Для этого спец. опция компилятора есть. К примеру в gcc -funroll-loops.
а зачем мне развертывать все циклы, если проблемных один два?

Цитата Сообщение от ForEveR Посмотреть сообщение
изврат же.
а оптимизация вообще дело не легкое
иногда приходится с нуля переписывать

Цитата Сообщение от ForEveR Посмотреть сообщение
ДЕ у тебя есть проблема в скорости.
ну он и показал в averagePermutation
дальше то править нужно
0
ForEveR
17.12.2012, 15:26
  #15

Не по теме:

ValeryS, Ок. Беру свои слова назад. Не по делу влез. Вроде и читал тему, а все равно чушь пронес. Извиняюсь.

0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
17.12.2012, 15:40  [ТС] 16
Цитата Сообщение от ForEveR Посмотреть сообщение
ValeryS, Про развертку циклов - изврат же. Для этого спец. опция компилятора есть. К примеру в gcc -funroll-loops. А вручную развертывать циклы... это... кхм.
ТС, используй profiler. Он тебе покажет, ГДЕ у тебя есть проблема в скорости.
Так я на максимум оптимизатор выкрутил уже, я тоже думал что он разоварачивает цикли, а мой код просто медленный а тут вот попробовал и ... Я в курсе что gcc это умеет, но в студии почему-то толи не умеет толи не хочет, не могу точно сказать. Но я все разворачивать и не буду наверное, я разверну только те что происходят каждый раз при вызове, например та же перестановка вызывается 16 раз каждые 8 байт и тут лучше уж развернуть руками чтобы не пугать компилятор.

К слову: как-то вроде можно было в студии писать толи через pragma толи ещё как чтобы были секции которые можно свернуть нажав плюсик слева от кода (по умолчанию можно сворачивать блоки комментариев, функции и классы), так вот мне это сейчас очень надо чтобы сворачивать те полотенца по 40 строчек... как это делать, напомните пожалуйста, выгуглить у меня что-то не получилось.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
угадывает не компилятор а процессор на стадии выполнения
посему линейный код быстрее чем ветвления (угадывать не надо)
Ну я плохо выразился ... Конечно я понимаю что угадывание переходов будет на стадии выполнения. В общем я к тому что интеловский компилятор вроде лучше задействует возможности интеловских процессоров по использованию переходов и т.д и даёт код работающий примерно в два раза быстрее чем тот что даёт студия (конкретно на интеловских процессорах). Вот мне бы как-то скомпилировать этим хитрым компилятором на амд можно?

Добавлено через 4 минуты
Таки студия разворачивает цикли, только толи разворачивает не все толи я не знаю. То что я руками развернул цикл из 32 перестановок дало прироста в 3 раза. А то что я развернул цикл из 16 итераций шифрования дало прирост в 1/100 буквально. Видимо оно не разворачивало тот цикл по каким-то причинам ... может static в объявлении массива не понравился или ещё чего.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2012, 15:41 17
Gepar, #pragma region http://msdn.microsoft.com/en-u... 80%29.aspx
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
19.12.2012, 16:23  [ТС] 18
Итого развертывание цикла руками + замена сбоксов которые больше понравились компилятору (первые выглядили так же в принципе, только они совсем заранее рассчитаны были и поэтому знамила аж 8 кб что видимо вылезало постоянно из кеша процессора и скорость падала) и прирост в итоге получился хороший. Другое дело что правда препод приставучий и пристал со своим "А чё это у тебя тут в классе ключи храняться, это что же получается вдруг я надумаю мультипоточное приложение писать то у меня будет на каждый экземпляр класса по 128 байт ключей, нипарядачек, иди переделывай и сбоксы свои 8 кб незабудь убрать, они мне тоже не нравяться". Прикрутил вот теперь чтобы класс хранил указатель на структуру с подключами и попробую завтра это дело втюхать

Добавлено через 1 минуту
Ещё я так и не понял чего на форуме нигде нету готового деса/аеса, такой огромный форум и ни одного готового примера который можно было бы собрать и нормально разобрать по нему что как работает.
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
20.12.2012, 03:26 19
у меня есть дес, но он в корне не так сделан как у тебя. без использования 64 разрядного инта, например...
0
20.12.2012, 03:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2012, 03:26
Помогаю со студенческими работами здесь

Алгоритм шифрования DES (Входные данные в HEX)
Добрый день! Нужен исходник кода либо готовая программа, которая осуществляет шифрование по...

Необходимо подобрать алгоритм шифрования(симметричный, поточный) для передачи потокового видео по сети
Необходимо подобрать алгоритм шифрования(симметричный, поточный) для передачи потокового видео по...

Сортировка массива любым способом
#include &lt;stdio.h&gt; #define N 10 int main() { int a; int i,j,n; scanf(&quot;%d&quot;,&amp;n); ...

Найти токи любым способом
Например если решать методом узловых потенциалов, то потенциал в узле 3 приравняем к 0 (φ3=0)....


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru