gpt4 book ai didi

optimization - 如何让 SBCL 优化掉对 DEFINITION 的可能调用?

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:16 24 4
gpt4 key购买 nike

抱歉:我没有足够的知识将其重新编写为易于理解的代码片段。

我一直在使用 SBCL 编译器注释作为可能改进的标志,但我对此深有体会 —

; compiling (DEFUN EXECUTE-PARALLEL ...)
; file: /home/dunham/8000-benchmarksgame/bench/spectralnorm/spectralnorm.sbcl-8.sbcl
; in: DEFUN EXECUTE-PARALLEL
; (FUNCALL FUNCTION START END)
; --> SB-C::%FUNCALL THE
; ==>
; (SB-KERNEL:%COERCE-CALLABLE-FOR-CALL FUNCTION)
;
; note: unable to
; optimize away possible call to FDEFINITION at runtime
; because:
; FUNCTION is not known to be a function

#+sb-thread
(defun execute-parallel (start end function)
(declare (type int31 start end))
(let* ((num-threads 4))
(loop with step = (truncate (- end start) num-threads)
for index from start below end by step
collecting (let ((start index)
(end (min end (+ index step))))
(sb-thread:make-thread
(lambda () (funcall function start end))))
into threads
finally (mapcar #'sb-thread:join-thread threads))))

#-sb-thread
(defun execute-parallel (start end function )
(funcall function start end))

(该程序是 here 。类似程序的测量值是 here 。)

使 SBCL“优化掉对 FDEFINITION 的可能调用”是否可行,或者编译器是否注意到解释而不是机会?

最佳答案

可能调用 fdefinition 的原因是它不知道 function 是一个函数:它可能是一个函数的名称:一般来说它可能是一个函数指示符 而不是一个函数。为了让编译器保持安静,向它解释它是一个具有合适类型声明的函数,即(declare (type function function)):你只需要声明它的类型是函数).

Rainer 是对的:假设您正在启动一个新线程,这将成为性能问题的可能性为 ε。特别是添加声明很可能根本没有任何区别:

  • 如果没有声明,对funcall 的调用将被编译为类似于“检查对象的类型:如果它是一个函数,则调用它;如果不是,则对其调用 fdefinition 并调用结果;';
  • 通过声明,整个函数看起来就像“检查对象是一个函数,如果不是,则发出错误信号……调用该函数”。

在这两种情况下,如果对象是函数,则有一次类型检查和一次调用:类型检查只是在不同的地方。在第一种情况下,如果对象只是一个函数的名称,代码仍然可以工作,而通过类型检查则不会。

在这两种情况下,这是您关心调用 make-thread 的代码:如果这是 anything like 与函数调用一样快,甚至通过 fdefinition 线程系统给我留下了深刻的印象!几乎可以肯定,此函数的性能完全取决于创建线程的开销。

关于optimization - 如何让 SBCL 优化掉对 DEFINITION 的可能调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com