2011-07-05 8 views
1

두 개의 임의 길이 벡터 (일반적인 길이는 2048)를 갖기 위해 요소별로 곱하려고합니다. 따라서 모든 n에 대해 Z [n] = X [n] * Y [n]. 16BLAS의 벡터 곱셈과 catlas_saxpby가 제대로 작동하지 않습니다.

float inputX[4] = { 2, 4, 8, 16 }; 
float inputY[4] = { 2, 4, 8, 16 }; 

catlas_saxpby(4, 1, inputX, 1, 1, inputY, 1); 

결과는 inputY로 전환, 그 결과 그들은 그것이 4를해야 곱한다면

4.000000, 8.000000, 16.000000, 32.000000 

입니다 :

내가 테스트하는 설정이 코드는 매우 기본적인 , 64, 256. 그러나 그것이 추가되는 것처럼 보입니다.

그래서 내가 예상 한대로하지 못하고 있으며, 문서가 그것이 무엇을하고 있는지 파악할 수있는 충분한 정보를주지 못합니다.

아이디어가 있으십니까?

Apple's documentation for BLAS says this: 

Computes the product of two vectors, scaling each one separately (single-precision). 

void catlas_saxpby (
    const int N, 
    const float alpha, 
    const float *X, 
    const int incX, 
    const float beta, 
    float *Y, 
    const int incY 
); 
Parameters 
N 
Number of elements in the vector. 
alpha 
Scaling factor for X. 
X 
Input vector X. 
incX 
Stride within X. For example, if incX is 7, every 7th element is used. 
beta 
Scaling factor for Y. 
Y 
Input vector Y. 
incY 
Stride within Y. For example, if incY is 7, every 7th element is used. 
Discussion 
On return, the contents of vector Y are replaced with the result. 

답변

2

Apple 설명서를 잘못 읽었습니다. saxpby 함수는 스칼라 alphabeta 및 벡터 XY에 대한 식 alpha*X + beta*Y을 계산합니다.

선형 대수학에서 일반적인 연산이 아니기 때문에 두 벡터의 요소와 곱을 계산할 수있는 함수가 있다고 생각하지 않습니다. 외부 제품의 대각선을 취할 수는 있지만 전체 외부 제품 (N 대신 곱하기)을 계산하기 때문에 많은 노력이 필요합니다.

+0

네온 내장 함수 또는 for 루프를 사용하여 막힐 것으로 생각합니다. 나는 둘 다 시도하고 더 빠른 것을 보게 될 것입니다. –

3

아담 로젠 필드에 따르면 설명서가 잘못되었습니다. 버그를 신고하십시오.

제쳐두고, 나머지 답변에는 몇 가지 수정 사항이 있습니다. 첫째, saxpbyalpha * X + beta * Y을 계산합니다. 둘째, 더 유용합니다. BLAS에는 원하는 기능을 수행하는 기능이 없지만 Accelerate.framework : vDSP_vmul의 일부인 vDSP에는 이와 같은 기능이 정확히 있습니다.

+0

일부 네온 내장 함수를 사용하여 성공한 후에 지금 vmul을 사용해야합니다. P. 그걸 보여줘서 고마워. 분명히 이식성이 좋습니다. –

관련 문제