2016-07-25 1 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# 

nproc에 내가 16 개 개의 코어를 말한다 6 %에서 같은 상자, 위에보고 CPU 사용량에 두 번째 원격 ssh 연결에 걸쳐 (이것은 구글 컴퓨 트 엔진입니다 - 안돼 방법은 내가 16 코어로 뭔가를 감당할 수 있을까 :)

MAKEFLAGS는 내 환경에서 -j16으로 설정되어 있지만 clisp은이를 인식하지 못합니다. 이 빌드를 사용하여 16 개의 코어를 모두 사용할 수 있습니까?

답변

0

SBCL 크로스 컴파일 (일명 부트 스트래핑)은 100 % 바닐라 CL로 수행되며 스레딩 또는 다중 프로세스에 대해서는 표준에 아무것도 없습니다.

컴퓨터에 supplied SBCL binary을 사용하면 SBCL이 해당 언어로 스레드를 지원한다는 것을 알고 있지만 스레딩을 사용하지 못할 수도 있습니다.

SBCL의 소스를 변경 한 경우 최신 지원 버전이 일반적으로 사전 컴파일되어 있으므로이 작업을 수행하면됩니다. 나는 SBCL을 스스로 컴파일하지는 않았지만, 90 년대에 야간 수면보다 시간이 적게 든 리눅스 컴파일보다 오래 걸린다.

+0

막연한 기억이 2002 년부터 나왔다. 결국 내가 SBCL의 현재 컴파일 타임 진단으로 바뀌 었는지에 대한 연구가 진행 중이다. SBCL 빌드는 처음부터 끝까지 30-40 분이 걸린다. 그 당시 (1 ~ 2GB RAM을 갖춘 3-4 년 된 Dell 노트북이었고, 메모리가 나에게 적합하다면). – Vatine

+0

할 수 없다는 것을 알려 주셔서 감사합니다! 사실, sbcl은 필자의 thinkpad (약 1 시간)에서 컴파일하는 데 오랜 시간이 걸리지는 않지만, google compute 엔진은 makeflags를 인식하는 표준 gcc 컴파일에서 몇 분만에 몇 시간을 소비합니다. 저는 lisp와 비슷한 것을 배우기를 희망했습니다. –

0

나는, 당신이 parallism 라이브러리를 사용하도록 권하고 정말 lparallel library

그것은 당신의 컴퓨터에있는 모든 프로세서를 ammong 코드를 병렬화하는 꽤 유틸리티가 있습니다를 좋아한다. 이것은 SBCL을 사용하는 나의 맥북 프로 (4 코어)의 예제이다. 공통된 lisp 동시성과 병렬 처리의 훌륭한 시리즈가 있습니다 here

그러나 lparallel cognates를 사용하는 샘플 예제를 작성해 보겠습니다.이 예제는 병렬 처리를 잘 수행하지 못하기 때문에 leparallel의 힘과 얼마나 쉬운가를 보여줍니다. 용도.

하자 cliki:

(defun는의 FIB (N)의 " 피보나치 시퀀스의 n 번째 요소의 꼬리 재귀 계산"에서 피보나치 꼬리 재귀 함수를 고려하자 (체크 타입 N (정수 0 *) (fib-aux (1- n) f2 (+ f1 f2))))) (fib-aux n 0 1) (레이블 ((fib-aux (nf1f2) )))

이것은 높은 계산 비용의 샘플이 될 것입니다. 알고리즘. 그것을 사용하자 :

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 

이것은 내 컴퓨터의 fibonacci 시리즈의 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는 이러한 0 이외의 평가 양식 인 의 결과를 반환 할 수 있습니다.

첫 번째 부하 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}> 

: 우리의 경우에 따라서

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

(:LPARALLEL) 

, 당신이해야 할 유일한 것은 처음에 사용할 수 당신이 가지고있는 코어의 수와 커널 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 

:

나는 또한 나의 맥에서 첫 번째 mapcar 등등과 pmapcar에서 CPU 사용량의 캡처를 추가 :이 작업을 병렬화하는 것이 얼마나 쉬운 볼 수 lparallel 당신이 탐험 수있는 자원을 많이 가지고 the first load is mapcar and the second from lparallel

관련 문제