Does C::Blocks really require the perl keyword API to work?
It would be nice if there was a version that could work with
perl 5.10.x.

--Chris

On 8/4/2015 17:33, David Mertens wrote:
Hey Chris,

I wish I could say something more precise and causal about why PDL is slowing down, but it's hard without measurements. I think the JIT has some promise both in producing context-optimized code, but more importantly for playing around with the internals.

The keyword API was introduced in v5.12. Also, I just found a way to get lexical variable insertion working for Perls earlier than 5.18, although I have not yet pushed it to CPAN.

David

On Tue, Aug 4, 2015 at 4:33 PM, Chris Marshall <[email protected] <mailto:[email protected]>> wrote:

    Neat, David.  I'm looking forward to trying...

    What version of perl is required to support the keyword API?

    Regarding the latency comparison, the C::Blocks implementation
    is arguably close to optimal latency to issue a perl operation.
    The motivation for JIT compiling for PDL3 is precisely to address
    the problems of latency and extra memory motion (cache thrash).
    Your timings indicate that this approach for JIT has promise for
    some significant performance improvements.

    --Chris



    On Tue, Aug 4, 2015 at 1:35 PM, David Mertens
    <[email protected] <mailto:[email protected]>> wrote:

        Hello everyone,

        While this is not strictly a PDL announcement, it is something
        that will undoubtedly be of interest to PDL users, and may
        even be of interest to PDL developers.

        Yesterday I pushed the first "alpha" release of C::Blocks
        <https://metacpan.org/pod/C::Blocks>, a module designed to
        make it much easier to write and share C code and data
        structures among your Perl code.

        How does this work? C::Blocks uses Perl's keyword API to add
        the "cblock" keyword
        <https://metacpan.org/pod/C::Blocks#Procedural-Blocks> (among
        a couple
        <https://metacpan.org/pod/C::Blocks#Private-C-Declarations> of
        <https://metacpan.org/pod/C::Blocks#Shared-C-Declarations>
        others <https://metacpan.org/pod/C::Blocks#csub-name-code>).
        This keyword expects a curly-bracket-delimited block of C code
        that gets executed in-place. It achieves this by jit-compiling
        the block of C code and inserting an OP in place of the block
        of code during Perl parse time.

        There are two technical problem that I had to solve to get
        C::Blocks to be computationally effective. First, C::Blocks is
        built on my own fork of the Tiny C Compiler
        <https://github.com/run4flat/tinycc> that makes it possible to
        make a copy of a compilation unit's symbol table. This makes
        it possible to declare a struct definition, write a function,
        or #include a set of header files in one (clex or cshare)
        block, and have other blocks use that information without
        having to recompile any of it. Second, this extended symbol
        table information can be cached and quickly loaded from disk,
        something that I use to rapidly load Perl's C API
        <https://metacpan.org/pod/C::Blocks::PerlAPI>.

        In this case, "alpha" means that it passes its test suite on
        at least one of the operating systems I have access to
        (Linux), and it compiles and passes at least some tests on all
        operating systems that I have access to (Mac and Windows). In
        other words, it looks like it'll fly, but it's still quite
        fragile. The goal for the alpha release series is to iron out
        the bugs and get it to compile and pass all of its tests on
        all major platforms.

        I have worked on a few benchmarks
        <https://metacpan.org/source/DCMERTENS/C-Blocks-0.01/bench>
        for C::Blocks and have been quite surprised by the results. So
        surprised, in fact, that I had to double-check that my Perl
        had been compiled with decent optimization (it had).
        Benchmarks on my Linux laptop indicate that for simple
        operations (i.e. sum) on small arrays (N < 3000), PDL's method
        setup and teardown are so costly that they dominate the
        calculation, and C::Blocks code wins handily. PDL gets the
        upper hand near N = 10,000, but only beats C::Blocks by a
        factor of 2. A more interesting benchmark was for the
        operation "sqrt(sum($pdl_data*$pdl_data))", an N-dimensional
        Euclidean distance. For this, the C::Blocks equivalent code
        was comparable except in the vicinity of N = 100,000, where
        PDL beat it by a factor of 2. The method setup and teardown
        dominated PDL performance for small N, and for large N the
        memory allocations and re-allocations degraded PDL's
        performance to the point that they both performed the
        calculation at essentially the same rate.

        You can learn more about C::Blocks at the CPAN page:
        https://metacpan.org/pod/C::Blocks.

        David

-- "Debugging is twice as hard as writing the code in the first
        place.
          Therefore, if you write the code as cleverly as possible,
        you are,
          by definition, not smart enough to debug it." -- Brian Kernighan

        
------------------------------------------------------------------------------

        _______________________________________________
        pdl-general mailing list
        [email protected]
        <mailto:[email protected]>
        https://lists.sourceforge.net/lists/listinfo/pdl-general





--
 "Debugging is twice as hard as writing the code in the first place.
  Therefore, if you write the code as cleverly as possible, you are,
  by definition, not smart enough to debug it." -- Brian Kernighan

------------------------------------------------------------------------------
_______________________________________________
pdl-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-general

Reply via email to