[Openmcl-devel] Performance Question

Brent Fulgham bfulg at pacbell.net
Tue Jan 2 20:11:33 PST 2007


The main performance problem in my code appears to be the  
implementation of the floating point array stuff.

Attached is a test case outlining the problem.

If I run this under OpenMCL (the 12-31-2006 build):

? (time (dotimes (i 5000)
         (defparameter *A* (rlet ((BB (array :single-float 4)))
              (init-array BB :single-float 0.1 0.2 0.3 0.4)))))
(DOTIMES (I 5000) (DEFPARAMETER *A* (RLET ((BB (ARRAY :SINGLE-FLOAT  
4))) (INIT-ARRAY BB :SINGLE-FLOAT 0.1 0.2 0.3 0.4)))) took 4,694  
milliseconds (4.694 seconds) to run.
Of that, 1,090 milliseconds (1.090 seconds) were spent in user mode
          1,719 milliseconds (1.719 seconds) were spent in system mode
          1,885 milliseconds (1.885 seconds) were spent executing  
other OS processes.
14 milliseconds (0.014 seconds) was spent in GC.
10,613,672 bytes of memory allocated.
NIL
?

If I run this code in the demo version of MCL 5.1, the performance is  
about an 40 times better, and conses about a 50th as much memory:

? (time (dotimes (i 5000)
      (defparameter *A* (rlet ((BB (array :single-float 4)))
        (ccl::init-array BB :single-float 0.1 0.2 0.3 0.4)))))
(DOTIMES (I 5000) (DEFPARAMETER *A* (RLET ((BB (ARRAY :SINGLE-FLOAT  
4))) (CCL::INIT-ARRAY BB :SINGLE-FLOAT 0.1 0.2 0.3 0.4)))) took 185  
milliseconds (0.185 seconds) to run.
  200,016 bytes of memory allocated.

This pretty closely matches the 40-fold slow-down in frame rate I see  
in simple tests of the OpenGL stuff under OpenMCL compared to MCL.

If I hard-code the sizes in the %put-long/%put-single-float it speeds  
things up considerably, though memory use is still very large:

Of that, 277 milliseconds (0.277 seconds) were spent in user mode
          413 milliseconds (0.413 seconds) were spent in system mode
          59 milliseconds (0.059 seconds) were spent executing other  
OS processes.
7 milliseconds (0.007 seconds) was spent in GC.
2,133,672 bytes of memory allocated.


Thanks,

-Brent


==========================================================
Test Implementation
==========================================================
(eval-when (:compile-toplevel :load-toplevel :execute)
   (ccl:use-interface-dir :carbon)
   (open-shared-library "/System/Library/Frameworks/Carbon.framework/ 
Carbon"))

(defun %sizeof (type)
    (ccl::%foreign-type-or-record-size type :bytes))

(defun record-field-length (Type)
    (%sizeof Type))

(defmacro %put-long (Name Value &optional (Index 0))
   `(eval-when (compile eval load)
      (setf (%get-long ,Name (* ,Index (%sizeof :long))) ,Value)))
;
;  "speedy" version
;
;(defmacro %put-long (Name Value &optional (Index 0))
;  `(eval-when (compile eval load)
;     (setf (%get-long ,Name (* ,Index 4)) ,Value)))

(defmacro %put-single-float (Name Value Index)
   `(eval-when (compile eval load)
      (setf (%get-single-float ,Name (* ,Index (%sizeof :single- 
float))) ,Value)))
;
;  "speedy" version
;
;(defmacro %put-single-float (Name Value Index)
;  `(eval-when (compile eval load)
;     (setf (%get-single-float ,Name (* ,Index 4)) ,Value)))

(defun INIT-ARRAY (&array Type &rest Values)
   (declare (dynamic-extent Values))
   (let ((Index 0)
         (Size (record-field-length Type)))
     (dolist (Value Values &Array)
       (ecase Type
         (:long (%put-long &Array Value Index))
         (:single-float (%put-single-float &Array Value Index)))
       (incf Index 1))))

(defmacro WITH-RGBA-VECTOR (Vector (Red Green Blue Alpha) &body Forms)
   `(rlet ((,Vector (array :single-float 4)))
      (init-array ,Vector :single-float ,Red ,Green ,Blue ,Alpha)
      , at Forms))

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20070102/3fdf7698/attachment.htm>


More information about the Openmcl-devel mailing list