Добавление двух типов __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 должен быть очень маленьким.

Другие вопросы по тегам