2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|
1 | |
Инициализировать массив быстро?10.12.2011, 20:04. Показов 5845. Ответов 39
Метки нет (Все метки)
Возможно ли инициализировать все элементы массива каким-то числом быстрее, чем через цикл? Как это можно сделать? Если нельзя, то как лучше это сделать в цикле-помещать локальные переменные счетчика и числа в процессорные регистры?
0
|
10.12.2011, 20:04 | |
Ответы с готовыми решениями:
39
Инициализировать массив не получается инициализировать массив Как инициализировать массив ссылок? Как инициализировать такой массив |
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
|
|
10.12.2011, 21:06 | 21 |
ну фактически все сводится к посту taras atavin
можно заранее создать число большее по размеру которое было бы сочетанием нескольких переменных, но когда неизвестно это число мне кажется это только дольше будет
1
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
10.12.2011, 21:06 | 22 |
taras atavin, mmx работает с массивами данных
register же наврятли для этого применялся
0
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|
10.12.2011, 21:12 [ТС] | 23 |
В разделе code generation настроек есть опция включения генерации кода компилятором, использующим расширенные наборы инструкций sse, sse2. Но это не раздел optimization. Надеюсь, что при отключенной оптимизации, эта опция будет работать как независимая, т.к. терять в скорости арифметики тоже неохота...
0
|
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
|
||||||
10.12.2011, 21:17 | 24 | |||||
ну тут не все так сложно:
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
10.12.2011, 21:21 | 25 |
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
10.12.2011, 21:28 | 26 |
Что-то мне кажется, что компилятор сделает код не хуже, чем эта ассемблерая вставка.
Если убрать лишний jmp, лишний cmp (можно ecx менять от 99 до 0), развернуть цикл, возможно, добавить prefetch'и (не знаю, будет ли лучше, но попробовать не вредно), копировать целыми xmm регистрами сразу по 4 элемента, тогда надо будет уже сравнивать.
1
|
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
|
|
10.12.2011, 21:35 | 27 |
разве что берет число он каждый раз по памяти, когда лучше бы занести его в регистр
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
||||||
10.12.2011, 22:12 | 28 | |||||
Код
0040137B |. 8B9424 5C9C000>MOV EDX,DWORD PTR SS:[ESP+9C5C] 00401382 |. 31DB XOR EBX,EBX 00401384 |. 8D4424 1C LEA EAX,DWORD PTR SS:[ESP+1C] 00401388 |> 891498 /MOV DWORD PTR DS:[EAX+EBX*4],EDX 0040138B |. 43 |INC EBX 0040138C |. 81FB 10270000 |CMP EBX,2710 00401392 |.^75 F4 \JNZ SHORT tt.00401388 Код
0040138F |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] 00401393 |. 66:0F6E8C24 5C>MOVD MM1,DWORD PTR SS:[ESP+9C5C] 0040139C |. 66:0F70C1 00 PSHUFW MM0,MM1,0 004013A1 |. 8D9424 509C000>LEA EDX,DWORD PTR SS:[ESP+9C50] 004013A8 |. 90 NOP 004013A9 |. 8DB426 0000000>LEA ESI,DWORD PTR DS:[ESI] 004013B0 |> 66:0F7F00 /MOVQ QWORD PTR DS:[EAX],MM0 004013B4 |. 83C0 10 |ADD EAX,10 004013B7 |. 39D0 |CMP EAX,EDX 004013B9 |.^75 F5 \JNZ SHORT tt.004013B0 Добавлено через 10 минут А с ключом -funroll-loops вообще замечательно Код
0040138F . 8D9424 509C000>LEA EDX,DWORD PTR SS:[ESP+9C50] 00401396 . 66:0F6E8C24 5C>MOVD MM1,DWORD PTR SS:[ESP+9C5C] 0040139F . 66:0F70C1 00 PSHUFW MM0,MM1,0 004013A4 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] 004013A8 . 89D1 MOV ECX,EDX 004013AA . 29C1 SUB ECX,EAX 004013AC . 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 004013B0 . 83E9 10 SUB ECX,10 004013B3 . C1E9 04 SHR ECX,4 004013B6 . 8D4424 20 LEA EAX,DWORD PTR SS:[ESP+20] 004013BA . 83E1 07 AND ECX,7 004013BD . 39D0 CMP EAX,EDX 004013BF . 0F84 99000000 JE tt.0040145E 004013C5 . 85C9 TEST ECX,ECX 004013C7 . 74 67 JE SHORT tt.00401430 004013C9 . 83F9 01 CMP ECX,1 004013CC . 74 49 JE SHORT tt.00401417 004013CE . 83F9 02 CMP ECX,2 004013D1 . 74 3D JE SHORT tt.00401410 004013D3 . 83F9 03 CMP ECX,3 004013D6 . 74 31 JE SHORT tt.00401409 004013D8 . 83F9 04 CMP ECX,4 004013DB . 90 NOP 004013DC . 8D7426 00 LEA ESI,DWORD PTR DS:[ESI] 004013E0 . 74 20 JE SHORT tt.00401402 004013E2 . 83F9 05 CMP ECX,5 004013E5 . 74 14 JE SHORT tt.004013FB 004013E7 . 83F9 06 CMP ECX,6 004013EA . 74 08 JE SHORT tt.004013F4 004013EC . 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 004013F0 . 8D4424 30 LEA EAX,DWORD PTR SS:[ESP+30] 004013F4 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 004013F8 . 83C0 10 ADD EAX,10 004013FB > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 004013FF . 83C0 10 ADD EAX,10 00401402 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 00401406 . 83C0 10 ADD EAX,10 00401409 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 0040140D . 83C0 10 ADD EAX,10 00401410 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 00401414 . 83C0 10 ADD EAX,10 00401417 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 0040141B . 83C0 10 ADD EAX,10 0040141E . 39D0 CMP EAX,EDX 00401420 . 74 3C JE SHORT tt.0040145E 00401422 . 8DB426 0000000>LEA ESI,DWORD PTR DS:[ESI] 00401429 . 8DBC27 0000000>LEA EDI,DWORD PTR DS:[EDI] 00401430 > 66:0F7F00 MOVQ QWORD PTR DS:[EAX],MM0 00401434 . 66:0F7F40 10 MOVQ QWORD PTR DS:[EAX+10],MM0 00401439 . 66:0F7F40 20 MOVQ QWORD PTR DS:[EAX+20],MM0 0040143E . 66:0F7F40 30 MOVQ QWORD PTR DS:[EAX+30],MM0 00401443 . 66:0F7F40 40 MOVQ QWORD PTR DS:[EAX+40],MM0 00401448 . 66:0F7F40 50 MOVQ QWORD PTR DS:[EAX+50],MM0 0040144D . 66:0F7F40 60 MOVQ QWORD PTR DS:[EAX+60],MM0 00401452 . 66:0F7F40 70 MOVQ QWORD PTR DS:[EAX+70],MM0 00401457 . 83E8 80 SUB EAX,-80 0040145A . 39D0 CMP EAX,EDX 0040145C .^75 D2 JNZ SHORT tt.00401430
2
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|||||||||||
19.12.2011, 22:28 [ТС] | 29 | ||||||||||
Если массив объявлен так:
то можно ли его инициализировать нулями так:
0
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|
19.12.2011, 22:50 [ТС] | 31 |
Спасибо, это мне сэкономит несколько циклов
Т.е. сразу при объявлении массива скобки () обозначают, что все элементы равны 0?
0
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|
19.12.2011, 23:01 [ТС] | 33 |
Пишу длл, к сожалению, не знаю как ее запускать и отлаживать, а если исполняемый файл сделать, то не знаю как там выводить на экран. Такое положение скобок вижу впервые. Раньше в VB6 сразу выводил в текстовое поле, а в С++ готовых форм нет. Надеюсь, что аккуратно напишу библиотеку без ошибок...
0
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
||||||
20.12.2011, 02:55 [ТС] | 34 | |||||
Научился выводить в консоль. Проверяем исходный вариант:
0
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
||||||
20.12.2011, 03:12 [ТС] | 35 | |||||
Проверяем вариант Jupiter:
Получаем, что ячейки пусты: браво Jupiter! Если бы еще кто-то подсказал, как этими скобками пользоваться, и почему 0 они дают, было бы совсем здорово.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
20.12.2011, 07:01 | 36 | |||||
Почему?
И после этого ты говоришь об оптимизации?! С нолём надо сравнивать, так как это быстрее любого другого сравнения. Добавлено через 9 минут Когда это оправдано, он помещает данные в регистры, в компилированном коде часть переменных даже вообще ни когда не бывает ни где, кроме регистров. Но чтоб поместить данное в регистр, сначала надо сохранить другое данное. А если для трёх часто используемых даннных будет использоваться общий регистр из-за нехватки регистров, а для трёх более редких - индивидуальные, то при каждом обращении к общему регистру происходит два обращения к памяти, что медленнее доступа к индивидуальным регистрам, что тормозит исполнение, а при противоположном распределении регистров это бы происходило реже и реже торможение. Регистров то не так уж много, есть камни всего с четырьмя регистрами общего назначения. Добавлено через 3 минуты Я бы не стал полагаться на дефолтозануление по new за исключением объектов и только с известными дефолтоконструкторами. А дабл - скаляр.
1
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
20.12.2011, 11:56 | 37 |
Почему? В стандарте же (пункт 8.5) чётко говорится:
Сообщение от C++98
Сообщение от C++11
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
20.12.2011, 12:13 | 38 |
Это не английский, подкласс по-английски subclass.
Инициализация дефотным значением, если значение не задано явно. И что? Само дефолтное значение может быть каким угодно, хоть рандомным. Зато, в конструкторе сказано, что экземпляр класса всегда создаётся конструктором, если не указан иной конструктор - дефолтным и если экземпляр является элементом массива - тоже дефолтным конструктором, дефолтное значение определено объектов в дефолтном конструкторе, на у если юзишь другой конструктор, то значение задано явно. Какими точно словами - не знаю, но смысл этот.
0
|
Заблокирован
|
||||||
20.12.2011, 14:21 | 39 | |||||
можно разобрать это
1
|
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
|
|
17.02.2012, 09:57 [ТС] | 40 |
А ведь еще быстрее наверно можно, если директивы OpenMP использовать в вариантах с циклами.
0
|
17.02.2012, 09:57 | |
17.02.2012, 09:57 | |
Помогаю со студенческими работами здесь
40
Как инициализировать массив в классе Как инициализировать массив в структуре? Можно ли как-то инициализировать массив? Как инициализировать двумерный массив? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |