Как быстро обнулить массив?
От: Alfarn  
Дата: 16.08.04 12:19
Оценка:
Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!
Легкий путь открывается лишь тому, кто по трудному пути прошел.
Re: Как быстро обнулить массив?
От: Аноним  
Дата: 16.08.04 12:21
Оценка:
Здравствуйте, Alfarn, Вы писали:

A>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!


А чем плох memset ?
Re[2]: Как быстро обнулить массив?
От: Alfarn  
Дата: 16.08.04 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А чем плох memset?


У меня очень критично по скорости, хотелось бы оптимизацию на асме, именно для обнуления массива
Легкий путь открывается лишь тому, кто по трудному пути прошел.
Re[3]: Как быстро обнулить массив?
От: Аноним  
Дата: 16.08.04 12:52
Оценка:
Здравствуйте, Alfarn, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>А чем плох memset?


A>У меня очень критично по скорости, хотелось бы оптимизацию на асме, именно для обнуления массива


Я точно не помню синтакис инструкции, но попробуй lodsb или lodsw с префиксом числа повторений.
Re: Как быстро обнулить массив?
От: mokc0der  
Дата: 16.08.04 16:47
Оценка:
Здравствуйте, Alfarn, Вы писали:

A>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!


С использованием MMX или без ?
Размер массива ?
Re: Как быстро обнулить массив?
От: DEMON HOOD  
Дата: 16.08.04 19:33
Оценка:
Здравствуйте, Alfarn, Вы писали:

A>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!

ZeroMemory(... ) работает достаточно быстро...
... <<Roxette — Sleeping In My Car Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[4]: Как быстро обнулить массив?
От: Stanky  
Дата: 16.08.04 19:40
Оценка:
> Я точно не помню синтакис инструкции, но попробуй lodsb или lodsw с
> префиксом числа повторений.
>
Только не lods, а stos!!!

cld    ;Идём слева направо
mov    ecx,РазмерМассиваВБайтах
shr    ecx,2    ;Делим на 4, получаем количество элементов в массиве
xor    eax,eax    ;То, что будем записывать в массив - 0
mov    edi,АдресМассива
rep    stosd    ;Сохраняем значение eax по адресу edi, ecx=ecx-1, edi=edi+4, если ecx=0, то заканчиваем выполнение команды
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: Как быстро обнулить массив?
От: Leonid V. Volnin Россия  
Дата: 17.08.04 05:35
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Только не lods, а stos!!!


S>
S>cld    ;Идём слева направо
S>mov    ecx,РазмерМассиваВБайтах
S>shr    ecx,2    ;Делим на 4, получаем количество элементов в массиве
S>xor    eax,eax    ;То, что будем записывать в массив - 0
S>mov    edi,АдресМассива
S>rep    stosd    ;Сохраняем значение eax по адресу edi, ecx=ecx-1, edi=edi+4, если ecx=0, то заканчиваем выполнение команды
S>

ну, memset как раз так и работает..
best regards, Leonid
Re[6]: Как быстро обнулить массив?
От: Stanky  
Дата: 17.08.04 21:07
Оценка:
> ну, memset как раз так и работает..
>
Ну не совсем, но близко!!!
memset — универсальная штука, а здесь расчитанно именно под конкретную задачу!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[7]: Как быстро обнулить массив?
От: VladFein США  
Дата: 17.08.04 21:29
Оценка:
Здравствуйте, Stanky, Вы писали:

>> ну, memset как раз так и работает..

>>
S>Ну не совсем, но близко!!!
S>memset — универсальная штука, а здесь расчитанно именно под конкретную задачу!!!

Ну очень близко:
int array[64];
memset(array, 0, 64);
0040110D 33 C0 xor eax,eax
0040110F B9 10 00 00 00 mov ecx,10h
00401114 8D 7C 24 08 lea edi,[esp+8]
00401118 F3 AB rep stos dword ptr [edi]
Re[8]: Как быстро обнулить массив?
От: Stanky  
Дата: 17.08.04 22:25
Оценка:
> Ну очень близко:
>
Ну ладно, пусть это тоже самое, что и memset, но как-нидь это мона ускорить?
Даст чего-нидь 64-х разрядная шина данных или нет?
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[8]: Как быстро обнулить массив?
От: Stanky  
Дата: 17.08.04 22:36
Оценка:
> 0040110F B9 10 00 00 00 mov ecx,10h
>
А вот это кстати враньё!!! Откуда в функции взялось конкретное значение количества элементов?
Тут должно быть: lea edi,[esp+4]!!!

Да и всё-равно memset универсальна и должна проверять размер на кратность 4, ну или адрес на границу двойного слова!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[9]: Как быстро обнулить массив?
От: Stanky  
Дата: 17.08.04 22:37
Оценка:
> Тут должно быть: lea edi,[esp+4]!!!
>
Упс: lea ecx,[esp+4]!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[9]: Как быстро обнулить массив?
От: Alex Fedotov США  
Дата: 17.08.04 22:37
Оценка:
Здравствуйте, Stanky, Вы писали:

>> 0040110F B9 10 00 00 00 mov ecx,10h

>>
S>А вот это кстати враньё!!! Откуда в функции взялось конкретное значение количества элементов?
S>Тут должно быть: lea edi,[esp+4]!!!

Так она ж инлайном встроена.

S>Да и всё-равно memset универсальна и должна проверять размер на кратность 4, ну или адрес на границу двойного слова!!!


Это если функция.
-- Alex Fedotov
Re[10]: Как быстро обнулить массив?
От: Alex Fedotov США  
Дата: 17.08.04 22:38
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Тут должно быть: lea edi,[esp+4]!!!

>>
S>Упс: lea ecx,[esp+4]!!!

Да не lea, а mov.
-- Alex Fedotov
Re[10]: Как быстро обнулить массив?
От: Stanky  
Дата: 18.08.04 03:12
Оценка:
> Это если функция.
>
Да ладно, не обращайте внимание — ночью на меня тупёж наступал!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: Как быстро обнулить массив?
От: zix Россия zix0.nm.ru
Дата: 18.08.04 04:59
Оценка:
Здравствуйте, Alfarn, Вы писали:

A>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!


Я думаю, быстрее чем команда STOS ничего найти не удастся...
Re[2]: Как быстро обнулить массив?
От: mokc0der  
Дата: 18.08.04 05:43
Оценка:
Здравствуйте, zix, Вы писали:

zix>Здравствуйте, Alfarn, Вы писали:


A>>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!


zix>Я думаю, быстрее чем команда STOS ничего найти не удастся...

если обнуляемый массив нормально выровнен через mmx быстрее будет
Re[3]: Как быстро обнулить массив?
От: zix Россия zix0.nm.ru
Дата: 19.08.04 07:40
Оценка:
Здравствуйте, mokc0der, Вы писали:

A>>>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!


zix>>Я думаю, быстрее чем команда STOS ничего найти не удастся...

M>если обнуляемый массив нормально выровнен через mmx быстрее будет

Точно!
Re[4]: Как быстро обнулить массив?
От: OpenGL  
Дата: 19.08.04 11:04
Оценка:
mmx,(3dnow, 3dnow+) sse, sse2 самое быстрое последнее 128 бит за цикл.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.