|
|
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Допустим есть 2 массива (unsigned long, это тексели), длиной порядка 100.000, и необходимы операции типа: -заполнить одним значением -применить операцию AND Для заполнения одним значением memset не подойдет, т.к. он запишет одинаковые байты, а должны быть одинаковые longи. Существуют ли пути оптимизации вычислений такого рода: for(int i=0; i< ArraySize; i++) ArrayOne &= ArrayTwo; ASM-вставка нежелательна... Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 10:28 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
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). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 12:51 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Копировать лучше не счетчиком, а инкрементом индекса. Уйдет 100000 операций сложения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:00 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
onstat-Создайте массив unsigned long arr[100];заполните его нужными значениями , а потом скопируйте 1000 раз (memcpy). +1 и маленьчкий коментарий... memcpy нужно вызывать 30 раз всего... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:01 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Тогда можно копировать по шагам. Сначала в массив из 2 элементов, потом его 2 раза в массив из 4-х и т.д. будет 17 копирований. Елси начинать с 1000, как предложено, то будет 8 копирований. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:07 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Извиняйте, но чт-то не догоняю... И еще усложняющий момент: а если массив двухмерный, но хранится как одномерный... т.е. for(int x=minx; x<maxx; x++) for(int y=miny; y<maxy; y++) ArrayOne[y*1024 + x] = ArrayTwo[y*1024 + x]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:15 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
vector<long> v(1000000,0xabcdef01); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:16 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
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) обработка составных частей отдельно, как в приведённом у Вас примере. удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 13:44 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
А как внутри устроен memcpy? Он реально намного быстрее копирования в цикле? Но вопрос -то скорее не в копировании, а ПРИМЕНЕНИИ ОПЕРАЦИИ, когда в цикле из одного массива в другой элемент не копируется, а между ними например |=. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:09 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Вектор + алгоритмы - трансформ, например. Вообще не ясно - для чего оптимизировать по скорости инициализацию? Тут Круглый прав - memset написана на ASM. Но обычно чаще встречаются другие операции - т.е. после инициализации. Если скорость критична, то нужно писать свою функцию на ASM. Но инициализация 100 000 массива - явно очень малая величина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:21 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
TopSpaceА как внутри устроен memcpy? Он реально намного быстрее копирования в цикле? Но вопрос -то скорее не в копировании, а ПРИМЕНЕНИИ ОПЕРАЦИИ, когда в цикле из одного массива в другой элемент не копируется, а между ними например |=. 1) сам мэмкопи состоит из шагов оптимизатора, самого копирования и добивания остатка уже "ручками"...если массив большой то применяеться команда проца (386 и выше, если ничего не попутал) rep movsd это за каждый шажочек перекидывается по 4 байта...при этом сдвигаються вектора источника и приёмника, декрементируется счётчик цикла...она будет повторяться пока счётчик циклов не исчерпаеться... (для сравнения) то что Вы напишите на сях будет содержать в несколько десятков (если не сотен) раз БОЛЬШЕ команд при повторе каждой итерации... 2) если Вам нужно копировать ручками, то это уже НЕ оптимально - соответственно задачу ставить нужно без этой формулировки. Иначе не корректно... Это, что то наподобие "дайте мне потяжелее кирпич, но не больше частички пыли..." с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:25 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:37 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
kolobok0 1) сам мэмкопи состоит из шагов оптимизатора, самого копирования и добивания остатка уже "ручками"...если массив большой то применяеться команда проца (386 и выше, если ничего не попутал) rep movsd это за каждый шажочек перекидывается по 4 байта...при этом сдвигаються вектора источника и приёмника, декрементируется счётчик цикла...она будет повторяться пока счётчик циклов не исчерпаеться... с уважением (круглый) Я не силен в АСМе, но мне кажется что там должна быть функция(команда) которая копирует одну область памяти в другую, без попадания данных в регистры проца. Просто по шине памяти. Во всяком случае так было бы логично делать при копировании больших обьемов, чтобы не выбивать из кеша процессора более нужную информацию. А процессор после отдачи такой команды может заняться другим делом если оно не противоречит фоновой операции проводимой контроллером шины. Например изменить значения счетчиков в регистрах. Поправьте если я не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:43 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
onstat-Я не силен в АСМе, но мне кажется что там должна быть функция(команда) которая копирует одну область памяти в другую, без попадания данных в регистры проца. Просто по шине памяти.... для того, чтобы написать сишное memcpy, позвать отладчик и спуститься ниже - в потроха сей функции, гадать не треба..и предпологать..(заметьте) и думать даже !!! о чём я честно и написал выше...из чего состоит данная команда... А PDP (прямой доступ к памтяи) - обычно используеться для других целей - общение(обслуга) переферии. Особенно низкоскоростной... Инициализируете память, переферию, пдп, прерывание (чтоб не спулить) и фассс...далее мона спокойно работать...прерывание Вам известит о конце утомительной пересылки из портов Ввода-вывода... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 14:56 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
kolobok0 k> А PDP (прямой доступ к памтяи) - обычно используеться для k> других целей - общение(обслуга) переферии. Особенно k> низкоскоростной... Инициализируете память, переферию, пдп, k> прерывание (чтоб не спулить) и фассс...далее мона спокойно k> работать...прерывание Вам известит о конце утомительной k> пересылки из портов Ввода-вывода что такое PDP я не знаю, процессоры кажись так назывались :), а ПДП всю жизнь называлась на вражьем DMA - direct memory access, и использовалась как раз ускорения процесса обмена с внешними устройствами, чтобы НЕ читать/писать через порты Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 15:00 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
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) переменные могут располагаться как в регистре, так и на стэке. Думаю влазить на уровень оптимизатора и пытаться соображать как его писали - дело не благодарное... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 15:07 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
Карабас Барабасчто такое PDP я не знаю, процессоры кажись так назывались :), а ПДП всю жизнь называлась на вражьем DMA - direct memory access, и использовалась как раз ускорения процесса обмена с внешними устройствами, чтобы НЕ читать/писать через порты Posted via ActualForum NNTP Server 1.3 сэнкс за поправку...да, пэдэпэ - это слэнг...скляроз.. и для регенерации памяти ышо...кстати.. один из портов 8255 PPI, по старой "экстишной класификации" этим занимался... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 15:09 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
kolobok0Вы, как то всё в кучу... 1) rep movs возможно у Вас примениться конструктором копийпо умолчанию, если не перекрыто по другому.Не даром говориться - байт, в байт будет скопировано (кстати во многих книгах очепятка..бит в бит)... 2) кол-во данных в массиве никаким рэксом не пересекаются с многопоточностью...Это перебор, к делу не относиться я бы сказал... 3) про множество шагов в сях имелось следующее...т.к. компилятор не всегда может рассчитать что Вам треба на выходе - то он пойдёт "официальным" путём...т.е. позовёт конструктор копий... вызовет перекрытый...не дай бог пару приведений проскочат...либо побочные операции...добавте сюда проверку на окончание, инкрементацию итератора...и Вы поймёте, что на каждом проходе у Вас получиться (условно) 20 шагов...за место 1...почуствуйте разницу!!! В полне возможно и заставить оптимизатор сообразить - указав ему "пару ласковых"...но думаю это ышо хуже чем писать скажем на том же самом азме всю логику...чуть что не так (не та версия оптимизатора) и алес...вся Ваша работа - коту под хвост...в этом случае вариант с мэмкопи - удачнее... 4) переменные могут располагаться как в регистре, так и на стэке. Думаю влазить на уровень оптимизатора и пытаться соображать как его писали - дело не благодарное... удачи Вам (круглый) 1. Угу. 2. Это не так. Предположим, что массив - очередь, в которую пишут много потоков. 3. Согласен, но речь шла о long. 4. Речь шла о volatile переменной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 16:22 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
kolobok0для того, чтобы написать сишное memcpy, позвать отладчик и спуститься ниже - в потроха сей функции, гадать не треба..и предпологать..(заметьте) и думать даже !!! о чём я честно и написал выше...из чего состоит данная команда...у маздая можно подсмотреть её сорцы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 18:02 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
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 массива - явно очень малая величина. прав конечно, но зависит и от частоты инициализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2006, 19:30 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
[quot a_s_d nikname Но инициализация 100 000 массива - явно очень малая величина. прав конечно, но зависит и от частоты инициализации[/quot] От чего бы ни зависело, но явно оптимизировать лучше & или |. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2006, 00:02 |
|
||
|
Оптимизация обработки массивов
|
|||
|---|---|---|---|
|
#18+
nikname 2. Это не так. Предположим, что массив - очередь, в которую пишут много потоков. 3. Согласен, но речь шла о long. 4. Речь шла о volatile переменной. 2. Вы предпологаете что в Вашу очередь пишут куча потоков без объекта синхронизации ? тогда удачи Вам - она Вам потребуется... 3. и что ? или Вы хотите сказать, что для лонга другие требования ? т.е. нельзя перекрыть методы сравнения, присвоения и т.д. ? 4. это ышо добавляет дополнительные шаги в цикле...загрузка, сравнение, операции, пересылки. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2006, 13:42 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=336&tid=2030532]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 330ms |

| 0 / 0 |
