адресация в двумерном массиве, масм, win

Тема в разделе "WASM.BEGINNERS", создана пользователем ThunderCode, 20 дек 2008.

  1. ThunderCode

    ThunderCode New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    4
    здравствуйте
    как обращаться к элементам-dword двумерного массива (двойные слова по 6 шт в строке)? масштабирование разрешает коэфицент не больше 8, а в моём случае он должен быть 24
    приходится умножать индекс строки в eax на 24, и обращаться
    str[eax+регистр_с_индексом_столбца_умноженый_на_4] - есть ли какие другие более быстрые/короткие пути?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?pid=169885#p169885
    кстати запись в форме [base+scale*index] "красивее" но не быстрее чем "самостоятельное вычисление" адреса.
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Y_Mur
    Хочешь сказать, что
    Код (Text):
    1. imul eax,edx,24
    2. mov eax,[base+eax]
    Будет быстрее чем
    Код (Text):
    1. lea eax,[ebx*2+ebx]
    2. mov eax,[base+eax*8]
    И этого
    Код (Text):
    1. mov eax,ebx
    2. shl eax,3
    3. mov eax,[base+eax*2+eax]
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    ?? Вычисление адресов операндов памяти производится на отдельных спецблоках и соотв-но может производиться параллельно с операциями АЛУ, а "самостоятельное вычисление" ес-но занимает АЛУ и может мешать другим операциям. А вот mov eax,[edx] и mov eax,[edx+ecx*8+offs] действительно выполняются за одно время
     
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    На 64-битных можно так
    Код (Text):
    1. shld eax,ebx,35
    2. mov eax,[base+eax*2+eax]
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    перепроверил - действительно с поправкой на некоторые любопытные аномалии так и есть - "выполняются за одно время" (примерно) - это меня глюк в одном из прошлых тестов ввёл в заблуждение.

    murder
    я имел в виду что при "самостоятельном вычислении" нередко можно вообще отказаться от сдвига\умножения немного подкорректировав понятие "индекс" :))
     
  7. ThunderCode

    ThunderCode New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    4
    решил индексировать строки не по 1, а по 3 - соответственно str[esi*8+edi] даст тот же адрес что и str[eax*24+edi]
    а на выводе буду просто делить на 3

    потому что вывода в моём случае будет раз в 100 000 меньше, чем циклов с индексацией
    то-есть 1 деление на 3 + 300 000 inc против 100 000 умножений на 24 + 100 000 inc
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    leo
    Не везде. Что касается P4
    Intel
    LEA разбивается на микро инструкции. Это же подтверждает Агнер фог. Латентность больше и мопсов больше. В зависимости от вида инструкции.
    На других процесорах по другому. У AMD64 за такт для любого случая.

    ThunderCode
    Что ксается цикла то тут можно в замен умножение использовать счетчик цикла который будет увеличиваться/уменьшаться на длину строки. Тем самым мы избавимся от умножения как такового.
     
  9. ThunderCode

    ThunderCode New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    4
    Pavia,
    непонимаю
    можно пример?
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    ThunderCode

    К примеру массив 6x12

    Код (Text):
    1. mov edx,5
    2. mov eax,x
    3. shl  eax,2
    4. mov ebx,0
    5. mov ecx,12
    6. @pp:
    7. lea ebx,[ebx*2+ebx]
    8. add dword [base+ebx*8+eax],edx
    9. add  ebx,1
    10. loop @pp
    Тут экономим умножения.
    Код (Text):
    1. mov edx,5
    2. mov eax,x
    3. shl  eax,2
    4. lea eax,[base+eax+11*6*4] ;11*4*6- константа
    5. @pp:
    6. add dword [eax],edx
    7. sub eax,6*4,   ; Цикл в loop входило dec cx
    8. jae @pp   ; Если больше или равно
     
  11. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Pavia
    Код (Text):
    1. @pp:
    2. add dword [eax],edx
    3. sub eax,6*4,   ; Цикл в loop входило dec cx
    4. jae @pp
    Меня очень удивило, что ТЫ написал ТАКОЕ. Ведь при движении в обратном направлении будет происходить чтение не из кеша, а из памяти.

    Может я неправ? Разъясни.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    murder
    Круто сказано :)))
    Во первых даже если hardware prefetch однонаправленный, то это сказывается только на первом обращении к очередной линейке КЭШ, последующие обращения кешированы независимо от того с какой стороны считан первый byte/dword ;)
    Но в современных камушках:
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Pavia
    Я имел в виду вычисление адресов операций, реально обращающихся к памяти (mov, add и т.д.) - на всех процессорах они выполняются на спецблоках (в атлонах - AGU, в пеньках - load data или store address).
    LEA же только вычисляет адрес и к памяти не обращается. В атлонах LEA выполняется на AGU и соотв-но может влиять на поток команд load\store, а в пеньках - на АЛУ и соотв-но должна учитываться в потоке АЛУ-команд.
    Ну а про первые P4 и говорить нечего, т.к. это наспех состряпанные "пробные камни", у которых ни спец.целочисленного умножителя нет, ни сдвигателя (все на ММХ делается), ни соотв-но и спецподдержки LEA. К тому же и T-кэш куций - в одном мопе может храниться только 16 битное непосредственое значение и вторые половинки 32-битных рассовываются по соседним или дополнительным мопам ?!