Какой самый быстрый способ выполнить горизонтальную сумму на word32 для процессоров qualcomm hexagon 600

Я смотрел на встроенную для серии 600, и нет встроенной горизонтальной суммы для hvx, подобной той, что на x86. Я искал что-то, что позволяет мне реверсировать содержимое регистра, чтобы я мог непрерывно добавлять реверс регистра к себе, пока не получу правильную сумму, которую я могу извлечь.


person Karim Mohamed Hasebou    schedule 24.06.2018    source источник
comment
Неон имеет вектор многократного накопления. Возможно, вы сможете умножить на один вектор, а затем накопить результат, чтобы получить то, что хотите. Этот чип также имеет графический процессор, вы можете написать старомодное ядро ​​​​GPGPU в openGL, чтобы сделать это. GPU и CPU, вероятно, совместно используют память, поэтому, если вы все сделаете правильно, никакой сортировки.   -  person gct    schedule 24.06.2018
comment
@SeanMcAllister Но это означает, что я сначала должен переместить данные из регистра hvx в какой-то массив, а затем загрузить их во встроенный неон. не будет ли это потреблять много времени.   -  person Karim Mohamed Hasebou    schedule 24.06.2018
comment
@SeanMcAllister Извините, я забыл упомянуть в вопросе, что использую hvx   -  person Karim Mohamed Hasebou    schedule 24.06.2018
comment
Ах, я вижу, это всего лишь один регистр hvx? или суммирование большего массива? Глядя на справочник программиста, есть есть инструкция умножения с накоплением (vrmpy), которую вы можете умножить на 1 вектор и уменьшить до одного значения в HVX.   -  person gct    schedule 24.06.2018
comment
@SeanMcAllister - это одно 32-битное целое число hvx, которое было результатом умножения-уменьшения 4way на 8-битном векторе hvx без знака.   -  person Karim Mohamed Hasebou    schedule 24.06.2018
comment
@SeanMcAllister просматривая vrmpy, я вижу, что не принимаю 32-битный ввод   -  person Karim Mohamed Hasebou    schedule 24.06.2018


Ответы (1)


Чтобы уменьшить вектор на HVX, используйте log2 шагов valign / vror и ваш оператор (max/min/add/etc)

Вы можете использовать vdelta/vrdelta для реверсирования регистра, но я думаю, что вместо этого вам нужен поворот.

Вот пример сокращения двух векторов слов (одного частичного минимума и одного частичного максимума) для получения общего минимума и максимума:

https://source.codeaurora.org/quic/hexagon_nn/nnlib/tree/hexagon/asm_src/vrmaxmin_h.S

person Erich Plondke    schedule 25.06.2018