并行算法课程,配置下OpenMP与MPI,主要是mac下编译器的情况有点复杂折腾了很久记录一下。


文章目录

  • 一、WLS
  • 1. OpenMP环境
  • 二、macOS
  • 1. XCode下运行OpenMP程序
  • 2. 更改mac默认编译器后运行OpenMP和MPI程序



一、WLS

在window10下直接先安装linux子系统,官方教程很方便: 适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 启动Linux时碰到了BIOS没有启用虚拟化的问题

华硕bios找不到cpu_编译器


一般华硕主板按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

华硕bios找不到cpu_华硕bios找不到cpu_02


网上有解决该问题的: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程序了……

华硕bios找不到cpu_华硕bios找不到cpu_03

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确实被改了(如果没有的话,重启终端试一下,可能还没反应过来)

华硕bios找不到cpu_gcc编译器_04


但是!我当时的mac系统如果用这个gcc-10编译的话会显示一个不太常见的错误

华硕bios找不到cpu_gcc编译器_05


大概意思就是当前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就没啥问题了。