Вопрос о умножении вектора на скаляр при 8-битном типе данных с использованием сборки aarch64 - PullRequest
0 голосов
/ 16 октября 2018

Я решал проблему, которая умножала 8-битный массив A на 8-битный массив B.

Здесь я рассматриваю A как вектор, а каждый элемент в B - как скаляр.

Например, если А равен {1,2,3,4,5,6,7,8}, а В равен {1,2},

Тогда я получу {1,1,1,1,1,1,1,1} x {1,2,3,4,5,6,7,8} + {2,2,2,2,2,2,2,2} x {1,2,3,4,5,6,7,8}, здесь «+» означает «конкат».

Но меня это смутило.

Я знаю, что это можетсделать это, когда тип данных 16-битный или 32-битный от https://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf

Я вижу, что

SMULL Vd.<Ta>, Vn.<Tb>, Vm.<Ts>[index]
Signed integer multiply long (vector, by element). Where <Ta>/<Tb>/<Ts> is 4S/4H/H or 2D/2S/S. If <Ts>
is H, then Vm must be in the range V0-V15

Но есть только H, D или S, Bне поддерживается.

Если вместо этого я использую DUP , я буду использовать гораздо больше неоновых регистраторов для сохранения данных, а это значит, что если данные Vn.16B, то я должениспользуйте инструкции 16 DUP для загрузки данных 16 Вм.8B, а затем умножьте каждое на A. Однако, если я могу использовать SMULL , я просто использую один неоновый регистр для сохраненияданные, потому что я могу использовать индекс для представления скаляра.

Я не знаю, есть ли другой эффективный способ добиться этого?Есть предложения?

...