编译安装最新的Pluto compiler,以及遇到的一些坑

发布时间 2023-07-19 14:10:28作者: Levia_than_www

好久不见!

这段时间在鼓捣一些奇奇怪怪的东西。
Pluto Compiler是一款非常优秀的Polyhedral编译器。这玩意拿来优化循环和程序局部性啥的是相当好的。其安装过程涉及到整个llvm的编译过程,如果之前并没能够了解llvm的话估计会够呛,我也是基本上把坑踩了一个遍。所以干脆写篇博客给之后有可能会需要的哥么看看。

安装什么?需要什么?为啥困难重重?

官网上其实提供了两个版本的pluto,一个是release版本,另外一个是实际上直到2022年还在作更新的development版本。release版本实际上安装过程相对简单得多,但貌似编译出来的工具是有问题的。。。?所以这里主要是写一下development版本的安装。
安装环境是Ubuntu 22.04,想在WSL2上安装的兄台遇到问题也请自行寻找解决方法。
安装的硬件环境是i5 9500, 16GB内存,1T的存储空间。强调这一点的原因是因为编译llvm实在是有点吃硬件,本人每一次安装基本上都花了大概5个小时以上,确实很费劲,而且由于内存不太够用的缘故经常跑着跑着莫名奇妙掉了,让人摸不着头脑。而且从源码编译并且安装的话会一不小心吃掉200G的存储空间,使用虚拟机的哥么们也请将各项数值拉到足够大或者干脆用版本号较低的llvm进行编译工作。

开始!

细碎工作

拉取Pluto的development项目。很奇怪的一点是我有一次安装过程是从github仓库页面直接拉取过来的,那一次安装过程中Makefile提醒我缺了一些文件,所以也请各位按照sourceforge那个官网的安装方法拉取。
需要安装的库:

sudo apt install autoconf automake libtool libgmp3-dev pkg-config texlive-full

以及libyaml,这个库好像是没有apt源的,所以也请各位自行去网上搜索下载安装。
可能大伙会很疑惑为啥官网没提到texlive为啥还要安装这玩意,这是因为在编译某些库的时候需要编译tex文件成为pdf(很疑惑对吧,我也不清楚为啥要这么搞)。

编译整个llvm!

我就不细说整个过程到底踩了多少坑了,直接上结论。
首先需要拉取的一定是14.x的版本,小版本号无所谓,因为更加新的版本由于支持的c++标准更新导致某些库根本过不了编译。

git clone --branch llvmorg-14.0.6 https://github.com/llvm/llvm-project.git

拉取之后进入项目文件,运行下列命令来生成本次安装所需要的环境。

cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS='clang' -DCMAKE_BUILD_TYPE=Debug -DLLVM_PARALLEL_COMPILE_JOBS=4 -DLLVM_PARALLEL_LINK_JOBS=1 -DLLVM_INSTALL_UTILS=ON -DLLVM_ENABLE_ABI_BREAKING_CHECKS=ON -DLLVM_USE_LINKER=lld -DBUILD_SHARED_LIBS=ON

下面就各个参数解读一下,以便于各位在安装的时候可以稍微调节一些需要调节的地方。

  • -G Ninja实际上是生成你想生成的build file,Ninja确实好用,所以大伙能安装尽量安装一个,实在不行官网也提供了其他版本的build file。
  • LLVM_ENABLE_PROJECTS实际上指的是你需要安装的附带东西,如果需要顺带安装polly来体验LLVM带来的优化体验的话也可以把'clang'改成'clang; polly'
  • -DLLVM_PARALLEL_COMPILE_JOBS=4 -DLLVM_PARALLEL_LINK_JOBS=1实际上就是待会编译与链接所用到的线程数。如果大伙编译过程中遇到某些奇怪的地方炸内存了就干脆调成1吧。
  • -DLLVM_USE_LINKER=lld其实是一个非常好玩的选项,不带这个选项会非常稳定,几乎不会炸,但一旦炸了就基本而上不可能通过,遇到这种情况加上这个参数然后再生成一遍build files,就可以了。这玩意更容易炸但也很玄学,属于时炸时不炸的奇妙选项(内存大的哥么自然不会有这种困扰啦。)
  • -DBUILD_SHARED_LIBS=ON -DLLVM_ENABLE_ABI_BREAKING_CHECKS=ON是不是发现编译出来老是提醒你某个宏找不到?那很有可能就是因为这俩命令没加上。

通常来说生成build file还是很快的,接下来就到了各位最喜欢的编译环节了。内存小的哥么就进量能不用桌面就别用,实在不行把该退的都退了也行,接着运行下面两个指令中任意一个:

cmake --build build

(???竟然官网修了这个bug?之前官网写错了)
或者

sudo ninja -C build install

发现炸了就调成:

sudo ninja -j 1 -C build check-llvm

接下來就是等吧。有时候有可能会出现炸了然后被系统拿下的情况,没事,再运行一遍上述的编译指令即可,进度是会保存的。

编译pluto

实际上这有可能是最简单的一步。因为所有东西都准备好了,接着顺着官网一条一条运行就好了。事实也确实如此,但是!有可能你会发现运行的时候告诉你缺某些库,这个就运行下列指令:

sudo find / -name 'lib????.so'

来找到他说缺少的库(因为大概安装了但没写环境变量)。
接着找到之后,把那个文件写入LD_LIBRARY_PATH,即

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
export LD_LIBRARY_PATH

或者把这两句话写到~/.bashrc里。

享受优化后的代码吧!