/numpower

PHP extension for efficient scientific computing and array manipulation with GPU support

Primary LanguagePHPOtherNOASSERTION

NumPower

Typing SVG

Inspired by NumPy, the NumPower library was created to provide the foundation for efficient scientific computing in PHP, as well as leverage the machine learning tools and libraries that already exist and can benefit from it.

This C extension developed for PHP can be used to considerably speed up mathematical operations on large datasets and facilitate the manipulation, creation and operation of N-dimensional tensors.

NumPower was designed from the ground up to utilize AVX2 and the GPU to further improve performance. With the use of contiguous single precision arrays, slices, buffer sharing and a specific GC engine, NumPower aims to manage memory more efficiently than a matrix in PHP arrays

Typing SVG

Documentation & Installation

Requirements

  • PHP 8.x
  • LAPACKE
  • OpenBLAS
  • Optional: Intel MKL
  • Optional (GPU): CUBLAS, CUDA Build Toolkit and cuDNN
  • Optional (Image): PHP-GD

Compiling

$ phpize
$ ./configure
$ make install

Compiling with GPU (CUDA) support

$ phpize
$ ./configure --with-cuda
$ make install-cuda

Composer install

The composer package provides a stubs file to facilitate autocomplete in the IDE. To install, simply run the command below in your environment with composer installed:

$ composer require numpower/numpower

The composer package will follow the same versioning as the extension.

GPU support

If you have an NVIDIA graphics card with CUDA support, you can use your graphics card to perform operations. To do this, just copy your array to the GPU memory.

use \NDArray as nd;

$x = nd::ones([10, 10]);
$y = nd::ones([10, 10]);

$x_gpu = $x->gpu();   // Copy $x from RAM to VRAM
$y_gpu = $y->gpu();   // Copy $y from RAM to VRAM

$r = nd::matmul($x_gpu, $y_gpu); // Matmul is performed using CUDA

Both GPU and CPU memory management are done automatically by NumPower, so the memory of both devices will be automatically freed by the garbage collector. You can also bring arrays back from VRAM into RAM:

$x_cpu = $x->cpu();

You must explicitly copy the arrays you want to use in your devices. Cross-array operations (like adding) will raise an exception if the arrays used are on different devices.