On 02/25/2014 08:35 AM, Chung Leong wrote:
I would like to submit my extension for consideration for inclusion in PECL.


QB is an extension designed to enable PHP applications to better handle
computationally intensive tasks. While PHP is in general fast enough for
most things, in certain scenarios dynamic typing simply imposes too great
an overhead. This happens most often in image processing, where the number
of operations can easily exceed 10 million. QB alleviates this limitation
by translating and reinterpreting Zend bytecodes through a statically-typed
virtual machine, with the type information embedded in a function's Doc
Comments. It also provides the facility to compile to native code through
an external C compiler, for even greater level of performance.


QB is not a general-purpose accelerator. It's primarily designed for vector
calculation. The relationship to PHP is somewhat like OpenCL to C++: there
are restrictions on what can be done and some differences in semantics.
Multiplication involving arrays is possible in QB, for instance. Code
interpreted through the QB VM also has access to built-in functions that
don't exist in PHP (e.g. dot product).


Starting from version 2.0, QB can dispatch sections of code through
multiple CPU cores. A future goal is to make use of the GPU through OpenCL.


To illustrate the performance gain possible, I'll use a test from the
computer language shootout. On my Celeron-powered laptop, the
fannkuch-redux script (N = 500) takes 21 seconds to finish in PHP. Modified
for execution in QB, the execution time drops to 1.87 seconds. Once
compiled to native code, it drops to 0.40 second--close to what you get from
straight C.


More information about the extension can be found at http://www.php-qb.net.



On older-but-still-common Linuxes, there are some build issues.  If
you decide not to support these platforms, is there anyway you can
fail earlier during configuration and give a good error message?

On more recent versions there are some warnings but the tests run
fine.

Chris

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

On Oracle Linux 6.4 64-bit (identical to RHEL 6.4) with PHP 5.5.9
using gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC):

1. buildconf warning

    $ ./buildconf --force
    Forcing buildconf
    Removing configure caches
    buildconf: checking installation...
    buildconf: autoconf version 2.63 (ok)
    rebuilding configure
    ext/qb/config.m4:43: warning: AC_COMPILE_IFELSE was called before 
AC_USE_SYSTEM_EXTENSIONS
    ../../lib/autoconf/specific.m4:386: AC_USE_SYSTEM_EXTENSIONS is expanded 
from...
    ext/qb/config.m4:43: warning: AC_RUN_IFELSE was called before 
AC_USE_SYSTEM_EXTENSIONS
    rebuilding main/php_config.h.in
    ext/qb/config.m4:43: warning: AC_COMPILE_IFELSE was called before 
AC_USE_SYSTEM_EXTENSIONS
    ../../lib/autoconf/specific.m4:386: AC_USE_SYSTEM_EXTENSIONS is expanded 
from...
    ext/qb/config.m4:43: warning: AC_RUN_IFELSE was called before 
AC_USE_SYSTEM_EXTENSIONS

2. Help text alignment

    The help message in "./configure --help" is not aligned with other
    extensions' messages:

      ...
      --disable-posix         Disable POSIX-like functions
      --with-pspell=DIR       Include PSPELL support.
                              GNU Aspell version 0.50.0 or higher required
      --enable-qb           Enable qb support
      --with-sse=VER          Enable SSE optimization.  VER is the SSE version
      --with-avx=VER          Enable AVX optimization.  VER is the AVX version
      --with-cpu=arch         Enable optimization specific to CPU archecture
      ...


3. Compile warning

    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c: In function 
‘qb_encode_address’:
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:87: warning: passing argument 
3 of ‘qb_get_pointer’ from incompatible pointer type
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:53: note: expected ‘void **’ 
but argument is of type ‘uint32_t **’
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:98: warning: passing argument 
3 of ‘qb_get_pointer’ from incompatible pointer type
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:53: note: expected ‘void **’ 
but argument is of type ‘uint32_t **’
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:99: warning: passing argument 
3 of ‘qb_get_pointer’ from incompatible pointer type
    /home/cjones/j/php-5.5.9/ext/qb/qb_encoder.c:53: note: expected ‘void **’ 
but argument is of type ‘uint32_t **’

4. Test Results:

    Number of tests :  493               394
    Tests skipped   :   99 ( 20.1%) --------
    Tests warned    :    0 (  0.0%) (  0.0%)
    Tests failed    :    0 (  0.0%) (  0.0%)
    Expected fail   :    0 (  0.0%) (  0.0%)
    Tests passed    :  394 ( 79.9%) (100.0%)
    ---------------------------------------------------------------------
    Time taken      :   41 seconds

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


On Oracle Linux 5.10 64-bit (identical to RHEL 5.10) with PHP 5.5.9 using
gcc version 4.1.2 20080704 (Red Hat 4.1.2-54):

1.  buildconf error

     $ ./buildconf --force
     Forcing buildconf
     Removing configure caches
     buildconf: checking installation...
     buildconf: autoconf version 2.59 (ok)
     rebuilding configure
     configure:101040: error: possibly undefined macro: AC_USE_SYSTEM_EXTENSIONS
           If this token and others are legitimate, please use m4_pattern_allow.
           See the Autoconf documentation.
     rebuilding main/php_config.h.in

   When later running './configure --enable-qb' there is the message:

     checking whether to enable qb support... yes
     checking whether to use SSE instructions on x86 processors... no
     checking whether to use AVX instructions on x86 processors... no
     checking whether to enable CPU-specific optimization... no
     checking for library containing exp... none required
     ./configure: line 101040: AC_USE_SYSTEM_EXTENSIONS: command not found

2. Compile warnings

   3a. /tmp/php-5.5.9/ext/qb/qb_function_inliner.h:52:7: warning: no newline at 
end of file

   3b. /tmp/php-5.5.9/ext/qb/qb_printer.h:40:7: warning: no newline at end of 
file

   3c. In file included from /tmp/php-5.5.9/ext/qb/qb.h:142,
                     from /tmp/php-5.5.9/ext/qb/qb_encoder.c:21:
    /tmp/php-5.5.9/ext/qb/qb_encoder.c: In function ‘qb_encode_address’:
    /tmp/php-5.5.9/ext/qb/qb_encoder.c:87: warning: passing argument 3 of 
‘qb_get_pointer’ from incompatible pointer type
    /tmp/php-5.5.9/ext/qb/qb_encoder.c:98: warning: passing argument 3 of 
‘qb_get_pointer’ from incompatible pointer type
    /tmp/php-5.5.9/ext/qb/qb_encoder.c:99: warning: passing argument 3 of 
‘qb_get_pointer’ from incompatible pointer type

3. Compile error

    In file included from /tmp/php-5.5.9/ext/qb/qb.h:142,
                     from 
/tmp/php-5.5.9/ext/qb/qb_interpreter_functions_gcc.c:21:
    /tmp/php-5.5.9/ext/qb/qb_interpreter_functions_gcc.c:33374: error: 
‘qsort_r’ undeclared here (not in a function)
    make: *** [ext/qb/qb_interpreter_functions_gcc.lo] Error 1

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

--
[email protected]  http://twitter.com/ghrd
Free PHP & Oracle book:
http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html

--
PECL development discussion Mailing List (http://pecl.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to