Суть задачи такова: надо найти сумму (по байтно) всех элементов 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 хранит результат .................. Оптимально ли это, можноли сделать лучьше?
Просуммировав 18 байт, к примеру, FFh - должно получится 11EEh, в bl ведь не влезает или переносы не учитываются?
Расположи вектора в памяти друг за другом и напиши так xor eax,eax xor ebx,ebx lea esi,v1 ;v1 - первый вектор mov ecx,18 sum: lodsb add ebx,eax loop sum если все 3 вектора попадут в кэш, то сложение пойдет очень быстро
lodsb и loop заменить не проблема (можно цикл вообще убрать), я вот думаю получится ли складывать не байтами а двойными словами? Т.е. складывать целые беззнаковые числа двордами, а потом результат привести к виду, если бы мы складывали байтами, на рисунке видно, что какая-то зависимость есть (какая не скажу, у меня пока по математике 2+) На рисунке всего 8 байт, представьте, что их будет на много больше, но кратно 4-м. Получив синее, нужно найти красное 1682371043__addbyte.png
А блин ... Наверное не получится, зависимость пропадает если байты разные (пошел я учить математику, пока не послали
тормоза или нет, но если такое сложение не должно происходить 10^9 раз в секунду, то можно и так написать. Главное коротко и без ошибок.