Я согласен с комментариями, что это, вероятно, хорошая идея вернуться к «C» (или что-нибудь действительно) эталонному дизайну и, возможно, начать с нуля. В частности, вы обнаружите, что, возможно, у NEON есть несколько более оптимальных способов делать что-то в некоторых случаях. Но если вы обнаружите, что вам нужно сделать, почти одинаковые вещи, вот некоторые советы:
_mm_srli_si128 (result1, 1);
Try VEXT.S8 Qdst, свободная энциклопедия, Qsrc2, # 1, где src2 был сброшен в 0.
_mm_packus_epi16 (res1,res2);
Попробуйте VQMOVN.S16 DDST , Qsrc. Ключевое слово при поиске альтернатив является «узким». Вы двигаетесь с сужением. «Q» - NEON-номенклатура для насыщения. У вас может быть проблема, потому что вы выполняете подписку на unsigned, что я не уверен, что NEON поддерживает, но ваш вариант использования может быть в порядке, но вот почему справки и тесты хороши!
_mm_storeu_si128 (__m128i *p, __m128i a);
Очевидно, что существует VSTM, и здесь есть много вариантов. Вы, вероятно, захотите посмотреть на это в деталях.
Этот вид перевода SIMD intrinsics 1: 1 не очень подходит для SSE -> Neon - вам действительно нужно вернуться к скалярной реализации ссылок, а затем реализовать это в Neon с нуля. Часто есть более подходящий подход, который больше подходит для доступных инструкций/встроенных функций. –
Не могли бы вы дать мне более конкретную информацию о том, как это сделать? Я никогда не делал этого, и мне нужно всего лишь преобразовать несколько инструкций, но я действительно борется. Спасибо. – user1926328
Сделайте это в два этапа: (1) переконвертируйте SSE-код в скалярную форму (то есть прямолинейный C-код), затем проверьте/сравните/профилируйте его, чтобы (a) убедиться, что он работает правильно и (b) определить, действительно ли это это высокая производительность, которая должна быть оптимизирована; то (2), если (1b) указывает, что код нужно оптимизировать, вам нужно пройти кривую обучения Neon и реализовать код с использованием Neon SIMD intrinsics или ассемблера. В идеале вы хотите избежать (2), если это возможно. –