나는, 당신이 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 당신이 탐험 수있는 자원을 많이 가지고
막연한 기억이 2002 년부터 나왔다. 결국 내가 SBCL의 현재 컴파일 타임 진단으로 바뀌 었는지에 대한 연구가 진행 중이다. SBCL 빌드는 처음부터 끝까지 30-40 분이 걸린다. 그 당시 (1 ~ 2GB RAM을 갖춘 3-4 년 된 Dell 노트북이었고, 메모리가 나에게 적합하다면). – Vatine
할 수 없다는 것을 알려 주셔서 감사합니다! 사실, sbcl은 필자의 thinkpad (약 1 시간)에서 컴파일하는 데 오랜 시간이 걸리지는 않지만, google compute 엔진은 makeflags를 인식하는 표준 gcc 컴파일에서 몇 분만에 몇 시간을 소비합니다. 저는 lisp와 비슷한 것을 배우기를 희망했습니다. –