Добавление двух типов __m128 через Accelerate framework


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

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


person Lexandr    schedule 20.04.2012    source источник
comment
Почему вы считаете, что для этого нужно использовать Accelerate Framework? Почему бы просто не использовать встроенные функции напрямую?   -  person Paul R    schedule 20.04.2012
comment
Я думаю, что если Apple предоставит API для использования MMX, SSE и т. д., будет лучше использовать этот API. Мне нужно поддерживать семейство процессоров PPC и Intel, платформа Accelerate будет автоматически обрабатывать поддержку команд процессора. Кроме того, если что-то будет меняться в будущем, думаю, при использовании фреймворка Accelerate мне нужно будет вносить меньше изменений.   -  person Lexandr    schedule 21.04.2012
comment
Хорошо, но вы не хотите вызывать функции Accelerate только для отдельных векторов - это было бы безнадежно неэффективно и бессмысленно - вам нужно обрабатывать массивы разумного размера, иначе накладные расходы на вызов функции сведут на нет все преимущества использования SIMD.   -  person Paul R    schedule 21.04.2012
comment
Спасибо, Павел, но проблема в следующем: у меня есть существующая библиотека на C++ для платформы Windows и мне нужно использовать SSE2 по минимуму! изменения кода. Этот код использует функции _mm_add_ps и т. д., мне нужно заменить вызов функций _mm_add_ps и т. д. на аналог из фреймворка Accelerate по указанным причинам. Может быть, вы можете сказать мне, что использовать вместо этого?   -  person Lexandr    schedule 21.04.2012
comment
Павел, спасибо, я надеялся, что я что-то упустил и просто не нашел эти функции.   -  person Lexandr    schedule 21.04.2012
comment
Нет проблем - я преобразовал этот последний комментарий в ответ сейчас (см. Ниже) и немного расширил его.   -  person Paul R    schedule 21.04.2012


Ответы (2)


Вам не нужен API для базовой арифметики:

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

Для этих операций API совершенно не нужен, поэтому у Accelerate его нет.

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

person Stephen Canon    schedule 22.04.2012
comment
Вам не нужен API для базовой арифметики. Что вы имеете в виду? Что эти операции будут автоматически использовать инструкции SSE? - person Lexandr; 23.04.2012
comment
@Lexandr: да, будут. Однако, как я уже заметил, если у вас уже есть работающий код, использующий встроенные функции, не изменяйте его. - person Stephen Canon; 23.04.2012

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

person Paul R    schedule 21.04.2012