并行算法课程,配置下OpenMP与MPI,主要是mac下编译器的情况有点复杂折腾了很久记录一下。
文章目录
- 一、WLS
- 1. OpenMP环境
- 二、macOS
- 1. XCode下运行OpenMP程序
- 2. 更改mac默认编译器后运行OpenMP和MPI程序
一、WLS
在window10下直接先安装linux子系统,官方教程很方便: 适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 启动Linux时碰到了BIOS没有启用虚拟化的问题
一般华硕主板按del重启就可以进BIOS,但试了好几个键也都直接开机了没有进,还是要先给主板放电后才行:台式电脑主板放电
Linux下编译器都没什么问题,几条命令就可以了。
1. OpenMP环境
直接安装gcc
sudo apt-get install gcc
编译openmp程序后运行
gcc -fopenmp -o xx xx.c
./xx
MPI环境的配置太久远忘记了(所以一定要及时记录!!!)但没有网上搜到的其他帖子那样麻烦,好像也是一两条命令就可以了
二、macOS
槽点太多一时不知从哪说起,网上的方法看花了试了很多,个人感觉编译器的各种问题和macOS系统以及系统版本都有关。
首先通过gcc -v看版本就很有问题,背后的不是gcc编译器,而当在终端通过gcc命令编译openmp程序的时候,报错的是clang
网上有解决该问题的:macbook配置clang和openmp,但是我试了后没用。
尝试用llvm去编译程序,llvm -fopenmp -o命令后报的错是连stdio.h头文件都找不到。
1. XCode下运行OpenMP程序
不用终端,在XCode下,参照的是这个教程:Clang + OpenMP Setup in Xcode 主要就是通过配置用户个人编译的一些参数使得编译通过,但跟着教程也出现了编译问题
ld: library not found for -liomp5
大概就是liomp5这个链接库找不到之类的,而且跟着教程走还发现自己根本没有libiomp5.dylib这个库,编译报错的问题也是这个引起的。
找到它应该在的路径后,发现其路径下有另一个库名字叫libomp,抱着试一试的心态把libomp.dylib复制一份然后重命名为libiomp5.dylib,就能正常编译运行openmp程序了……
2. 更改mac默认编译器后运行OpenMP和MPI程序
之前发现mac默认的gcc编译器背后不是gcc编译器,大概思路就是把gcc背后的编译器改成真正的gcc编译器,也不用什么clang和llvm了。
首先如果直接不指定版本安装gcc编译器(通过homebrew)
brew install gcc
如果通过homebrew安装的话,编译器的路径大概都在/usr/local/Cellar下,比如我默认安装的gcc10,路径为/usr/local/Cellar/gcc/10.2.0_4/bin/gcc-10。
我使用的更改默认编译器最粗暴的方法就是直接把/usr/local/bin/下的gcc和g++命令与下载的gcc10的路径/usr/local/Cellar/gcc/10.2.0_4/bin/gcc-10软连接(g++同理)
ln -s /usr/local/Cellar/gcc/10.2.0_4/bin/gcc-10 /usr/local/bin/gcc
ln -s /usr/local/Cellar/gcc/10.2.0_4/bin/g++-10 /usr/local/bin/g++
看下gcc -v确实被改了(如果没有的话,重启终端试一下,可能还没反应过来)
但是!我当时的mac系统如果用这个gcc-10编译的话会显示一个不太常见的错误
大概意思就是当前macOS版本太高了,需要低于这个版本才行。
总不能为了gcc降mac版本吧,那就降gcc版本,再下一个gcc-8
brew install gcc@8
找到gcc-8在的路径,我的路径是/usr/local/Cellar/gcc@8/8.4.0_3/bin/gcc-8,先试一下这个编译器能不能编译程序。
/usr/local/Cellar/gcc@8/8.4.0_3/bin/gcc-8 -o xx xx.c
./xx
如果能正常编译和运行,再改软连接。
这个时候改软连接可能会说已经连接过了巴拉巴拉的,那直接把/usr/local/bin里的gcc和g++删掉重新对gcc-8链接一下就行了。
最后只要gcc没问题,openmp和mpi就没啥问题了。