2012-04-20 1 views
0


Мне нужно добавить/mul/sub две переменные __m128 (float) с использованием рамки ускорения. Но я не могу найти функцию для этого. Все функции функции ускорения принимают тип вместо float__vector__ типа. Я нахожу функцию для деления 'vdivf', но мне нужно добавить/mul/sub тоже.

Может ли кто-нибудь сказать мне, как добавить/mul/sub два переменные __m128 (float), используя Accelerate framework? Что-то вроде этого: _mm_add_ps, _mm_sub_ps, _mm_mul_ps, но с использованием API-интерфейсов Accelerate.Добавление двух типов __m128 через раструю ускорения

+0

Почему вы считаете, что для этого нужно использовать ускорение Framework? Почему бы просто не использовать внутренние функции напрямую? –

+0

Я думаю, что если Apple предоставит API для использования MMX, SSE и т. Д., Будет лучше использовать этот API. Мне нужно поддерживать семейство процессоров PPC и Intel, Accelerate framework будет автоматически обрабатываться командой CPU. Кроме того, если что-то будет изменено в будущем, я думаю, что, используя систему ускорения, мне нужно будет сделать меньше изменений. – Lexandr

+0

ОК, но вы не хотите называть функции ускорения только для отдельных векторов - это было бы безнадежно неэффективным и бессмысленным - вам нужно обрабатывать массивы с разумным размером, иначе служебные вызовы функций будут уничтожать любые выгоды от использования SIMD. –

ответ

-1

Вам не нужен API для основных арифметических действий:

__m128 x, y; 
__m128 z = x + y; 
__m128 w = x - y; 
__m128 t = x * y; 

АНИ было бы совершенно ненужным для этих операций, поэтому ускорение не один.

При этом, если у вас есть существующий код, который использует SSE-intrinsics (_mm_add_ps и т. Д.), И вы действительно пытаетесь сделать «минимальные изменения кода», почему вы вообще что-то меняете? Собственные функции SSE отлично работают на OS X.

+0

«Вам не нужен API для базовой арифметики« Что ты имеешь в виду? Что эти операции будут автоматически использоваться SSE инструкциями? – Lexandr

+0

@Lexandr: Да, они будут. Однако, как я уже отмечал, если у вас уже есть рабочий код, который использует встроенные функции, * не изменяйте его *. –

1

Проблема в том, что Accelerate - это API более высокого уровня, чем использование встроенных функций SSE2. Параметры SSE сопоставляются с одиночными инструкциями, которые работают по одному вектору за раз. Ускорение обеспечивает API более высокого уровня функций, которые работают с гораздо большей степенью детализации, как правило, с массивами разумного размера. Чтобы портировать существующий код, вы должны просто придерживаться встроенных функций SSE, и если вам действительно нужна поддержка PowerPC, вам нужно будет #idef SSE-код и написать эквивалентную реализацию AltiVec для сборки ppc. Я сомневаюсь, что это будет стоить усилий, однако - Apple прекратила продавать PowerPC Macs около 7 лет назад, поэтому рынок приложений PowerPC должен быть очень маленьким.

Смежные вопросы