|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 10, 2004 15:31:49 Речь идет о сложении чисел в системе остаточных классов. (см. Модулярная арифметика, например у Кнута или Система Остаточных Классов (СОК) (Юдицкий, Акушский)). Ссылка в тему: http://www.borz.ru/articles/sok/sok.html Пусть в регистре xmm0 находится вектор модулей pv ( 16 модулей p[i] i=0...15 по байту на каждый), в регистре xmm1 находится вектор xv (остатки от деления некого числа X на сооветствующие модули)( x[i]=X mod(p[i]) ), а в регистре xmm2 аналогичный вектор yv ( y[i]=Y mod(p[i]) ). Хочется максимально быстро получить в регистре xmm3 сумму xv+yv по модулю pv (z[i]=(x[i]+y[i]) mod(p[i]). Код работающий у меня сейчас: ; xmm0 - p[i] ; xmm1 - x[i] ; xmm2 - y[i] movdqa xmm3,xmm1 paddb xmm3,xmm2 movdqa xmm7,xmm3 pminub xmm7,xmm0 pcmpeqb xmm7,xmm0 pand xmm7,xmm0 psubb xmm3,xmm7 ; xmm3=z[i]=(x[i]+y[i]) mod(p[i]) Это работает при условии, что все p[i]<128, или p[i]=256 Если p[i]<64, то можно сделать быстрее: movdqa xmm3,xmm1 paddb xmm3,xmm2 movdqa xmm7,xmm3 pcmpgtb xmm7,xmm0 pand xmm7,xmm0 psubb xmm3,xmm7 ; xmm3=z[i]=(x[i]+y[i]) mod(p[i]) Как бы посчитать это еще быстрее да и для любых p[i]<=256 ??? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057 |