在 C++ 中使用 BLAS 对来自不同数组的值进行点积

Dot product of values from different arrays using BLAS in C++

我正在寻找快速进行点积的方法,BLAS 可以作为一种选择。但是有什么方法可以快速对来自不同数组的值进行点积吗?

例如,假设有4个不同的一维数组,a, b, c, d

a = {1, 2, 3, 4}
b = {5, 6, 7, 8}
c = {9, 10, 11, 12}
d = {13, 14, 15, 16}

还有另一个数组

k = {1, 2, 3, 4}

我想做的是计算

ans1 = a[0]*k[0] + b[0]*k[1] + c[0]*k[2] + d[0]*k[3];
ans2 = a[1]*k[0] + b[1]*k[1] + c[1]*k[2] + d[1]*k[3];

等等...

多次执行相同的计算,但由于每次迭代都可以更改所有数组中的值。 我试图在 BLAS 中使用 ddot 并以某种方式使用指针但未能做到。 有没有办法在不分配另一个数组并将值复制到它的情况下使用 ddot,例如

e[0]=a[0];    e[1]=b[0];    e[2]=c[0];    e[3]=d[0];

然后,

ans = ddot(4, e, 1, k, 1); 

也很难将其作为二维矩阵,因为每个一维向量(数组)位于不同的类。 请给我一个建议,让我更有效地做到这一点。

提前致谢。

如果将列向量 abcd 存储在形式为

的二维矩阵 M 中
M = (a  b  c  d)

你可以将问题转化为

ans = M k

其中 ans = (ans1 ans2 ans3 ans4)。这是一个单一的矩阵向量乘法,BLAS 的 dgemv 例程适用。