2016-07-25 31 views
0

在远程的ssh连接上,我试图用clisp交叉编译sbcl。我到目前为止遵循的步骤是这样的:如何让clisp或sbcl使用所有cpu核心可用?

我下载了最新的sbcl源代码(此时为sbcl-1.3.7),解压缩后,进入它的源代码目录。

然后构建它:

[email protected]:/sbcl-1.3.7# screen 
[email protected]:/sbcl-1.3.7# sh make.sh --prefix=/usr --dynamic-space-size=2Gb --xc-host='clisp -q' 
[email protected]:/sbcl-1.3.7# Ctrl-A Ctrl-D 
[detached from 4486.pts-1.remotehost]r/fun-info-funs.fas 
[email protected]:/sbcl-1.3.7# 

超过6%

NPROC说我有16个内核的第二远程ssh连接到同一个盒子,上面报告CPU使用率(这是谷歌计算引擎 - 没办法,我可以负担16核心:)

MAKEFLAGS在我的环境中设置为-j16,但我想clisp是不知道的。我如何获得这个版本以利用所有16​​个内核?

回答

0

SBCL交叉编译(aka bootstrapping)是在100%的vanilla CL中完成的,标准中没有关于线程或多进程的内容。

对于您的机器使用supplied SBCL binary可能不会使用线程,虽然我知道SBCL在语言中有线程支持。

如果您已更改SBCL的来源,您只需要执行此操作,因为最新支持的版本已经过预编译。我自己并没有编译SBCL,但我怀疑它比90年代我的Linux编译所用的时间少于我的夜间睡眠时间。

+0

从2002年左右开始,当我正在研究SBCL当前编译时诊断消声器的模糊内存时,从我的笔记本电脑上开始SBCL的构建需要花费大约30-40分钟当时(这是一个3-4岁的戴尔笔记本电脑,约1 GB的RAM,如果内存服务我的权利)。 – Vatine

+0

谢谢你让我知道它不能做!诚然,sbcl在我的ThinkPad上花了很长时间(大约一个小时),但是,Google计算引擎将数小时变成了几分钟,在标准的gcc编译中可以识别makeflags:我希望学习类似的lisp知识。 –

0

我建议您使用并行性图书馆,我真的很喜欢lparallel library

它具有相当的实用程序并行代码ammong所有处理器在您的计算机。这是我使用SBCL的macbook pro(4核心)的一个例子。有一系列常见的lisp并发和并行性问题here

但是让我们用lparallel关联来创建一个示例,注意这个例子并不是一个很好的并行操作,仅仅是展示leparallel的功能,使用。

让我们考虑从cliki:

(defun定义FIB(N)“的 斐波纳契数列的第n个元素的尾递归计算”一斐波纳契尾递归函数(检查型的N(整数0 *) )(fib-aux n 0 1)(fib-aux (n f1 f2) (if(zerop n)f1 (fib-aux(1-n)f2(+ f1 f2))))) )))

这将是样本的高计算成本a lgorithm。让我们来使用它:

CL-USER> (time (progn (fib 1000000) nil)) 
Evaluation took: 
    17.833 seconds of real time 
    18.261164 seconds of total run time (16.154088 user, 2.107076 system) 
    [ Run times consist of 3.827 seconds GC time, and 14.435 seconds non-GC time. ] 
    102.40% CPU 
    53,379,077,025 processor cycles 
    43,367,543,984 bytes consed 

NIL 

这是计算机上斐波那契数列的第1000000次。

让我们例如使用mapcar计算fibonnaci号码清单:

CL-USER> (time (progn (mapcar #'fib '(1000000 1000001 1000002 1000003)) nil)) 
Evaluation took: 
    71.455 seconds of real time 
    73.196391 seconds of total run time (64.662685 user, 8.533706 system) 
    [ Run times consist of 15.573 seconds GC time, and 57.624 seconds non-GC time. ] 
    102.44% CPU 
    213,883,959,679 processor cycles 
    173,470,577,888 bytes consed 

NIL 

Lparallell具有同源词:

他们返回相同的结果作为其CL同行的情况除外 其并行必须发挥一名角色。例如,premove的行为实质上与其CL版本相似,但por略有不同。或 返回第一个表格的结果,其计算结果为 非零,而por可以返回任何这样的非零评估表格的结果。

第一负载lparallel:

CL-USER> (ql:quickload :lparallel) 
To load "lparallel": 
    Load 1 ASDF system: 
    lparallel 
; Loading "lparallel" 

(:LPARALLEL) 

所以在我们的情况下,你所要做的唯一事情就是最初的内核数量的可用内核您有:

CL-USER> (setf lparallel:*kernel* (lparallel:make-kernel 4 :name "fibonacci-kernel")) 
#<LPARALLEL.KERNEL:KERNEL :NAME "fibonacci-kernel" :WORKER-COUNT 4 :USE-CALLER NIL :ALIVE T :SPIN-COUNT 2000 {1004E1E693}> 

然后从pmap系列启动同源:

CL-USER> (time (progn (lparallel:pmapcar #'fib '(1000000 1000001 1000002 1000003)) nil)) 
Evaluation took: 
    58.016 seconds of real time 
    141.968723 seconds of total run time (107.336060 user, 34.632663 system) 
    [ Run times consist of 14.880 seconds GC time, and 127.089 seconds non-GC time. ] 
    244.71% CPU 
    173,655,268,162 processor cycles 
    172,916,698,640 bytes consed 

NIL 

你可以看到是多么容易并行化这项任务,lparallel有很多的资源,你可以探索:

我也从第一mapcar和pmapcar在我的Mac添加CPU占用的捕获the first load is mapcar and the second from lparallel

相关问题