.·.·. 发表于 2018-6-23 22:24:58

不算太成功的编译pari/gp的方法(仅限win10,只是一些坑,而且我还没有踩完……)

本帖最后由 .·.·. 于 2018-6-23 23:31 编辑

其实整篇文章都是废话
核心只有两个
一个是按照linux子系统
一个是sudo apt install pari-gp
……
就这么简单
不过如果编译,可以用多线程的parfor
如果计算量很大,或许这很不错

————————

首先感谢win10的linux子系统(可以在windows上几乎没什么损失地运行ubuntu,具体安装网上有的是方法,我就不赘述了,当然我用windows store安装的时候除了0x800X000X的bug,最后用lxrun /install先装了ubuntu16.04,然后升级去了18.04)
然后,感谢windows的神奇设置,一旦你用记事本改掉了某些不该改的东西,你就只能sudo了
为此,我们需要先改.profile或者.bashrc
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
      . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"
CC="gcc"
CFLAGS="-O3 -march=native -pipe"
CXX="g++"
CXXFLAGS="-O3 -march=native -pipe"
ABI="x86-64"
GMP_CPU_TYPE="skylake"
cd ~
echo $密码 | sudo -S echo 1 >/dev/null 2>&1
sudo su --preserve-environment
exit当然也有另一种方法,就是下载gedit,以及配置图形界面,但那样实在太慢了,我宁愿notepad编辑完了之后sudo chmod……当然我宁愿root
当然对那些能够熟练使用vim的用户,这是不必要的……
cd ~
echo $密码 | sudo -S echo 1 >/dev/null 2>&1
sudo su --preserve-environment
exit
这是核心的几行,第一行是切换目录,因为windows会给bash传递当前目录(比如c:/windows/system32,而在这里你的bash什么都做不了)
第二行,其实是输入sudo密码,当然这里密码需要你自己填……我是猜不出别人的密码的……
第三行,sudo su,绕过root密码(因为最开始root没密码)登录root,这里--preserve-environment是为了保存环境变量,否则你的bash就会变成黑白的
第四行,反正你不会只退出root而继续用你的本地用户,所以直接退出……如果你一定要用你的本地账户而非root……删掉这四行就好……或者写一个if,根据环境变量或者路径下某一个文件是否存在决定你究竟想干什么

然后正文……
gcc有BUG,可能是因为没有swap,gcc会出各种内部错误,这时候我们可以制作一个文件,作为swap分区使用
dd if=/dev/zero of=/mnt/b/swapfile bs=1024 count=1048576
mkswap /mnt/b/swapfile
swapon /mnt/b/swapfile
这里用的是/mnt/b,是我的设定,因为我把B盘挂上了内存盘,如果有想在windows下面挂内存盘的,可以试试Imdisk……当然没8G内存就不要想了

理论上这一步应该能成功……然而windows表示,没编出swapon这个函数……
一个终极解决方案是,
打开usr\bin\gcc,用notepad++
嗯嗯,你会发现,上面写的是一个gcc-7.0之类的东西,怒改成/usr/lib/llvm-6.0/bin/clang(其实就是/usr/bin/clang里面的内容)
之后gcc……emmm熟悉的味道

然后就是编译……
讲道理的话,可以直接输入apt install pari-gp获得一切……
不过如果真的折腾……
最开始我是准备直接写编译代码的

#事实证明360跟windows的linux子系统有仇
#在编译时候,请务必关掉360安全卫士(或者禁用它),它可以让你的编译时间*10,我一度以为是机子坏了……没想到使坏的不是机子
#首先,编译gmp,没看懂fake cpu id是干什么用的,然而我知道的是,coffeelake并不是6.1.2列出的任何一种CPU……
#干脆从官网拉下来编译过的版本(编译了三遍,最后倒在make check上面……)
#后来才发现
#libgmp10 is already the newest version (2:6.1.2+dfsg-2).
sudo apt install libgmp-dev或许有用,反正我用了

***************************************************************
Cannot compile endian.c. Aborting. PLEASE REPORT!
Neutron3529@Neutron:~/src/pari-2.9.5$ gcc
gcc: fatal error: no input files
compilation terminated.
Neutron3529@Neutron:~/src/pari-2.9.5$ cd config/
Neutron3529@Neutron:~/src/pari-2.9.5/config$ gcc endian.c
Need GMP_CPU_TYPE environment variable for fake cpuid
endian.c: In function ‘main’:
endian.c:12:5: internal compiler error: Aborted
   x.d = 2.;
   ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.


