кодирование векторами с использованием инфраструктуры Accelerate

Я впервые играю с фреймворком Accelerate с целью внедрить некоторый векторизованный код в приложение iOS. Я никогда не пытался делать что-либо в отношении работы с векторами в Objective C или C. Имея некоторый опыт работы с MATLAB, я задаюсь вопросом, действительно ли использование Accelerate настолько более болезненно. Предположим, я хочу рассчитать следующее:

b = 4*(sin(a/2))^2 где a и b — векторы.

Код МАТЛАБ:

a = 1:4;
b = 4*(sin(a/2)).^2;

Однако, как я вижу после некоторого изучения документации, с Accelerate все обстоит совсем по-другому.

Моя реализация C:

float a[4]  = {1,2,3,4};                        //define a
int len     = 4;
float div   = 2;                                //define 2
float a2[len];                                  //define intermediate result 1
vDSP_vsdiv(a, 1, &div, a2, 1, len);             //divide
float sinResult[len];                           //define intermediate result 2
vvsinf(sinResult, a2, &len);                    //take sine
float sqResult[len];                            //square the result
vDSP_vsq(sinResult, 1, sqResult, 1, len);       //take square
float factor = 4;                               //multiply all this by four
float b[len];                                   //define answer vector
vDSP_vsmul(sqResult, 1, &factor, b, 1, len);    //multiply

//unset all variables I didn't actually need

Честно говоря, я не знаю, что здесь хуже: отслеживать все промежуточные шаги, пытаться запомнить, как передаются аргументы в vDSP применительно к VecLib (совсем другое), или то, что на выполнение чего-то совсем тривиального уходит столько времени.

Я очень надеюсь, что я что-то упустил и что большинство шагов можно объединить или сократить. Буду очень рад любым рекомендациям по ресурсам кодирования, хорошим привычкам кодирования (выученным трудным путем или из книги) и т. д.! Как вы все справляетесь с несколькими строками векторных вычислений?


person Tom    schedule 20.04.2012    source источник
comment
Если этой библиотеке нужно, чтобы 2 было в переменной, переданной указателем, для выполнения простого деления, я бы сказал, что библиотека отстой. Или, может быть, есть не векторное деление, которое вы не используете.   -  person Shahbaz    schedule 20.04.2012


Ответы (2)


Я думаю, вы могли бы написать это так, но мне это кажется ужасно сложным. Мне это нравится больше (зависит от Intel, но может быть легко абстрагировано для других архитектур):

#include <Accelerate/Accelerate.h>
#include <immintrin.h>

const __m128 a = {1,2,3,4};
const __m128 sina2 = vsinf(a*_mm_set1_ps(0.5));
const __m128 b = _mm_set1_ps(4)*sina2*sina2;

Кроме того, просто чтобы быть педантичным, то, что вы здесь делаете, не является линейной алгеброй. Линейная алгебра включает только линейные операции (без возведения в квадрат, без трансцендентных операций, таких как sin).


Редактировать: как вы заметили, вышеизложенное не будет работать из коробки на iOS; самая большая проблема в том, что нет vsinf (vMathLib недоступна в Accelerate на iOS). На моем компьютере не установлен SDK для тестирования, но я считаю, что должно работать что-то вроде следующего:

#include <Accelerate/Accelerate.h>

const vFloat a = {1, 2, 3, 4};
const vFloat a2 = a*(vFloat){0.5,0.5,0.5,0.5};
const int n = 4;
vFloat sina2;
vvsinf((float *)&sina2, (const float *)&a, &n);
const vFloat b = sina2*sina2*(vFloat){4,4,4,4};

Не так красиво, как это возможно с vMathLib, но все же довольно компактно.

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

person Stephen Canon    schedule 22.04.2012
comment
Спасибо @Стивен. Вы совершенно правы в том, что это не линейные операции. Вы также заставили меня понять, что я должен указать, что это было для приложения iOS (следовательно, без чипов Intel), поэтому я просто обновил свой вопрос, чтобы отразить это. Apple создает впечатление, что использование инфраструктуры Accelerate — лучший способ для операций с векторами, поэтому мне было интересно, действительно ли моя реализация была настолько хороша, насколько это возможно. - person Tom; 22.04.2012

Чтобы ответить на мой собственный вопрос: в iOS 6 будет представлена ​​vMathLib. Как пояснил Стивен, vMathLib уже можно было использовать в OSX, но она была недоступна в iOS. До сих пор.

Функции, предоставляемые vMathLib, упрощают векторные вычисления.

person Tom    schedule 20.06.2012