Добавление двух типов __m128 через инфраструктуру ускорения
Мне нужно добавить / Mul / Sub два __m128
(плавающие) переменные с использованием Accelerate framework. Но я не могу найти функцию для этого. Все функции ускорения фреймворка занимают int__vector__
введите вместо float__vector__
тип. Я нахожу функцию для деления 'vdivf'
, но мне нужно добавить / mul / sub тоже.
Может кто-нибудь сказать мне, как добавить / mul / sub два __m128
(плавающие) переменные с использованием Accelerate Framework? Что-то вроде этого: _mm_add_ps
, _mm_sub_ps
, _mm_mul_ps
но с помощью Accelerate Framework API.
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.
Проблема в том, что Accelerate является API более высокого уровня, чем использование встроенных функций SSE2. Встроенные функции SSE соответствуют отдельным инструкциям, которые работают с одним вектором за раз. Accelerate предоставляет API-функции более высокого уровня, которые работают с гораздо большей степенью детализации, обычно с массивами разумного размера. Чтобы перенести существующий код, вам нужно просто придерживаться встроенных функций SSE, и если вам действительно нужна поддержка PowerPC, то вам нужно #idef код SSE и написать эквивалентную реализацию AltiVec для сборки ppc. Однако я сомневаюсь, что это того стоит - Apple прекратила продавать Mac PowerPC около 7 лет назад, поэтому рынок приложений PowerPC должен быть очень маленьким.