2011-10-01 202 views

回答

5

我發現MKL在矢量數學函數庫(VML)中有一整套關於矢量的數學運算,包括v?Mul,它可以做我想做的。它適用於C++數組,所以比GSL更方便我使用。

+0

+1 MKL本身 – sehe

5

在GSL中,gsl_vector_mul有竅門。

6

總是存在的std ::的valarray 它定義了經常如果目標支持它們編譯成SIMD指令(英特爾C++ /Quse-intel-optimized-headers,G ++)的elementwise操作。

這兩種編譯器也會做自動矢量

在這種情況下,你可以只寫

#define N 10000 

float a[N], b[N], c[N]; 

void f1() { 
    for (int i = 1; i < N; i++) 
    c[i] = a[i] + b[i]; 
} 

,並把它編譯成量化代碼(使用SSE4如)

是的,他們是過時的,往往認爲是過時的,但在實踐中,他們都是標準的,適合的任務非常好。

8

(以該問題的標題字面上...)

是的,它可以單獨使用BLAS來實現(雖然它可能不是最有效的方式。)

的竅門是把一個輸入向量爲對角矩陣的:

⎡a ⎤ ⎡x⎤ ⎡ax⎤ 
⎢ b ⎥ ⎢y⎥ = ⎢by⎥ 
⎣ c⎦ ⎣z⎦ ⎣cz⎦ 

然後可以使用的矩陣 - 向量乘法功能,可以採取一個對角矩陣作爲輸入,而不填充,例如一個SBMV

例子:

void ebeMultiply(const int n, const double *a, const double *x, double *y) 
{ 
    extern void dsbmv_(const char *uplo, 
         const int *n, 
         const int *k, 
         const double *alpha, 
         const double *a, 
         const int *lda, 
         const double *x, 
         const int *incx, 
         const double *beta, 
         double *y, 
         const int *incy); 

    static const int k = 0; // Just the diagonal; 0 super-diagonal bands 
    static const double alpha = 1.0; 
    static const int lda = 1; 
    static const int incx = 1; 
    static const double beta = 0.0; 
    static const int incy = 1; 

    dsbmv_("L", &n, &k, &alpha, a, &lda, x, &incx, &beta, y, &incy); 
} 

// Test 
#define N 3 
static const double a[N] = {1,3,5}; 
static const double b[N] = {1,10,100}; 
static double c[N]; 

int main(int argc, char **argv) 
{ 
    ebeMultiply(N, a, b, c); 
    printf("Result: [%f %f %f]\n", c[0], c[1], c[2]); 
    return 0; 
} 

Result: [1.000000 30.000000 500.000000]

+0

會這也就陣列工作? – Matt

+2

我知道這是相當晚,但我只想說,雖然這個答案是由finnw是一個有效的,我probaby不建議使用它。在我的實際案例中,自己編寫循環的速度要快得多(2-3次)。我不知道我的編譯器優化了多少,但通常切換到blas會產生一個很好的加速(例如在另一個方向上2-3次)而不是減速。當然這取決於幾個因素,但只是計算時間的警告。 – oli