16

有没有办法用 BLAS、GSL 或任何其他高性能库进行元素向量乘法?

4

4 回答 4

14

(从字面上理解问题的标题......)

是的,它可以单独使用 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]

于 2012-11-17T17:39:27.863 回答
10

我发现 MKL 在它的向量数学函数库 (VML) 中有一整套向量的数学运算,包括 v?Mul,它可以满足我的需求。它适用于 c++ 数组,因此对我来说比 GSL 更方便。

于 2011-10-03T12:13:23.433 回答
8

总是有 std::valarray 1 定义了元素操作,如果目标支持它们,这些操作经常(英特尔 C++ /Quse-intel-optimized-headers,G++)编译成 SIMD 指令。

这两个编译器也将进行自动矢量化

在这种情况下,你可以写

#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)

1是的,它们已经过时并且经常被认为已经过时,但在实践中它们都是标准的并且非常适合任务。

于 2011-10-03T12:18:30.627 回答
5

在 GSL 中,gsl_vector_mul可以解决问题。

于 2011-10-01T22:42:33.340 回答