- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的机器上比较矩阵乘法,似乎 c++ blas 非常慢。一个1000x1000的矩阵相乘大约需要4秒,而在python中同样需要1.5秒左右。我认为链接可能有问题,但我真的不知道如何解决这些问题。这是c++代码
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_sf_bessel.h>
using namespace std;
double diffclock(clock_t clock1,clock_t clock2) { double diffticks=clock1-clock2; double diffms=(diffticks*1000)/CLOCKS_PER_SEC; return diffms; }
int
main (void)
{
double* a=new double[1000*1000];
double* b=new double[1000*1000];
double* c=new double[1000*1000];
for (int i=0;i<1000*1000;i++){
a[i]=i;
b[i]=i/5+i*i/100;}
gsl_matrix_view A = gsl_matrix_view_array(a, 1000, 1000);
gsl_matrix_view B = gsl_matrix_view_array(b, 1000, 1000);
gsl_matrix_view C = gsl_matrix_view_array(c, 1000, 1000);
/* Compute C = A B */
cout<<"start"<<endl;
clock_t begin=clock();
gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
1.0, &A.matrix, &B.matrix,
0.0, &C.matrix);
clock_t end=clock();
cout<<double(diffclock(end,begin))<<endl;
return 0;
}
我正在编译使用 //g++ -o 程序 mm.cpp -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lgslcblas
python代码是
import time
import numpy as np
n=1000
a=np.zeros((n,n))
b=np.zeros((n,n))
for i in range(0,n):
for j in range(0,n):
a[i,j]=i*n+j
b[i,j]=(i*n+j)/5+(n*i+j)**2/5
print "start"
start=time.time()
c=np.dot(a,b)
end=time.time()
print end-start
感谢您的帮助!
最佳答案
BLAS 中的子例程是事实上的标准,并且存在大量实现该接口(interface)的优化和特定于供应商的库。 numpy 和 gsl 都可以链接到各种不同的 BLAS(或者在某些情况下使用它们自己的实现),但从这个角度来看,numpy 和 gsl 几乎都是包装器——你获得的性能基本上只取决于他们所链接的 BLAS。
有了 GSL,链接到替代的 BLAS 就相对容易了。这里有一些说明:http://www.gnu.org/software/gsl/manual/html_node/Linking-with-an-alternative-BLAS-library.html
Intel 的 MKL 是一种 BLAS,它通常非常快(至少如果您没有 AMD cpu 的话),但众所周知难以链接。他们甚至有一个网络应用程序可以帮助您编写链接行:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor .我在 OpenBLAS ( http://www.openblas.net/ ) 方面运气不错,在 i7-3770K CPU 上获得的性能在 MKL 的 1% 或 2% 以内。 OpenBLAS 也很容易编译;它比 ATLAS 更不令人头疼。
一旦您获得 OpenBLAS,无论是从源代码编译还是从您的包管理器下载(如果您使用的是 *nix),您修改后的编译行基本上都是
g++ -o program mm.cpp -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lcblas -lopenblas
关于c++ - Blas 看起来很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20213381/
我正在尝试将 MKL 稀疏 BLAS 用于 CSR 矩阵,行数/列数约为 100M。当我将其增加到 100M 时,我的源代码似乎适用于 10M 行/列,但由于段错误而失败。 我将问题隔离到以下代码片段
我在 BLAS.scala 中找到了以下代码: // For level-1 routines, we use Java implementation. private def f2jBLAS: Ne
我最近从 Linux 切换到 Mac OS。我需要 BLAS 和 LAPACK 来做一些计算。通过查看 BLAS 的维基百科,我了解到这两个库已经在 Mac OS 中实现。不过,据说 Apple's
全部, 总结... 我正在尝试编译 example.cpp arma.sourceforge.net/docs.html#example_prog 我尝试用 lapack 和 blas 编译和链接 A
谁能告诉我为什么我可以不成功测试 OpenBLAS dgemm通过以下方式在 R 中性能(在 GFLOP 中)? 将 R 与“引用 BLAS”链接起来 libblas.so 编译我的 C 程序 mmp
有某些BLAS例程将向量X的增量即incX作为参数。 我找不到增量,以及增量如何影响计算结果。 任何人都可以提供示例或任何其他类型的信息吗? 更新: 我在这里找到了最好的信息: Intel HPC m
在 BLAS 中有这样的例程 dscal scale a vector by a constant dinit initialize a vector with given value
对于 BLAS 函数 sdot (n, x, incx, y, incy)。 incx 指定 x 元素的增量。 参数incx和incy是什么意思? 最佳答案 sdot (n, x, incx, y,
我必须以 A'A 的形式计算一些产品或更一般的 A'DA ,其中 A是将军mxn矩阵和 D是对角线 mxm矩阵。他们都是满级;即 rank(A)=min(m,n) . 我知道你可以节省大量时间是这样的
是否有比较不同 BLAS(基本线性代数子程序)库的基准?我对单核和多核系统的稀疏矩阵乘法特别感兴趣? 最佳答案 BLAS 性能在很大程度上取决于系统,因此您最好在要使用的机器上自己进行基准测试。由于只
因此,关于通过汇编代码提高性能的问题的答案通常是“别打扰,编译器比你更聪明”。我明白了。 但是,我注意到优化的线性代数库(例如 ACML)可以实现比标准编译库高 2 到 5 倍的性能改进。例如,在我的
当我使用spark mllib多层感知器模型来预测 vector 时,我发现同一 vector 在多线程中有时会给出不同的结果。我阅读了源代码,发现它是基于BLAS lib的。我为BLAS在多线程中编
我正在尝试用 C 语言编译一个程序,该程序使用线性代数的 BLAS 接口(interface)。该系统在 /usr/lib64/libblas.* 中具有 BLAS 库(.a 和 .so 文件)但没有
我在我的机器上比较矩阵乘法,似乎 c++ blas 非常慢。一个1000x1000的矩阵相乘大约需要4秒,而在python中同样需要1.5秒左右。我认为链接可能有问题,但我真的不知道如何解决这些问题。
我开始使用 C++(特别是英特尔 MKL)中的 BLAS 函数来创建我的一些旧 Matlab 代码的更快版本。 到目前为止它运行良好,但我无法弄清楚如何对 2 个矩阵(Matlab 中的 A.* B)
出于好奇,我决定对我自己的矩阵乘法函数与 BLAS 实现进行基准测试......我对结果最不感到惊讶: Custom Implementation, 10 trials of 1000x1000 ma
我在 Fortran 77 中整理了一些科学代码,我正在争论什么会更快。 基本上,我有一个 MxN 矩阵,我们称之为 A。M 大于 N。稍后在代码中,我需要将 transpose(A) 乘以一堆向量。
BLAS(基本线性代数子程序)提供了许多其他编程语言,比如我使用的 Matlab,以及快速例程来执行矩阵乘法等操作。 然而,当将多个矩阵相乘时,有一个最佳顺序来“括号”矩阵。取自 wikipedia
我想知道 NVIDIA 的 cuBLAS 库。有没有人有这方面的经验?例如,如果我使用 BLAS 编写一个 C 程序,我是否能够用对 cuBLAS 的调用替换对 BLAS 的调用?或者甚至更好地实现一
BLAS 定义了 GEMV(矩阵向量乘法)2 级运算。如何使用 BLAS 库执行向量矩阵乘法? 这可能很明显,但我不知道如何使用 BLAS 运算进行乘法运算。我本来希望进行 GEVM 操作。 最佳答案
我是一名优秀的程序员,十分优秀!