- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要用 Fortran 制作一个点积。我可以使用内在函数 dot_product
来自 Fortran 或使用 ddot
来自 OpenBLAS。问题是 ddot
速度较慢。这是我的代码:
使用BLAS:
program VectorBLAS
! time VectorBlas.e = 0.30s
implicit none
double precision, dimension(3) :: b
double precision :: result
double precision, external :: ddot
integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: I
DO I = 1, 10000000
b(:) = 3
result = ddot(3, b, 1, b, 1)
END DO
end program VectorBLAS
使用dot_product
program VectorModule
! time VectorModule.e = 0.19s
implicit none
double precision, dimension (3) :: b
double precision :: result
integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: I
DO I = 1, 10000000
b(:) = 3
result = dot_product(b, b)
END DO
end program VectorModule
这两个代码的编译使用:
gfortran file_name.f90 -lblas -o file_name.e
我做错了什么? BLAS不是要更快吗?
最佳答案
虽然 BLAS(尤其是优化版本)对于较大数组来说通常更快,但内置函数对于较小尺寸来说更快。
这从 ddot
的链接源代码中尤其明显,其中额外的工作花费在更多功能上(例如,不同的增量)。对于较小的数组长度,此处完成的工作超过了优化的性能增益。
如果你让向量变得更大,优化后的版本应该会更快。
这里有一个例子来说明这一点:
program test
use, intrinsic :: ISO_Fortran_env, only: REAL64
implicit none
integer :: t1, t2, rate, ttot1, ttot2, i
real(REAL64), allocatable :: a(:),b(:),c(:)
real(REAL64), external :: ddot
allocate( a(100000), b(100000), c(100000) )
call system_clock(count_rate=rate)
ttot1 = 0 ; ttot2 = 0
do i=1,1000
call random_number(a)
call random_number(b)
call system_clock(t1)
c = dot_product(a,b)
call system_clock(t2)
ttot1 = ttot1 + t2 - t1
call system_clock(t1)
c = ddot(100000,a,1,b,1)
call system_clock(t2)
ttot2 = ttot2 + t2 - t1
enddo
print *,'dot_product: ', real(ttot1)/real(rate)
print *,'BLAS, ddot: ', real(ttot2)/real(rate)
end program
BLAS 例程在这里要快得多:
OMP_NUM_THREADS=1 ./a.out
dot_product: 0.145999998
BLAS, ddot: 0.100000001
关于fortran - OpenBLAS 比内部函数 dot_product 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36221809/
我从 C++ atm 开始,希望使用矩阵并加快总体速度。之前使用过 Python+Numpy+OpenBLAS。认为 c++ + Eigen + MKL 可能更快或至少不慢。 我的 C++ 代码: #
是否可以像 sudo apt-get install openblas-dev 这样通过 apt-get 安装 openblas? 似乎在 ubuntu 14.04 上找不到它。 sudo apt-g
在 C++17 中,我想使用多个 OpenBLAS 子程序,每个子程序具有不同的线程数。有什么办法可以做到这一点? 过去,我使用过 openblas_set_num_threads();为我的 Ope
存在实现矩阵类型和计算的 C++ 库,例如 Eigen 或 Boost::uBlas。 还有一些库,例如 LAPACK、Goto-BLAS、OpenBLAS 和 ATLAS,可在浮点类型上实现高度优化
我能够在 MinGW64 下编译 Armadillo + OpenBLAS,但是链接是通过“libopenblas”,我认为它是 dll。在 Ubuntu 下,我可以通过我认为是静态的“openbla
我在 Ubuntu 14.04 64 位的硕士论文中成功使用了 Armadillo 和 OpenBLAS(安装了 Armadillo 和没有安装)。性能非常出色——我的代码主要由基本矩阵运算组成。所有
我编译了 OpenBLAS 并将其安装在/usr/lib/libopenblas现在我想在运行的替代系统中安装库 #!/bin/bash update-alternatives --install
我已经在 TX1 中安装了 OpenBlas,并且 time_dgemm 示例使用 gcc 编译得很好。但是,我需要能够使用 g++ 将其余代码与 OpenBlas 链接起来。当我尝试使用 g++ 编
我正在使用 numpy,我的模型涉及密集的矩阵-矩阵乘法。为了加快速度,我使用 OpenBLAS 多线程库来并行化 numpy.dot 函数。 我的设置如下, 操作系统:CentOS 6.2 服务器
我需要将 Armadillo (当前版本为 5.100.1)作为 $HOME 中的本地库(集群应用程序,不能安装在每个计算节点上,但 $HOME 是共享文件夹)。我正在使用 cmake 来管理应用程序
我需要用 Fortran 制作一个点积。我可以使用内在函数 dot_product来自 Fortran 或使用 ddot来自 OpenBLAS。问题是 ddot 速度较慢。这是我的代码: 使用BLAS
我最近下载并构建了 Spark 2.3.1。我使用这些命令下载并选择版本 2.3.1 git clone https://github.com/apache/spark.git cd spark
我有一台 Windows 7-64 位计算机,我正在尝试通过 Msys2 构建 OpenBlas 库。 gcc 似乎存在一些问题,因为在安装 minGW 和解压缩的 OpenBlas 文件夹后,我打开
我的标题中某处有此声明: typedef float real; typedef int integer; extern "C" { extern int sgemm_(char *transa, c
我安装了 OpenBlas 并且可以通过使用编译链接到 OpenBlas 的 C 程序 gcc testOpenBlas.c -I /opt/OpenBLAS/include/ -L/opt/Op
我想知道是否可以在(Python)运行时更改 OpenBLAS 在 numpy 后面使用的最大线程数? 我知道可以在通过环境变量 OMP_NUM_THREADS 运行解释器之前设置它,但我想在运行时更
我正在尝试使用 OpenBLAS 安装 numpy ,但是我不知道如何编写 site.cfg 文件. 当installation procedure随后安装完成且没有错误,但是将 OpenBLAS 使
我正在尝试在 OSX Mavericks 上构建 OpenBLAS ( http://www.openblas.net/ ) 只需键入“make”,它就会在 make 过程的几分钟内遇到错误。 我已经
为了演示,我使用 3 行 CMakeLists.txt: cmake_minimum_required(VERSION 2.8) find_package( BLAS REQUIRED ) messa
我正在使用OpenBLAS我的 BLAS和 LAPACK例行通话。我不想要我的 C++ 的用户群库必须在他们的机器上安装依赖项。所以我想提供OpenBLAS我的图书馆 third_party并有 CM
我是一名优秀的程序员,十分优秀!