Just-in-time compiler

From MMVLWiki
(Difference between revisions)
Jump to: navigation, search
m
m
 
(7 intermediate revisions by one user not shown)
Line 1: Line 1:
[[HornetsEye]] makes use of [http://dotgnu.org/libjit-doc/libjit.html libjit]. This means that you can even define and compile
+
The Ruby-extension version 0.33 of [[HornetsEye]] makes use of [http://dotgnu.org/libjit-doc/libjit.html libjit]. This means that you can even define and compile methods during runtime. Here is a 46 MByte video demonstrating this capability. I recommend to watch the [http://vision.eng.shu.ac.uk/jan/jitdemo.ogv OGG video] instead of the Shockwave video. It is of much higher quality.
methods during runtime. Here is a 46 MByte video demonstrating this capability. I recommend to watch the
+
[http://vision.eng.shu.ac.uk/jan/jitdemo.ogg OGG video] instead of the Shockwave video. It is of much higher quality.
+
  
 
{|align="center"
 
{|align="center"
Line 13: Line 11:
 
         pluginspage="http://www.macromedia.com/go/getflashplayer"/>
 
         pluginspage="http://www.macromedia.com/go/getflashplayer"/>
 
       <div class="thumbcaption" >
 
       <div class="thumbcaption" >
         Demonstration of using the just-in-time compiler with HornetsEye. You can also view the <a href="http://vision.eng.shu.ac.uk/jan/jitdemo.ogg">OGG-video of the JIT demo</a> which is of higher quality. The video was created using <a href="http://recordmydesktop.sourceforge.net/">recordMyDesktop</a>
+
         Demonstration of an interactive Ruby-session using libjit and HornetsEye. You can also view the <a href="http://vision.eng.shu.ac.uk/jan/jitdemo.ogv">OGG-video of the JIT demo</a> which is of higher quality. The video was created using <a href="http://recordmydesktop.sourceforge.net/">recordMyDesktop</a>. The <a href="http://en.wikipedia.org/wiki/Image:Hong_Kong_Night_Skyline.jpg">Hong Kong skyline</a> was used as a background picture
 
       </div>
 
       </div>
 
     </div>
 
     </div>
Line 21: Line 19:
 
|-
 
|-
 
|}
 
|}
 +
 +
# Load colour image.
 +
img = MultiArray.load_rgb24( "/home/engjw/Documents/pictures/miraculix.jpg" )
 +
# Display the image.
 +
img.show
 +
# Convert the image to grey-level floating point.
 +
gimg = img.to_sfloat
 +
# Display grey-level image.
 +
gimg.show
 +
# Downsample the image with a sampling-rate of 2 in each direction and a sampling-offset of 1.
 +
limg = gimg.downsample( [ 2, 2 ], [ 1, 1 ] )
 +
# Display low-resolution image.
 +
limg.show
 +
# Apply element-wise function to each pixel of the image.
 +
limg.collect { |x| x * x }
 +
# Display processed image.
 +
( limg.collect { |x| x * x } ).show
 +
# Display range of values.
 +
( limg.collect { |x| x * x } ).range
 +
# Display range after normalisation.
 +
( limg.collect { |x| x * x } ).normalise.range
 +
# Display normalised result.
 +
( limg.collect { |x| x * x } ).normalise.show
 +
# Show data as one-dimensional array.
 +
limg.data
 +
# Define an element-wise function for one-dimensional arrays.
 +
Sequence.define_unary_op( :sqr ) { |x| x * x }
 +
# Reuse this function for multidimensional arrays.
 +
MultiArray.define_unary_op( :sqr )
 +
# Call the function.
 +
limg.sqr
 +
# Measure time of operation.
 +
t = Time.new.to_f; limg.sqr; Time.new.to_f - t
 +
# Example function using libJIT.
 +
fun = JITFunction.compile( JITType::LINT, JITType::LINT ) do |f|
 +
    ( JITTerm.param( f, 0 ) * JITTerm.const( f, JITType::LINT, 2 ) ).return_me
 +
end
 +
# Calling the function.
 +
fun.call( 2 )
 +
# Define element-wise operation using JIT.
 +
Sequence.define_unary_jit_op( :sqr ) { |x| x * x }
 +
# Measure time of operation now.
 +
t = Time.new.to_f; limg.sqr; Time.new.to_f - t
 +
# Apply function and display result.
 +
gimg.sqr.normalise.show
 +
# Apply function twice and display result.
 +
gimg.sqr.sqr.normalise.show
 +
# Define a small filter.
 +
f = MultiArray.to_multiarray( [ [ -1, 0, 1 ], [ -2, 0, 2 ], [ -1, 0, 1 ] ] )
 +
# Correlate with this filter (slow).
 +
limg.correlate( f )
 +
# Correlate with filter using native datatypes to facilitate the JIT-based implementation.
 +
limg.correlate( f.to_sint )
 +
# Sobel-X operator.
 +
gimg.sobel_x
 +
# Display Sobel-X and Sobel-Y image.
 +
gimg.sobel_x.normalise.show
 +
gimg.sobel_y.normalise.show
 +
# Define an edge detector.
 +
class MultiArray
 +
  def edges
 +
    Math.sqrt( sobel_x.sqr + sobel_y.sqr )
 +
  end
 +
end
 +
# Compute edges.
 +
gimg.edges
 +
# Display edges.
 +
gimg.edges.normalise.show
 +
# Display edges black-on-white.
 +
( 255 - gimg.edges.normalise ).show
 +
# Same but more efficient.
 +
gimg.edges.normalise( 255..0 ).show
 +
 
=See Also=
 
=See Also=
* [[Hornetseye]]
+
* [[Image:Hornetseye.png|40px]] [[HornetsEye]]
  
 
=External Links=
 
=External Links=
 
* [[Image:Dotgnu.png|110px]] [http://dotgnu.org/libjit-doc/libjit.html JIT library]
 
* [[Image:Dotgnu.png|110px]] [http://dotgnu.org/libjit-doc/libjit.html JIT library]
 +
 +
{{Addthis}}
  
 
[[Category:Projects]]
 
[[Category:Projects]]
 
[[Category:Nanorobotics]]
 
[[Category:Nanorobotics]]

Latest revision as of 14:39, 19 March 2010

The Ruby-extension version 0.33 of HornetsEye makes use of libjit. This means that you can even define and compile methods during runtime. Here is a 46 MByte video demonstrating this capability. I recommend to watch the OGG video instead of the Shockwave video. It is of much higher quality.

Demonstration of an interactive Ruby-session using libjit and HornetsEye. You can also view the OGG-video of the JIT demo which is of higher quality. The video was created using recordMyDesktop. The Hong Kong skyline was used as a background picture
# Load colour image.
img = MultiArray.load_rgb24( "/home/engjw/Documents/pictures/miraculix.jpg" )
# Display the image.
img.show
# Convert the image to grey-level floating point.
gimg = img.to_sfloat
# Display grey-level image.
gimg.show
# Downsample the image with a sampling-rate of 2 in each direction and a sampling-offset of 1.
limg = gimg.downsample( [ 2, 2 ], [ 1, 1 ] )
# Display low-resolution image.
limg.show
# Apply element-wise function to each pixel of the image.
limg.collect { |x| x * x }
# Display processed image.
( limg.collect { |x| x * x } ).show
# Display range of values.
( limg.collect { |x| x * x } ).range
# Display range after normalisation.
( limg.collect { |x| x * x } ).normalise.range
# Display normalised result.
( limg.collect { |x| x * x } ).normalise.show
# Show data as one-dimensional array.
limg.data
# Define an element-wise function for one-dimensional arrays.
Sequence.define_unary_op( :sqr ) { |x| x * x }
# Reuse this function for multidimensional arrays.
MultiArray.define_unary_op( :sqr )
# Call the function.
limg.sqr
# Measure time of operation.
t = Time.new.to_f; limg.sqr; Time.new.to_f - t
# Example function using libJIT.
fun = JITFunction.compile( JITType::LINT, JITType::LINT ) do |f|
   ( JITTerm.param( f, 0 ) * JITTerm.const( f, JITType::LINT, 2 ) ).return_me
end
# Calling the function.
fun.call( 2 )
# Define element-wise operation using JIT.
Sequence.define_unary_jit_op( :sqr ) { |x| x * x }
# Measure time of operation now.
t = Time.new.to_f; limg.sqr; Time.new.to_f - t
# Apply function and display result.
gimg.sqr.normalise.show
# Apply function twice and display result.
gimg.sqr.sqr.normalise.show
# Define a small filter.
f = MultiArray.to_multiarray( [ [ -1, 0, 1 ], [ -2, 0, 2 ], [ -1, 0, 1 ] ] )
# Correlate with this filter (slow).
limg.correlate( f )
# Correlate with filter using native datatypes to facilitate the JIT-based implementation.
limg.correlate( f.to_sint )
# Sobel-X operator.
gimg.sobel_x
# Display Sobel-X and Sobel-Y image.
gimg.sobel_x.normalise.show
gimg.sobel_y.normalise.show
# Define an edge detector.
class MultiArray
  def edges
    Math.sqrt( sobel_x.sqr + sobel_y.sqr )
  end
end
# Compute edges.
gimg.edges
# Display edges.
gimg.edges.normalise.show
# Display edges black-on-white.
( 255 - gimg.edges.normalise ).show
# Same but more efficient.
gimg.edges.normalise( 255..0 ).show

[edit] See Also

[edit] External Links

Bookmark and Share

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox