BLAS中逐元素的向量-向量乘法
Element-wise vector-vector multiplication in BLAS?
是否有一种方法可以使用BLAS, GSL或任何其他高性能库进行元素明智的向量向量乘法?
(从字面上理解问题的标题…)
是的,它可以单独使用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]
我发现MKL在其矢量数学函数库(VML)中有一套完整的矢量数学运算,包括v?Mul,这是我想要的。它适用于c++数组,所以对我来说比GSL更方便。
总是有std::valarray1,它定义了元素操作,这些操作经常(Intel c++ /Quse-intel-optimized-headers
, g++)编译成SIMD指令,如果目标支持它们的话。
- http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/mac/cref_cls/common/cppref_valarray_intro.htm
这两个编译器也会自动向量化
- http://software.intel.com/en-us/articles/getting-code-ready-for-parallel-execution-with-intel-parallel-composer/
- http://gcc.gnu.org/projects/tree-ssa/vectorization.html
在这种情况下你可以直接写
#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是的,它们是过时的,经常被认为是过时的,但在实践中它们都是标准的,并且非常适合任务。
在GSL中,gsl_vector_mul
做到了这一点。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 在 C++ 中输出枚举类类型的向量元素
- 用向量的向量元素初始化向量的空向量
- 为什么不允许使用可变长度数组作为向量元素?
- 在函数中传递向量元素
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 返回向量元素的 l 值的正确方法是什么?
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- C++:向量元素赋值导致访问冲突
- 将向量元素与字符串元素进行比较,而不初始化向量
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 使用递归C++向量元素的总和
- 如何查找为数组中的最低值编制索引的向量元素
- 限制指针访问STL ::向量元素
- 访问索引指向向量元素时的seg故障 - 做错了什么
- 如何使用指针访问向量元素的各个元素
- 向量元素数据损坏了Find()操作
- 将字符值分配给向量元素.C