2016-07-25 77 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

相關問題