失学在家,手里也没有服务器。看家里有台台式机,于是想给台式机配上科研环境。发现win10配置scalapack的资料基本没有,于是就想写点笔记,为人类的中文文献库增加一点资料。

1. MSYS2和MINGW64安装

从https://www.msys2.org/下载msys2。
打开msys2.exe 环境和ubuntu非常像。

1.1 配置镜像源

pacman 的配置

编辑 /etc/pacman.d/mirrorlist.mingw32 ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
编辑 /etc/pacman.d/mirrorlist.mingw64 ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
编辑 /etc/pacman.d/mirrorlist.msys ,在文件开头添加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
然后执行 pacman -Sy 刷新软件包数据即可。

如果发现清华源已经有了,但是排在前面的第一个源是http://repo.msys2.org/mingw/x86_64/。把清华源或者其他国内源(比如肥科的)移到最前面。因为默认是使用第一个源。

安装mingw64

pacman -Syuu 更新。

pacman -S base-devel git mingw-w64-x86_64-toolchain 安装mingw64

pacman -S base-devel git mingw-w64-i686-toolchain 是用来安装mingw32的。
打开mingw64.exe
输入gcc -v 查看gcc的版本信息。
得到

$ gcc -v
Using built-in specs.
COLLECT_GCC=D:softwaremsys64mingw64bingcc.exe
COLLECT_LTO_WRAPPER=D:/software/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.3.0 (Rev2, Built by MSYS2 project)

说明gcc安装好了。

2. openmp和msmpi 安装

