powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Оптимизация обработки массивов
22 сообщений из 22, страница 1 из 1
Оптимизация обработки массивов
    #33973038
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Допустим есть 2 массива (unsigned long, это тексели), длиной порядка 100.000,
и необходимы операции типа:
-заполнить одним значением
-применить операцию AND
Для заполнения одним значением memset не подойдет, т.к. он запишет одинаковые байты, а должны быть одинаковые longи.
Существуют ли пути оптимизации вычислений такого рода:
for(int i=0; i< ArraySize; i++)
ArrayOne &= ArrayTwo;
ASM-вставка нежелательна...
Спасибо.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973658
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceЗдравствуйте!
Допустим есть 2 массива (unsigned long, это тексели), длиной порядка 100.000,
и необходимы операции типа:
-заполнить одним значением
-применить операцию AND
Для заполнения одним значением memset не подойдет, т.к. он запишет одинаковые байты, а должны быть одинаковые longи.
Существуют ли пути оптимизации вычислений такого рода:
for(int i=0; i< ArraySize; i++)
ArrayOne &= ArrayTwo;
ASM-вставка нежелательна...
Спасибо.


Создайте массив

unsigned long arr[100];

заполните его нужными значениями , а потом скопируйте 1000 раз (memcpy).
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973710
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копировать лучше не счетчиком, а инкрементом индекса. Уйдет 100000 операций сложения
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973720
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Создайте массив unsigned long arr[100];заполните его нужными значениями , а потом скопируйте 1000 раз (memcpy).


+1
и маленьчкий коментарий...
memcpy нужно вызывать 30 раз всего...

(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973744
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда можно копировать по шагам.

Сначала в массив из 2 элементов, потом его 2 раза в массив из 4-х и т.д. будет 17 копирований. Елси начинать с 1000, как предложено, то будет 8 копирований.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973787
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняйте, но чт-то не догоняю...
И еще усложняющий момент: а если массив двухмерный, но хранится как одномерный...
т.е.
for(int x=minx; x<maxx; x++)
for(int y=miny; y<maxy; y++)
ArrayOne[y*1024 + x] = ArrayTwo[y*1024 + x];
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973790
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vector<long> v(1000000,0xabcdef01);
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33973976
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceИзвиняйте, но чт-то не догоняю...
И еще усложняющий момент: а если массив двухмерный, но хранится как одномерный...
т.е.
for(int x=minx; x<maxx; x++)
for(int y=miny; y<maxy; y++)
ArrayOne[y*1024 + x] = ArrayTwo[y*1024 + x];

вам начеркали вектор для оптмизации по скорости(Вам же по скорости треба было?). Дык вот, "за кулисами" memcpy стоит пересылка байт из одного куска в другой...на уровне одной команды проца... которая оптимальней всего (скорость) работает при пересылке...Отсюда имеем оптимум по скорости...как использовать этот инструментарий в зависимости от Вашего пересылаемого типа - дело десятое... Можно очертить рамки которые нужно соблюсти...
1) "симметричность" одного типа в бинарном представлении.
2) обработка составных частей отдельно, как в приведённом у Вас примере.


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974154
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как внутри устроен memcpy? Он реально намного быстрее копирования в цикле? Но вопрос -то скорее не в копировании, а ПРИМЕНЕНИИ ОПЕРАЦИИ, когда в цикле из одного массива в другой элемент не копируется, а между ними например |=.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974227
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вектор + алгоритмы - трансформ, например. Вообще не ясно - для чего оптимизировать по скорости инициализацию? Тут Круглый прав - memset написана на ASM. Но обычно чаще встречаются другие операции - т.е. после инициализации. Если скорость критична, то нужно писать свою функцию на ASM. Но инициализация 100 000 массива - явно очень малая величина.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974248
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceА как внутри устроен memcpy? Он реально намного быстрее копирования в цикле? Но вопрос -то скорее не в копировании, а ПРИМЕНЕНИИ ОПЕРАЦИИ, когда в цикле из одного массива в другой элемент не копируется, а между ними например |=.

1)
сам мэмкопи состоит из шагов оптимизатора, самого копирования и добивания остатка уже "ручками"...если массив большой то применяеться команда проца (386 и выше, если ничего не попутал)
rep movsd
это за каждый шажочек перекидывается по 4 байта...при этом сдвигаються вектора источника и приёмника, декрементируется счётчик цикла...она будет повторяться пока счётчик циклов не исчерпаеться...

(для сравнения)
то что Вы напишите на сях будет содержать в несколько десятков (если не сотен) раз БОЛЬШЕ команд при повторе каждой итерации...

