2016-08-16 11 views
1

встроенных функций Я хочу, чтобы загрузить некоторые значения из таблицы и установить их в вектор: в первом случае установить четыре значения вектора к:Невозможно установить вектор 4 floatx32 с ARM NEON

float32x4_t dest = vdupq_n_f32(a); 

Это было так очевидно, когда я прочитал руководство по внутреннему ремонту.

во втором случае установите четыре значения вектора в разные значения из таблицы. Это было немного сложно, потому что нет никакой инструкции для этого, так что я сделал следующее:

float32x4_t dest = {a3,a2,a1,a0}; 

это не внутренний, но, основываясь на других публикациях и форумах в Сети это было единственным решением для меня , К сожалению, я получаю эту ошибку:

error: expected expression before ‘{’ token 

У кого-нибудь может быть альтернатива?

+1

Какой компилятор вы используете? Это должно работать с gcc, clang, et al. –

+0

ARM-gnueabi-gcc с eclipse Mars –

ответ

4

Если ваш компилятор не поддерживает прямую инициализацию (например, вы используете что-то другое, кроме gcc или clang), вам нужно будет явно загрузить значения, например.

const float init[4] = {a3,a2,a1,a0}; 
float32x4_t dest = vld1q_f32(init); 

Обратите внимание, что появляется ваш первый пример неправильно - если вы пытаетесь установить все 4 векторных элементов к тому же значению (например, SSE-х _mm_set1_ps), то вы будете хотеть использовать что-то вроде vdupq_n_f32.

+0

Ahh Я ищу производительность .... вроде бы все остальные команды будут ждать, пока массив init не будет заполнен, а затем загружен в dest –

+0

Обычно этот тип векторной инициализации выполняется только один раз, например. в начале функции, перед любыми критически важными циклами, поэтому несколько циклов здесь или там не должны иметь никакого значения для производительности. Если вы посмотрите на код, сгенерированный, например, '_mm_set_ps' вы увидите, что это слишком типично приводит к нескольким инструкциям (не обманывайте себя, думая, что все внутренности соответствуют одной команде). –

+0

вы на 100% прав, но проблема в том, что вещь настройки вызывается много раз в цикле ... в версии X86 время очень хорошее, но в ARM-версии не так, как ожидалось ... Для ARM серийная версия намного быстрее, чем версия SIMD, и это меня смутило. –