Перемножить 4 32битных целых за раз

Тема в разделе "WASM.BEGINNERS", создана пользователем xRom2, 5 дек 2011.

  1. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Возможно ли перемножить 4 32битных целых за раз наплевав на возможное переполнение?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    xRom2
    Зачем плевать на переполнение? Команда pmuludq умножает младшие 32-разрядные целые числа 128-разрядных операндов SRC и DEST. Результатом умножения является 128-разрядное число. Операнд SRC может находиться в MMX/XMM-регистре или в 128-разрядной ячейке памяти; операнд DEST должен находиться в MMX/XMM-регистре. Операнд SRC имеет вид Хa1Хa0, операнд DEST -- Xb1Xb0, где Х --любое 32-разрядное число, результат равен a1*b1a0*b0. Одновременно умножив четыре 32-разрядных a0, a1, b0, b1 получаем 128-разрядный результат, у которого разряды с 127 по 64 содержат a1*b1, а число в разрядах с 63 по 0-ой равно a0*b0
     
  3. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    О, большое спасибо, я как-то про ссе и не подумал. Ща поищу мануал, дело я смотрю хорошее, скорости может прибавить изрядно. Тока его ж теперь придется проверять, а есль ли оно....
     
  4. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Если 3 из них можно представить степенью 2 то перемножить можно очень быстро, быстрее даже стандартных команд умножения - mul, посто сдвигая влево на показатель степени.
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Это было во времена 86-х процессоров и 286. На Пеньках умножение не медленнее чем сдвиг.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В плане латентности (получения результата) конечно медленнее. Другое дело, что в современных камнях умножение полностью конвееризовано и соотв-но независимые друг от друга умножения могут выполняться с разницей в 1 такт (особенно imul без лишних регистровых пересылок)
     
  7. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Может быть можно пересмотреть организацию данных так, чтоб параллельно выполнялись умножения из четырех разных групп чисел, используя PMULLD из SSE4?
    Для еще большей оптимизации - выполнять умножения внутри каждой группы с частичным перекрытием, вместо A*B*C*D выполнять (A*B)*(C*D).