2011-10-01 38 views

Trả lời

5

Tôi thấy rằng MKL có một tập hợp toàn bộ các phép toán trên vector, trong Thư viện hàm Toán học Vector (VML), bao gồm v? Mul, thực hiện những gì tôi muốn. Nó làm việc với các mảng C++, vì vậy nó thuận tiện hơn cho tôi so với GSL.

+0

+1 cho MKL cho mỗi gia nhập – sehe

5

Trong GSL, gsl_vector_mul thực hiện thủ thuật.

6

Có phải lúc nào cũng std :: valarray trong đó xác định các hoạt động elementwise mà thường xuyên (Intel C++ /Quse-intel-optimized-headers, G ++) biên soạn thành các chỉ lệnh SIMD nếu mục tiêu hỗ trợ cho họ.

Cả hai trình biên dịch cũng sẽ làm tự động vector hóa

Trong trường hợp đó bạn chỉ có thể viết

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

và nhìn thấy nó biên dịch thành mã vectorized (sử dụng SSE4 ví dụ)

Có họ là cổ xưa và thường được coi là lỗi thời, nhưng trong thực tế họ đều chuẩn và phù hợp với những công việc rất tốt .

8

(Lấy tiêu đề của câu hỏi theo nghĩa đen ...)

Có nó có thể được thực hiện với một mình BLAS (mặc dù nó có lẽ không phải là cách hiệu quả nhất.)

Bí quyết là để điều trị một của vectơ đầu vào như một ma trận đường chéo:

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

sau đó bạn có thể sử dụng một trong những chức năng nhân ma trận vector có thể mất một ma trận đường chéo như đầu vào mà không đệm, ví dụ SBMV

Ví dụ:

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

sẽ điều này cũng làm việc trên mảng? – Matt

+2

Tôi biết điều này là khá muộn, nhưng tôi chỉ muốn nói rằng mặc dù câu trả lời này bởi finnw là một hợp lệ, tôi probaby không khuyên bạn nên sử dụng nó. Trong trường hợp thực tế của tôi chỉ cần viết vòng bản thân mình đã nhanh hơn nhiều (2-3 lần). Tôi không biết trình biên dịch của tôi tối ưu hóa bao nhiêu, nhưng thường chuyển sang blas sẽ tăng tốc tốt (ví dụ 2-3 lần theo hướng khác) thay vì làm chậm lại. Tất nhiên điều này phụ thuộc vào một số yếu tố, nhưng cũng giống như một cảnh báo cho thời gian tính toán. – oli

Các vấn đề liên quan