Windows 10 VS2015 环境下安装使用BLAS线性代数库

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35776029/article/details/52719079

近期需要移植项目,所以要在Windows上用BLAS。 网上有相关流程,但总体来看一是比较繁琐,二来有效性不高。本流程根据自身经验总结,希望能有所帮助。

参考资料:

Github上OpenBLAS项目自带的说明 (注意,往下拉,看 "2. CMake and Visual Studio" 一条。我学艺不精,前面用MinGW的方法感觉实在太折腾了,实测效果也不好。


流程概述:

我们的最终目标是能够在VS2015构建的c++项目中使用诸如cblas_sgemm高性能线性代数函数。

为了实现这一目标,我们需要获得:

cblas.h为首的一批头文件,包含函数的定义。

libopenblas.dll 动态链接库,包含函数的实现。

libopenblas.lib 这个是辅佐上面的dll工作的,大概就是说明一下有什么函数之类的。

头文件在源码中已经有了,后两者需要编译源码才能获得。


我们从github上下载到OpenBLAS的源码,然后使用CMake从源码生成VS2015的解决方案(.sln文件以及其他东西),之后用VS2015从sln打开OpenBLAS项目,用VS2015编译得到.dll和.lib。注意,这里要用到Perl。如果没有,VS在编译过程中会报一堆带“perl”单词的错。


准备材料:

1. OpenBLAS 0.2.19 线性代数库的源码。我目前(2016/10/1)用的是这个版本。直接下载项目的zip就好了。

2. ActivePerl-5.24.0.2400-MSWin32-x86-64int-300560 Perl。编译过程中需要用到。我目前用的是这个版本,不排除日后可能更新;以网页上提供的为准吧。该链接可能需要使用V-P-N。

3. CMake 这个东西帮我们从OpenBLAS源码编译出VS2015的解决方案。这个链接指向官网,可能需要使用V-P-N。其他地方应该也可以找到吧。

4. Visual Studio 2015 请自理。


安装流程:

1. 从github下载OpenBLAS源码,找地方解压。略。假定解压到D:\OpenBLAS。

2. 下载Perl,安装。中间可以选择安装位置。安装过程中会有“把perl加入环境变量path”的选项,一定要勾选。

*什么是path?path看起来是一组目录的路径,Windows下打开cmd,打set path按回车可以查看它的值。这些目录是干什么用的呢?如果您使用过linux,那一定有通过命令行执行某些程序的经历。 这种执行程序的命令看起来应该像:"程序名 参数 参数...",比如"gcc -c main.cpp..."。 然而您在打出这些命令时,并没有告诉系统这些程序在哪里。系统是怎样找到它们的呢?在Windows里,path中的这些目录下面通常都有一些.exe文件。只有其所在目录被加入path的可执行文件,才能从命令行直接打它的名字来执行。换言之,如果没有加入path,就算程序被正确安装,您也不能只打一个程序名就让它开始执行,因为系统不知道它在哪里。所以,path大概就是说,上我们这些目录下面去找可执行文件去,找着就执行,找不着再报错。在这里,VS2015在编译OpenBLAS的过程中就会调用Perl,如果不加入环境变量,VS也找不到Perl在哪里,就无法使用它的功能,从而不能正确编译。


3. 下载安装CMake。

4. 在D:\OpenBLAS目录下新建build文件夹。

5. 打开CMake的图形界面(从安装的根目录里可以找到带gui的)

6. CMake界面上方需要填写两个目录。

Where is the source code: 填写OpenBLAS源码所在的目录。根据这里的假设,应该填D:\OpenBLAS。

Where to build the binarys: 生成的解决方案放在哪里。根据这里的假设,应该填D:\OpenBLAS\build。

7. 先点CMake下方的configure,这里再点generate。这里应该会显示:Current Generator: Visual Studio 14 2015。

8. 完成后,D:\OpenBLAS\build下应该能看到.sln了。用VS2015打开它。

9. 在右侧解决方案资源管理器中,右键最上面的项目,点生成。之后应该会显示全部生成成功。

10. 这时,在D:\OpenBLAS\build\lib目录下应该可以找到所需的.dll和.lib。


测试流程:



1. 在VS2015中新建空项目。

2. 配置包含目录和库目录:

包含目录:项目-属性-VC++目录-包含目录,按这里的假设,添加D:\OpenBLAS\lapack-netlib\CBLAS\include。这个目录下有cblas.h。

库目录:    项目-属性-VC++目录-库目录,    按这里的假设,添加D:\OpenBLAS\build\lib。这个目录下有libopenblas.lib。

3. 配置附加依赖项:

 项目-属性-链接器-输入-附加依赖项,添加libopenblas.lib。

4. 新建main.cpp,内容如下:

extern "C" {
#include <cblas.h>
}
#include <iostream>

int main() {
	float a[1] = { 2 };
	float b[1] = { 3 };
	float c[1] = { 0 };
	cblas_sgemm(CblasRowMajor,
		CblasNoTrans, CblasNoTrans,
		1, 1, 1,
		1,
		a, 1,
		b, 1,
		0,
		c, 1);
	std::cout << *c << std::endl;
	system("pause");
	return 0;
}
5. 把D:\OpenBLAS\build\lib中的libopenblas.dll复制到main.cpp的同一目录下。
6. 正常编译运行。

*可能有一个坑:编译报错“找不到cblas_mangling.h”。我暂时的解决方法是,在OpenBLAS目录中搜索cblas_mangling_with_flags.h,备份之,然后将其改名为cblas_mangling.h。

7. 如果输出6,那就基本成功了。

展开阅读全文

没有更多推荐了,返回首页