幸好我懂的多,改用clang,编译成功
然后倒在了make check上面,因为用了一个我也不知道该怎么用的GMP_CPU_TYPE
于是官网拉gmp(sudo apt install libgmp-dev)
之后编译pari的时候很轻松,基本一次通过
./Configure --kernel=$ABI --mt=pthread --with-readline --with-gmp -a
最后用-a把gcc换成clang
说“基本”是因为pari搞鬼,说需要asm0.h,然而x86目录下没有asm0.h
一怒之下,删除x86目录(反正我也不用32位的)之后把x86-64目录cp -r了一遍,万事大吉。

最后,gp2c,由于gcc炸了的原因,玩不动……
gcc炸掉的原因还不清楚,看上去是swap出了问题,正在改swap分区……

外加,终于把/dev/shm送到内存盘了,假设b:是内存盘
那么用
ln -s /mnt/b shm
这个方法太可爱了:)
下一步就是把dev/shm变成临时文件储存位置
感觉会完成
我先重启一下,撤销在内存盘里面做的全部实验
大约明天,如果成功,会发布更多的东西




补充内容 (2018-6-24 16:55):
针对gcc的问题,可以执行rm /usr/bin/gcc && ln -s/usr/lib/llvm-6.0/bin/clang /usr/bin/gcc来避免gcc的各种错误……当然,要执行这个操作,你需要一个clang

补充内容 (2018-6-24 16:56):
现在gp2c跑得很欢畅……然而问题是,不会用gp2c修改函数变量

wayne 发表于 2018-6-24 22:59:05

我也安装了win10的的Ubuntu的,印象中很顺利,没啥坑。很久很久没用了,刚last了下,最后一次登陆是去年八月份 。
===========
试了下编译PARI/Gp,一次性编译通过,GMP是直接用的官方源。
sudo apt install libgmp-dev libreadline-dev
./Configure --with-gmp --with-readline --mt=pthread
wayne@zuse:/mnt/d/msys64/home/wayne wang/pari-2.9.5$ gp
                                    GP/PARI CALCULATOR Version 2.9.5 (released)
                              amd64 running linux (x86-64/GMP-6.1.0 kernel) 64-bit version
                   compiled: Jun 24 2018, gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
                                             threading engine: pthread
                                     (readline v6.3 enabled, extended help enabled)

                                       Copyright (C) 2000-2017 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?15 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000, nbthreads = 8
?

.·.·. 发表于 2018-6-27 01:02:49

wayne 发表于 2018-6-24 22:59
我也安装了win10的的Ubuntu的,印象中很顺利,没啥坑。很久很久没用了,刚last了下,最后一次登陆是去年八 ...

其实正常编译应该没太大问题……
主要是CPU太新,没写进GMP的CPU列表,于是想着用GMP_CPU_TYPE假装自己的CPU没那么新……
然后不知为什么(估计是我没开swap分区的缘故)gcc总是报internal compiler error
一怒之下用了ln -s
然后除了需要隔三差五给gcc(其实是clang)来一波chmod 777(不明原因)之外,基本天下太平了

mathe 发表于 2018-6-27 06:53:53

你是什么cpu,竟然会有cpu太新问题。现在通常软件应该更新在硬件前

.·.·. 发表于 2018-6-27 23:00:13

mathe 发表于 2018-6-27 06:53
你是什么cpu,竟然会有cpu太新问题。现在通常软件应该更新在硬件前


Download:         gmp-6.1.2.tar.lz | Release notes   NEW 2016-12-16
于是17,18年全部的CPU都不在gmp的列表里面
configure里面gmp只编码到skylake
完全没有coffeelake的影子
于是我只好在GMP_CPU_TYPE里面强行填入了skylake……总不能把所有sky都替换成coffee吧……

只是呼吸 发表于 2018-6-30 20:05:32

厉害!
我只能用现成的。

.·.·. 发表于 2018-7-2 00:48:37

只是呼吸 发表于 2018-6-30 20:05
厉害!
我只能用现成的。

然而我下载的现成的parfor是假的……
哪怕指明使用parfor,6个核只能用一个……
页: [1]
查看完整版本: 不算太成功的编译pari/gp的方法(仅限win10,只是一些坑,而且我还没有踩完……)