装好了gcc也就有了openmp,具体测试请参考(https://www.math.ucla.edu/~wotaoyin/windows_coding.html)
mpich在win已经不更新了。所以最好选官方版本msmpi
下载最新的MS MPI(https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi) msmpisdk.msi 和 MSMpiSetup.exe都要安装好。

在cmd输入set MSMPI

MSMPI_BENCHMARKS=C:Program FilesMicrosoft MPIBenchmarks
MSMPI_BIN=C:Program FilesMicrosoft MPIBin
MSMPI_INC=C:Program Files (x86)Microsoft SDKsMPIInclude
MSMPI_LIB32=C:Program Files (x86)Microsoft SDKsMPILibx86
MSMPI_LIB64=C:Program Files (x86)Microsoft SDKsMPILibx64

出现表示安装正确。下面将MS MPI和mingw64适配一下。

$mkdir ~/msmpi                     # create a temporary folder under your home directory
$cd ~/msmpi                        # enter the folder
$cp "$MSMPI_LIB64/msmpi.lib" .     # copy msmpi.lib to ~/msmpi/; the import library, which is a placeholder for dll
$cp "$WINDIR/system32/msmpi.dll" . # copy msmpi.dll to ~/msmpi/; the runtime library
$gendef msmpi.dll                  # generate msmpi.def. For 32-bit, use: gendef -a msmpi.dll, which specifies the stdcall format
$dlltool -d msmpi.def -D msmpi.dll -l libmsmpi.a   # generate the (static) library file libmsmpi.a
$cp "$MSMPI_INC/mpi.h" .

我们需要的就是libmsmpi.a和mpi.h 然后把它们放进gcc的默认库文件夹和默认头文件夹(其实就是懒)
在这里,

cp libmsmpi.a /mingw64/lib
cp mpi.h /mingw64/include

注意如果不用msys2,直接安装的mingw64(比如下载codeblock顺便安装一个mingw64)。默认的的库文件夹和头文件夹应该是x86_64-w64-mingw32/lib,x86_64-w64-mingw32/include。当然也有可能是其他的。(否则需要-L"库文件" -I"头文件")

测试一下

$gcc mpi_hello_world.c -lmsmpi -o mpi_hello #编译
$mpiexec -n 6 mpi_hello #运行

就可以了。

3. openblas,lapack,gsl 安装

pacman -S mingw-w64-x86_64-openblas # use "pacman -S mingw-w64-i686-openblas" for 32-bit

安装openblas,这样openblas自动装到默认文件夹。不过,使用头文件的时候需要#include<OpenBLAS/头文件> 编译的时候记得加上 -lopenblas 其他的blas请参考参考文献1
接下来是lapack

$pacman -S  mingw-w64-x86_64-cmake                     # install CMake
$git clone https://github.com/msys2/MINGW-packages.git # clone the scripts
$cd MINGW-packages/mingw-w64-lapack                    # locate the LAPACK script
$makepkg-mingw                                   # build BLAS and LAPACK

好,这里很奇怪。我在装lapack-3.9.0的时候不停的编译报错。(欢迎交流)
所以我装了lapack-3.8.0
需要改PKGBUILD文件。

改了pkgver为3.8.0等它下好lapack-3.8.0.tar.gz之后,通不过文件校验。所以要把sha256sum一起改了。参考文献[4]得到校验码。其他方法也ok啦。
然后安装

$ pacman -U mingw-w64-x86_64-lapack*.pkg.tar.xz   # install BLAS and LAPACK

编译的话:g++ lapack_test.cpp -llapack -o lapack_test gsl 我基本当特殊函数库用的,所以还是很重要。(其实如果计算量很大,按道理特殊函数值计算这里最好做成异构的,比如扔给GPU)

$ cd ~
$ wget -qO- http://gnu.mirrors.pair.com/gsl/gsl-latest.tar.gz | tar xvz   # this creates the folder ~/gsl-2.4/
$ cd gsl-2.4
$ ./configure --prefix=/mingw64     # I am unsure about the necessity of --prefix=/mingw64, but it should not hurt
$ make                              # this will take 15 minutes or so to complete
$ make install                      # install header and library files to the system, you can use "make uninstall" to do the opposite

安装。
编译的话 gcc $(gsl-config --cflags) gsl_test.c $(gsl-config --libs) -o gsl_test

文献1还有其他的库,可以去看看。好了,本文的文献1引用就到此为止了。

scalapack安装

netlib上下载scalapack的源文件。http://performance.netlib.org/scalapack/#_release_notes
重点我们需要改里面的SLmake.inc.example文件。
编译选项。用gfortran替代mpif90,gcc替代mpicc。另外加了-lmsmpi (其实按道理不加应该也可以,我没试过。)

一般来说这样的替代在x86上是可以的,除非各种自造的编译器就不一定了。
然后RANLIB改成echo,如果装了ranlib就不用改了。

RANLIB        = echo

最后

BLASLIB       = /mingw64/lib/libopenblas.a
LAPACKLIB     = /mingw64/lib/libopenblas.a
LIBS          = $(LAPACKLIB) $(BLASLIB)

这里我也有点奇怪,为什么LAPACKLIB要改成libopenblas.a ,这里是我从youtube ubuntu上安装scalapack看到的。
最后把SLmake.inc.example文件重命名为SLmake.inc
在scalapack文件夹下打开mingw64,输入

$make clean
$make lib

开始编译。最终从scalapack文件夹下得到libscalapack.a。把它复制到默认的库文件夹。在这里是/mingw64/lib

测试

最后从找了个例子scalapack矩阵对角化(pdsyevd),来自文献[5] scalapack矩阵对角化(pdsyevd) http://www.voidcn.com/article/p-eejnmusv-bvt.html
程序编译tests.c

$ gcc tests.c -o tests -lmsmpi -lscalapack -lopenblas -lgfortran

会报错,比如

D:/software/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/software/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../lib/libscalapack.a(dgebs2d_.o):dgebs2d_.c:(.text+0x156): undefined reference to `MPI_Type_free'

这是因为libscalapack.a依赖libmsmpi.a,所以libscalapack.a必须放前面。
正确的编译命令

$ gcc tests.c -o tests  -lscalapack -lopenblas -lgfortran -lmsmpi

运行得到

这样scalapack就安装成功了。
注意这里是纯C的环境。如果代码是C++的,函数调用前的声明要记得加extern "C" 比如extern void dgesv_( ) 要改成extern "C" void dgesv_( )

纯C环境后者会报错。

其实scalapack最好还是linux下用。不过这样的文章太多了,也就没必要写了。
双系统太麻烦了。WSL2不能使用全部的内存而且使用GPU不方便。远程也不让啊。

好,我相信有人一定会想win10下测试用Intel的MKL最方便。没错我也是这么想的,但是要交成果的时候要用非MKL的scalapack。
然后这时候就会发现这两个库的各种函数命名是不一样的。这时候代码已经写了几万行了,我现在还没改完。。。

附件:

https://github.com/chenlin0/Learning/tree/master/MPI/scalapack
SLmake.inc :scalapack的编译配置

libscalapack.a :scalapack 2.0的win库文件

tests.c :测试文件

参考文献

[1] MinGW coding under Windows (C, C++, OpenMP, MPI) https://www.math.ucla.edu/~wotaoyin/windows_coding.html

[2] "undefined reference to" 问题解决方法 https://blog.csdn.net/aiwoziji13/article/details/7330333

[3] Msys2 | 镜像站使用帮助| 清华大学开源软件镜像站https://mirror.tuna.tsinghua.edu.cn/help/msys2/

[4] Ubuntu中sha256sum命令使用 https://blog.csdn.net/jq_ak47/article/details/53590563

[5] scalapack矩阵对角化(pdsyevd) http://www.voidcn.com/article/p-eejnmusv-bvt.html

[6] ScaLAPACK for Windows http://icl.cs.utk.edu/lapack-for-windows/scalapack/index.html

18 安装zlib报错_scalapack win安装及mingw64环境配置相关推荐

  1. 三张解决方法--安装VMware报错:无法安装服务vmware Authorization server请确保你有足够的权限

    安装VMware报错:无法安装服务vmware Authorization server请确保你有足够的权限 解决一: 出现"无法安装服务vmware Authorization serve ...

  2. 安装VMware报错:无法安装服务vmware Authorization server请确保你有足够的权限

    安装VMware报错:无法安装服务vmware Authorization server请确保你有足够的权限 情况一: 出现"无法安装服务vmware Authorization serve ...

  3. Python3.6安装suds报错,需要安装suds-jurko

    python3.6.5安装suds报错 C:\Users\Administrator>pip install suds Collecting sudsDownloading https://fi ...

  4. rpm安装mysql报错NOKEY_rpm包安装报错: Header V3 RSASHA256 Signature, key ID fd431d51 NOKEY

    报错信息:Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY 一.问题场景 RHEL 6.5 安装MySQL-5.5.44 首先,卸载rpm ...

  5. python安装robotframework报错_robotframework-autoitlibrary离线安装

    由于AutoItLibrary需要依赖pywin32库.所以要使用AutoItLibrary必须要先安装好pywin32 今天需要在win7 64位系统下安装autoitlibrary库,起初安装好了 ...

  6. python3.4 安装numpy报错_python2.7安装numpy报错:is not a supported wheel on...

    python2.7安装numpy时报错信息如下: C:\Python27\Scripts>pip install "numpy-1.9.2+mkl-cp26-none-win_amd6 ...

  7. linux下安装python3报错_Linux中安装python3

    (一)Linux中安装python3(含pip3自动安装) 1.首先安装依赖包 yum -y groupinstall "Development tools" yum -y ins ...

  8. linux离线安装g 报错,Linux离线安装mysql 5.6详细步骤

    tar -zxvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 8.将解压好的文件夹重命名为mysql mv mysql-5.6.40-linux-glibc ...

  9. linux编译安装的报错,linux编译安装时常见错误解决办法

    This article is post on https://coderwall.com/p/ggmpfa 原文链接:http://www.bkjia.com/PHPjc/1008013.html ...

最新文章

  1. ubuntu 10.10 安装 oracle 11G
  2. 依赖注入容器Autofac的详解[转]
  3. Linux设备驱动中的并发控制总结
  4. 被面试官问懵:TCP 四次挥手收到乱序的 FIN 包会如何处理?
  5. R语言 神经网络与深度学习(二)
  6. 如何批量将 Word 文档转为 Svg 格式
  7. Redis Lua脚本好处、Redis执行Lua的两种方式、Redis缓存Lua脚本、Redis Lua原子性验证、Lua脚本IP限流、Lua脚本自乘
  8. JAVA SSO单点登录原理以及实现方案
  9. linux 命令 tar 打包压缩命令 date时间 命令实践
  10. facebook登录和分享
  11. 机器学习这10年我们能在各自的领域做点什么?
  12. 罗技craft写java怎么样_评测| 入手罗技CRAFT无线键盘后才知道什么叫奢华
  13. 程序包解析错误解决办法
  14. 解决jmeter控制台报javax.swing.text.BadLocationException: Position not represented by view的方法
  15. 下载谷歌浏览器以及谷歌浏览器不能加载网页问题的解决
  16. css背景图片高斯模糊_如何将网页CSS背景图高斯模糊且全屏显示
  17. SVN代码增量打包工具
  18. 如何再UOS/Ubuntu中创使用ufw设置防火墙
  19. 使用Idead的时候遇到<dependency>标红等问题
  20. (转)云计算的三种模式:IaaS、PaaS和SaaS 通俗理解

热门文章

  1. 写代码时发现......还是SpringBoot牛逼!
  2. Facebook的技术布局,有哪些值得学习的秘密
  3. Java开发技巧详细知识体系总结(2021版)
  4. 商汤发布L4级接驳小巴和智能路侧感知解决方案,加速V2X产业创新
  5. 23 岁创业,28 岁成为福布斯亚洲青年领袖,这个“刷脸的男人”有点牛
  6. 萌新程序员找工作该怎么写简历?
  7. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...
  8. 2020 年,你必须知道发展最快和衰落最快的软件技能
  9. 出于安全考虑,千万不要绕开 CORS!
  10. 高并发下如何缩短响应时间?