Сумма элементов 3-х векторов

Тема в разделе "WASM.ASSEMBLER", создана пользователем Konstantin, 14 ноя 2004.

  1. Konstantin

    Konstantin New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2004
    Сообщения:
    1
    Суть задачи такова: надо найти сумму (по байтно) всех элементов 3-х векторов (в каждом векторе 6 байт). Я реализовал это так

    ......................

    ; movq MM4 маска $FFFFFF0000000000

    ........................

    ; movq MM1 1-й вектор

    ; movq MM2 2-й вектор

    ; movq MM3 3-й вектор

    paddsb MM1,MM2;

    paddsb MM1,MM3;

    movq MM0,MM1;

    psrlq MM1,24;

    PAND MM1,MM4;

    PAND MM0,MM4;

    paddsb MM0,MM1;

    movd eax,MM0;

    xor ebx,ebx;

    add bl,al;

    add bl,ah;

    shr eax, 16;

    add bl,al; bl хранит результат

    ..................

    Оптимально ли это, можноли сделать лучьше?
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Просуммировав 18 байт, к примеру, FFh - должно получится 11EEh, в bl ведь не влезает или переносы не учитываются?
     
  3. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Расположи вектора в памяти друг за другом и напиши так

    xor eax,eax

    xor ebx,ebx

    lea esi,v1 ;v1 - первый вектор

    mov ecx,18

    sum:

    lodsb

    add ebx,eax

    loop sum



    если все 3 вектора попадут в кэш, то сложение пойдет очень быстро
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    lodsb и loop == тормоза.
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    lodsb и loop заменить не проблема (можно цикл вообще убрать), я вот думаю получится ли складывать не байтами а двойными словами? Т.е. складывать целые беззнаковые числа двордами, а потом результат привести к виду, если бы мы складывали байтами, на рисунке видно, что какая-то зависимость есть (какая не скажу, у меня пока по математике 2+)



    [​IMG]



    На рисунке всего 8 байт, представьте, что их будет на много больше, но кратно 4-м. Получив синее, нужно найти красное



    [​IMG] 1682371043__addbyte.png
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А блин ... Наверное не получится, зависимость пропадает если байты разные (пошел я учить математику, пока не послали :)
     
  7. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    тормоза или нет, но если такое сложение не должно происходить 10^9 раз в секунду, то можно и так написать. Главное коротко и без ошибок.