2)
если Вам нужно копировать ручками, то это уже НЕ оптимально - соответственно задачу ставить нужно без этой формулировки. Иначе не корректно... Это, что то наподобие "дайте мне потяжелее кирпич, но не больше частички пыли..."

с уважением
(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974330
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0[(для сравнения)
то что Вы напишите на сях будет содержать в несколько десятков (если не сотен) раз БОЛЬШЕ команд при повторе каждой итерации...

Не уверен - оптимизирующий компилятор неплох, Массивы наверняка выравнены по началу, возможно тот же rep movs и будет, хотя - скорее по элементу будет, поскольку компилятор не знает - мультитредная программа или нет.

Кстати

...
volatile long MyBoundary
for(long i = 0; i < MyBoundary; i++) ...

и

long MyBoundary
for(long i = 0; i < MyBoundary; i++) ...

Во втором случае, предположительно, можно (1) и rep использовать и (2)MyBoundary в регистр загнать.

В первом каждый раз грузить MyBoundary.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974362
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
1)
сам мэмкопи состоит из шагов оптимизатора, самого копирования и добивания остатка уже "ручками"...если массив большой то применяеться команда проца (386 и выше, если ничего не попутал)
rep movsd
это за каждый шажочек перекидывается по 4 байта...при этом сдвигаються вектора источника и приёмника, декрементируется счётчик цикла...она будет повторяться пока счётчик циклов не исчерпаеться...

с уважением
(круглый)

Я не силен в АСМе, но мне кажется что там должна быть
функция(команда) которая копирует одну область памяти в другую,
без попадания данных в регистры проца. Просто по шине памяти.

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

Поправьте если я не прав.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974417
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Я не силен в АСМе, но мне кажется что там должна быть
функция(команда) которая копирует одну область памяти в другую,
без попадания данных в регистры проца. Просто по шине памяти....

для того, чтобы написать сишное memcpy, позвать отладчик и спуститься ниже - в потроха сей функции, гадать не треба..и предпологать..(заметьте) и думать даже !!! о чём я честно и написал выше...из чего состоит данная команда...

А PDP (прямой доступ к памтяи) - обычно используеться для других целей - общение(обслуга) переферии. Особенно низкоскоростной... Инициализируете память, переферию, пдп, прерывание (чтоб не спулить) и фассс...далее мона спокойно работать...прерывание Вам известит о конце утомительной пересылки из портов Ввода-вывода...

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974435
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
k> А PDP (прямой доступ к памтяи) - обычно используеться для
k> других целей - общение(обслуга) переферии. Особенно
k> низкоскоростной... Инициализируете память, переферию, пдп,
k> прерывание (чтоб не спулить) и фассс...далее мона спокойно
k> работать...прерывание Вам известит о конце утомительной
k> пересылки из портов Ввода-вывода
что такое PDP я не знаю, процессоры кажись так назывались :), а ПДП всю жизнь называлась на вражьем DMA - direct memory access, и использовалась как раз ускорения процесса обмена с внешними устройствами, чтобы НЕ читать/писать через порты
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974467
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameНе уверен - оптимизирующий компилятор неплох, Массивы наверняка выравнены по началу, возможно тот же rep movs и будет, хотя - скорее по элементу будет, поскольку компилятор не знает - мультитредная программа или нет.

Кстати

...
volatile long MyBoundary
for(long i = 0; i < MyBoundary; i++) ...

и

long MyBoundary
for(long i = 0; i < MyBoundary; i++) ...

Во втором случае, предположительно, можно (1) и rep использовать и (2)MyBoundary в регистр загнать.

В первом каждый раз грузить MyBoundary.

Вы, как то всё в кучу...
1) rep movs возможно у Вас примениться конструктором копийпо умолчанию, если не перекрыто по другому.Не даром говориться - байт, в байт будет скопировано (кстати во многих книгах очепятка..бит в бит)...
2) кол-во данных в массиве никаким рэксом не пересекаются с многопоточностью...Это перебор, к делу не относиться я бы сказал...
3) про множество шагов в сях имелось следующее...т.к. компилятор не всегда может рассчитать что Вам треба на выходе - то он пойдёт "официальным" путём...т.е. позовёт конструктор копий... вызовет перекрытый...не дай бог пару приведений проскочат...либо побочные операции...добавте сюда проверку на окончание, инкрементацию итератора...и Вы поймёте, что на каждом проходе у Вас получиться (условно) 20 шагов...за место 1...почуствуйте разницу!!!
В полне возможно и заставить оптимизатор сообразить - указав ему "пару ласковых"...но думаю это ышо хуже чем писать скажем на том же самом азме всю логику...чуть что не так (не та версия оптимизатора) и алес...вся Ваша работа - коту под хвост...в этом случае вариант с мэмкопи - удачнее...
4) переменные могут располагаться как в регистре, так и на стэке. Думаю влазить на уровень оптимизатора и пытаться соображать как его писали - дело не благодарное...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974478
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабасчто такое PDP я не знаю, процессоры кажись так назывались :), а ПДП всю жизнь называлась на вражьем DMA - direct memory access, и использовалась как раз ускорения процесса обмена с внешними устройствами, чтобы НЕ читать/писать через порты
Posted via ActualForum NNTP Server 1.3

