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 из них можно представить степенью 2 то перемножить можно очень быстро, быстрее даже стандартных команд умножения - mul, посто сдвигая влево на показатель степени.
В плане латентности (получения результата) конечно медленнее. Другое дело, что в современных камнях умножение полностью конвееризовано и соотв-но независимые друг от друга умножения могут выполняться с разницей в 1 такт (особенно imul без лишних регистровых пересылок)
Может быть можно пересмотреть организацию данных так, чтоб параллельно выполнялись умножения из четырех разных групп чисел, используя PMULLD из SSE4? Для еще большей оптимизации - выполнять умножения внутри каждой группы с частичным перекрытием, вместо A*B*C*D выполнять (A*B)*(C*D).