2012-04-20 9 views
0

일부 벡터화 된 코드를 iOS 어플리케이션에 구현한다는 목표로 Accelerate 프레임 워크를 처음으로 사용하고 있습니다. Objective C 또는 C에서 벡터 작업에 관해서 한 일은 절대로 시도한 적이 없습니다. MATLAB에 대한 경험이 있다면, Accelerate를 사용하는 것이 고통보다 훨씬 더 많은 것인지 궁금합니다. 다음을 계산하려고한다고 가정합니다.Accelerate 프레임 워크를 사용하여 벡터로 코딩하기

여기서 a와 b는 벡터입니다.

MATLAB 코드 : 나는이 문서를 통해 일부 침 후를 참조로

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

그러나, 상황이 가속화 사용하여 매우 다르다.

내 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 

, 내가 여기에 최악의 모르는 : 모든 중간 단계를 추적, 인수가 상당히 다른 VecLib에 대해 (과 VDSP 전달하는 방법을 기억하려고), 또는 뭔가 사소한 일을하는 데 너무 많은 시간이 걸린다는 사실을 기억하십시오.

저는 여기에 뭔가 빠져 있고 대부분의 단계가 병합되거나 단축 될 수 있기를 바랍니다. 코딩 리소스, 좋은 코딩 습관 (어려운 방법이나 책에서 배운) 등에 대한 모든 권장 사항은 매우 환영 할 것입니다! 어떻게 여러 줄의 벡터 계산을 처리합니까?

+0

간단한 나누기를 수행하기 위해이 라이브러리가 포인터에 의해 전달 된 변수에 2를 필요로하면 라이브러리가 좋다고 말하고 싶습니다.또는 사용하지 않는 벡터가 아닌 부분이있을 수 있습니다. – Shahbaz

답변

1

나는 그런 식으로 쓸 수 있다고 생각하지만, 나에게 너무 복잡해 보입니다. 나는이 더 나은 (인텔 고유하지만, 쉽게 다른 아키텍처에 대한 추상화 될 수 있습니다) 같은 :

또한
#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; 

, 단지 당신이 여기서하는 일은 선형 대수 아니라, 학자가 될 수 있습니다. Linear 대수학은 선형 작업 만 포함합니다 (제곱이 없으며 sin과 같은 초월 연산이 없음).


편집 : 위와 같은 내용은 iOS의 경우에는 잘 작동하지 않습니다. 가장 큰 문제는 vsinf이 없다는 것입니다 (vMathLib는 iOS의 Accelerate에서 사용할 수 없음). 나는 테스트하기 위해 내 컴퓨터에 설치되어있는 SDK를 가지고 있지 않지만, 나는 다음과 같이 작동해야한다고 생각합니다 : 여전히 매우 컴팩트 vMathLib 가능합니다,하지만 만큼은 꽤

#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}; 

하지 않습니다.

일반적으로 벡터에 대한 많은 기본 산술 연산이 작동합니다. 모든 라이브러리에 대한 호출을 사용할 필요가 없기 때문에 Accelerate가 이러한 작업을 깨끗하게 제공하는 데 방해가되지 않습니다. 대신, Accelerate는 보통 다른 방법으로 즉시 사용할 수없는 작업을 제공하려고 시도합니다.

+0

감사합니다. @Stephen. 이것은 선형 연산이 아니라는 점에서 완전히 맞습니다. 당신은 또한 내가 이것이 iOS 응용 프로그램 (인텔 칩이 없음)을위한 것이라는 사실을 깨닫게했다. 그래서 나는 이것을 반영하도록 나의 질문을 업데이트했다. Apple은 Accelerate 프레임 워크를 사용하여 벡터 작업을 수행하는 가장 좋은 방법 인 것처럼 보이므로 내 구현이 실제로 구현되었는지 여부가 궁금합니다. – Tom

0

내 질문에 대답하려면 : iOS 6에서는 vMathLib가 소개됩니다. Stephen이 말한 것처럼 vMathLib는 OSX에서 이미 사용할 수 있었지만 iOS에서는 사용할 수 없었습니다. 지금까지.

vMathLib에서 제공하는 함수를 사용하면 벡터 계산을 더 쉽게 할 수 있습니다.