сэнкс за поправку...да, пэдэпэ - это слэнг...скляроз..
и для регенерации памяти ышо...кстати..
один из портов 8255 PPI, по старой "экстишной класификации" этим занимался...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33974765
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0Вы, как то всё в кучу...
1) rep movs возможно у Вас примениться конструктором копийпо умолчанию, если не перекрыто по другому.Не даром говориться - байт, в байт будет скопировано (кстати во многих книгах очепятка..бит в бит)...
2) кол-во данных в массиве никаким рэксом не пересекаются с многопоточностью...Это перебор, к делу не относиться я бы сказал...
3) про множество шагов в сях имелось следующее...т.к. компилятор не всегда может рассчитать что Вам треба на выходе - то он пойдёт "официальным" путём...т.е. позовёт конструктор копий... вызовет перекрытый...не дай бог пару приведений проскочат...либо побочные операции...добавте сюда проверку на окончание, инкрементацию итератора...и Вы поймёте, что на каждом проходе у Вас получиться (условно) 20 шагов...за место 1...почуствуйте разницу!!!
В полне возможно и заставить оптимизатор сообразить - указав ему "пару ласковых"...но думаю это ышо хуже чем писать скажем на том же самом азме всю логику...чуть что не так (не та версия оптимизатора) и алес...вся Ваша работа - коту под хвост...в этом случае вариант с мэмкопи - удачнее...
4) переменные могут располагаться как в регистре, так и на стэке. Думаю влазить на уровень оптимизатора и пытаться соображать как его писали - дело не благодарное...


удачи Вам
(круглый)
1. Угу.
2. Это не так. Предположим, что массив - очередь, в которую пишут много потоков.
3. Согласен, но речь шла о long.
4. Речь шла о volatile переменной.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33975127
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0для того, чтобы написать сишное memcpy, позвать отладчик и спуститься ниже - в потроха сей функции, гадать не треба..и предпологать..(заметьте) и думать даже !!! о чём я честно и написал выше...из чего состоит данная команда...у маздая можно подсмотреть её сорцы.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33975313
a_s_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TopSpace
хоть асм вставка и не желательна
заполнить массив 1 значением
mov eax,var ;var-значение
lea edi,second_array ;начало массива
mov ecx,array_size ;размер массива в байтах
shr ecx,2 ;этого не надо если в предыдущей строке вы занесли в есх количество dword-ов а не байт
cld
rep stosd ;заполняем

проэндить массивы
lea esi,first_mass
lea edi,second_mass
mov ecx,array_size
shr ecx,2
next:
mov eax,dword ptr [edi]
and dword ptr [esi],eax
add edi,4
add esi,4
dec ecx
jne next

nikname
Но инициализация 100 000 массива - явно очень малая величина.
прав конечно, но зависит и от частоты инициализации
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33975551
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot a_s_d nikname
Но инициализация 100 000 массива - явно очень малая величина.
прав конечно, но зависит и от частоты инициализации[/quot]
От чего бы ни зависело, но явно оптимизировать лучше & или |.
...
Рейтинг: 0 / 0
Оптимизация обработки массивов
    #33977952
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname
2. Это не так. Предположим, что массив - очередь, в которую пишут много потоков.
3. Согласен, но речь шла о long.
4. Речь шла о volatile переменной.

2. Вы предпологаете что в Вашу очередь пишут куча потоков без объекта синхронизации ? тогда удачи Вам - она Вам потребуется...
3. и что ? или Вы хотите сказать, что для лонга другие требования ? т.е. нельзя перекрыть методы сравнения, присвоения и т.д. ?
4. это ышо добавляет дополнительные шаги в цикле...загрузка, сравнение, операции, пересылки.

(круглый)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Оптимизация обработки массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]