Performances of 2D integration vs 1D integration#

This is dependent on:

  • Number of azimuthal bins

  • Pixel splitting

  • Algorithm

  • Implementation (i.e. programming language)

  • Hardware used

Thus there is no general answer. But here is a quick benchmark to evaluate the penalty on performances:

import sys import os import time import numpy import fabio import pyFAI from pyFAI.test.utilstest import UtilsTest import pyFAI.method_registry import pyFAI.integrator.azimuthal print(f”Python version: {sys.version}”) print(f”PyFAI version: {pyFAI.version}”) start_time = time.perf_counter()

import sys
import os
import time

os.environ["PYOPENCL_COMPILER_OUTPUT"] = "0"
start_time = time.perf_counter()
import fabio
import pyFAI
from pyFAI.test.utilstest import UtilsTest
import pyFAI.method_registry
import pyFAI.integrator.azimuthal
print(f"Python version: {sys.version}")
print(f"PyFAI version: {pyFAI.version}")
Python version: 3.13.1 | packaged by conda-forge | (main, Jan 13 2025, 09:53:10) [GCC 13.3.0]
PyFAI version: 2026.9.0
print("Number of way to performing integration:", len(pyFAI.method_registry.IntegrationMethod.list_available()))
Number of way to performing integration: 95
ai = pyFAI.load(UtilsTest.getimage("Pilatus1M.poni"))
img = fabio.open(UtilsTest.getimage("Pilatus1M.edf")).data
ai
Detector Pilatus 1M	 PixelSize= 172µm, 172µm	 BottomRight (3)
Wavelength= 1.000000 Å
SampleDetDist= 1.583231e+00 m	PONI= 3.341702e-02, 4.122778e-02 m	rot1=0.006487  rot2=0.007558  rot3=0.000000 rad
DirectBeamDist= 1583.310 mm	Center: x=179.981, y=263.859 pix	Tilt= 0.571° tiltPlanRotation= 130.640° λ= 1.000Å
%%time
#Tune those parameters to match your needs:
kw1 = {"data": img, "npt":1000}
kw2 = {"data": img, "npt_rad":1000}
#Actual benchmark:
res = {}
for k,v in pyFAI.method_registry.IntegrationMethod._registry.items():
    print(k)
    if k.dim == 1:
        res[k] = %timeit -o ai.integrate1d(method=v, **kw1)
    else:
        res[k] = %timeit -o ai.integrate2d(method=v, **kw2)
Method(dim=1, split='no', algo='histogram', impl='python', target=None)
30.6 ms ± 109 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Method(dim=2, split='no', algo='histogram', impl='python', target=None)
123 ms ± 501 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Method(dim=1, split='no', algo='histogram', impl='cython', target=None)
11.3 ms ± 48.2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='histogram', impl='cython', target=None)
16.5 ms ± 137 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='histogram', impl='cython', target=None)
26.7 ms ± 49.1 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Method(dim=2, split='bbox', algo='histogram', impl='cython', target=None)
33.1 ms ± 86.2 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Method(dim=1, split='full', algo='histogram', impl='cython', target=None)
140 ms ± 930 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Method(dim=2, split='full', algo='histogram', impl='cython', target=None)
268 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='pseudo', algo='histogram', impl='cython', target=None)
346 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='csr', impl='cython', target=None)
11.4 ms ± 1.17 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='csr', impl='cython', target=None)
11.4 ms ± 474 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csr', impl='cython', target=None)
12 ms ± 996 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='csr', impl='cython', target=None)
14.3 ms ± 714 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='no', algo='csr', impl='python', target=None)
10.1 ms ± 158 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='csr', impl='python', target=None)
14.3 ms ± 58.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csr', impl='python', target=None)
13.2 ms ± 33.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='csr', impl='python', target=None)
20.7 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='no', algo='csc', impl='cython', target=None)
6.97 ms ± 4.57 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='csc', impl='cython', target=None)
9.77 ms ± 59.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csc', impl='cython', target=None)
9.05 ms ± 15.1 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='csc', impl='cython', target=None)
12.7 ms ± 46.7 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='no', algo='csc', impl='python', target=None)
11 ms ± 46.5 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='csc', impl='python', target=None)
14.3 ms ± 17.7 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csc', impl='python', target=None)
14.8 ms ± 11.4 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='csc', impl='python', target=None)
22 ms ± 34.5 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='lut', impl='cython', target=None)
11.9 ms ± 782 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='lut', impl='cython', target=None)
17.8 ms ± 2.65 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='lut', impl='cython', target=None)
12 ms ± 1.17 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='lut', impl='cython', target=None)
16.2 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='lut', impl='cython', target=None)
15.9 ms ± 1.17 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='full', algo='lut', impl='cython', target=None)
15.5 ms ± 3.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='cython', target=None)
11.2 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='csr', impl='cython', target=None)
16 ms ± 1.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='python', target=None)
12.8 ms ± 24.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='csr', impl='python', target=None)
16.7 ms ± 33.3 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csc', impl='cython', target=None)
9.39 ms ± 11.5 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='full', algo='csc', impl='cython', target=None)
13.1 ms ± 94.4 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csc', impl='python', target=None)
15.1 ms ± 20.2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='csc', impl='python', target=None)
21.7 ms ± 40 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='histogram', impl='opencl', target=(0, 0))
8.96 ms ± 13.4 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='histogram', impl='opencl', target=(0, 0))
2.73 ms ± 11.2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='no', algo='histogram', impl='opencl', target=(0, 1))
8.45 ms ± 47.6 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='histogram', impl='opencl', target=(0, 1))
4.17 ms ± 11 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='no', algo='histogram', impl='opencl', target=(1, 0))
1 error generated.
WARNING:pyFAI.opencl.azim_hist:Your OpenCL compiler wrongly claims it support 64-bit atomics. Degrading to 32 bits atomics!
15.5 ms ± 1.46 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='no', algo='histogram', impl='opencl', target=(1, 0))
1 error generated.
WARNING:pyFAI.opencl.azim_hist:Your OpenCL compiler wrongly claims it support 64-bit atomics. Degrading to 32 bits atomics!
10.2 ms ± 2.07 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='histogram', impl='opencl', target=(2, 0))
/users/kieffer/.venv/py313/lib/python3.13/site-packages/pyopencl/cache.py:445: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  prg.build(options_bytes, [devices[i] for i in to_be_built_indices])
WARNING:pyFAI.opencl.azim_hist:Your OpenCL compiler wrongly claims it support 64-bit atomics. Degrading to 32 bits atomics!
12.4 ms ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='no', algo='histogram', impl='opencl', target=(2, 0))
WARNING:pyFAI.opencl.azim_hist:Your OpenCL compiler wrongly claims it support 64-bit atomics. Degrading to 32 bits atomics!
7.34 ms ± 2.56 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='csr', impl='opencl', target=(0, 0))
704 μs ± 1.29 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='bbox', algo='csr', impl='opencl', target=(0, 0))
2.6 ms ± 79.6 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='csr', impl='opencl', target=(0, 0))
661 μs ± 2.48 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='no', algo='csr', impl='opencl', target=(0, 0))
2.32 ms ± 1.63 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csr', impl='opencl', target=(0, 1))
1.22 ms ± 2.07 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='bbox', algo='csr', impl='opencl', target=(0, 1))
6.13 ms ± 72.6 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='csr', impl='opencl', target=(0, 1))
1.09 ms ± 3.89 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='no', algo='csr', impl='opencl', target=(0, 1))
5.99 ms ± 2.35 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csr', impl='opencl', target=(1, 0))
3.54 ms ± 16.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='csr', impl='opencl', target=(1, 0))
8.69 ms ± 612 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='csr', impl='opencl', target=(1, 0))
3.07 ms ± 12.7 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='csr', impl='opencl', target=(1, 0))
6.27 ms ± 206 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=1, split='bbox', algo='csr', impl='opencl', target=(2, 0))
3.64 ms ± 145 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='bbox', algo='csr', impl='opencl', target=(2, 0))
84.5 ms ± 2.23 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='csr', impl='opencl', target=(2, 0))
/users/kieffer/.venv/py313/lib/python3.13/site-packages/pyopencl/cache.py:527: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  _create_built_program_from_source_cached(
/users/kieffer/.venv/py313/lib/python3.13/site-packages/pyopencl/cache.py:531: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  prg.build(options_bytes, devices)
2.75 ms ± 387 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='no', algo='csr', impl='opencl', target=(2, 0))
84.6 ms ± 2.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='opencl', target=(0, 0))
711 μs ± 1.99 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='full', algo='csr', impl='opencl', target=(0, 0))
2.57 ms ± 77.5 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='opencl', target=(0, 1))
1.22 ms ± 858 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='full', algo='csr', impl='opencl', target=(0, 1))
6.08 ms ± 47.5 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='opencl', target=(1, 0))
4.26 ms ± 23.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='csr', impl='opencl', target=(1, 0))
9.25 ms ± 554 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='csr', impl='opencl', target=(2, 0))
3.9 ms ± 366 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='full', algo='csr', impl='opencl', target=(2, 0))
84.5 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='lut', impl='opencl', target=(0, 0))
3.18 ms ± 11.2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='lut', impl='opencl', target=(0, 0))
443 ms ± 13.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='lut', impl='opencl', target=(0, 0))
1.6 ms ± 6.56 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='no', algo='lut', impl='opencl', target=(0, 0))
268 ms ± 6.25 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='lut', impl='opencl', target=(0, 1))
3.15 ms ± 2.78 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='lut', impl='opencl', target=(0, 1))
554 ms ± 7.37 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='lut', impl='opencl', target=(0, 1))
1.82 ms ± 2.55 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Method(dim=2, split='no', algo='lut', impl='opencl', target=(0, 1))
246 ms ± 5.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='lut', impl='opencl', target=(1, 0))
4.76 ms ± 62.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='bbox', algo='lut', impl='opencl', target=(1, 0))
378 ms ± 50 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='lut', impl='opencl', target=(1, 0))
3.71 ms ± 52.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='no', algo='lut', impl='opencl', target=(1, 0))
257 ms ± 23.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='bbox', algo='lut', impl='opencl', target=(2, 0))
4.66 ms ± 417 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='bbox', algo='lut', impl='opencl', target=(2, 0))
259 ms ± 7.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='no', algo='lut', impl='opencl', target=(2, 0))
3.33 ms ± 144 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='no', algo='lut', impl='opencl', target=(2, 0))
256 ms ± 50.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='lut', impl='opencl', target=(0, 0))
2.59 ms ± 2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='lut', impl='opencl', target=(0, 0))
555 ms ± 4.82 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='lut', impl='opencl', target=(0, 1))
2.78 ms ± 155 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='lut', impl='opencl', target=(0, 1))
529 ms ± 2.25 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='lut', impl='opencl', target=(1, 0))
4.77 ms ± 88.8 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Method(dim=2, split='full', algo='lut', impl='opencl', target=(1, 0))
336 ms ± 32.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=1, split='full', algo='lut', impl='opencl', target=(2, 0))
5.12 ms ± 342 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Method(dim=2, split='full', algo='lut', impl='opencl', target=(2, 0))
428 ms ± 51.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
CPU times: user 1h 24min 6s, sys: 2min 28s, total: 1h 26min 34s
Wall time: 7min 38s
print("-"*80)
print(f"{'Split':5s} | {'Algo':9s} | {'Impl':6s}| {'1d (ms)':8s} | {'2d (ms)':8s} | {'ratio':6s} | Device")
print("-"*80)
for k in res:
    if k.dim == 1:
        k1 = k
        k2 = k._replace(dim=2)
        if k2 in res:
            print(f"{k1.split:5s} | {k1.algo:9s} | {k1.impl:6s}| {res[k1].best*1000:8.3f} | {res[k2].best*1000:8.3f} | {res[k2].best/res[k1].best:6.1f} | ",
                    end="")
        if k.target:
            print(pyFAI.method_registry.IntegrationMethod._registry.get(k).target_name)
        else:
            print()
print("-"*80)
--------------------------------------------------------------------------------
Split | Algo      | Impl  | 1d (ms)  | 2d (ms)  | ratio  | Device
--------------------------------------------------------------------------------
no    | histogram | python|   30.506 |  122.610 |    4.0 | 
no    | histogram | cython|   11.235 |   16.283 |    1.4 | 
bbox  | histogram | cython|   26.663 |   33.054 |    1.2 | 
full  | histogram | cython|  138.818 |  265.720 |    1.9 | 
no    | csr       | cython|    9.326 |   10.673 |    1.1 | 
bbox  | csr       | cython|   10.563 |   12.923 |    1.2 | 
no    | csr       | python|    9.894 |   14.225 |    1.4 | 
bbox  | csr       | python|   13.196 |   17.687 |    1.3 | 
no    | csc       | cython|    6.966 |    9.718 |    1.4 | 
bbox  | csc       | cython|    9.033 |   12.614 |    1.4 | 
no    | csc       | python|   10.950 |   14.282 |    1.3 | 
bbox  | csc       | python|   14.823 |   21.925 |    1.5 | 
bbox  | lut       | cython|   10.894 |   12.191 |    1.1 | 
no    | lut       | cython|    9.405 |   14.122 |    1.5 | 
full  | lut       | cython|   13.995 |   11.820 |    0.8 | 
full  | csr       | cython|    9.079 |   13.611 |    1.5 | 
full  | csr       | python|   12.763 |   16.640 |    1.3 | 
full  | csc       | cython|    9.370 |   12.954 |    1.4 | 
full  | csc       | python|   15.076 |   21.606 |    1.4 | 
no    | histogram | opencl|    8.944 |    2.713 |    0.3 | NVIDIA CUDA / NVIDIA RTX A5000
no    | histogram | opencl|    8.397 |    4.157 |    0.5 | NVIDIA CUDA / Quadro P2200
no    | histogram | opencl|   14.474 |    8.737 |    0.6 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
no    | histogram | opencl|   10.671 |    5.639 |    0.5 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
bbox  | csr       | opencl|    0.702 |    2.556 |    3.6 | NVIDIA CUDA / NVIDIA RTX A5000
no    | csr       | opencl|    0.660 |    2.317 |    3.5 | NVIDIA CUDA / NVIDIA RTX A5000
bbox  | csr       | opencl|    1.219 |    6.079 |    5.0 | NVIDIA CUDA / Quadro P2200
no    | csr       | opencl|    1.081 |    5.990 |    5.5 | NVIDIA CUDA / Quadro P2200
bbox  | csr       | opencl|    3.512 |    7.983 |    2.3 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
no    | csr       | opencl|    3.053 |    6.065 |    2.0 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
bbox  | csr       | opencl|    3.505 |   83.285 |   23.8 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
no    | csr       | opencl|    2.368 |   82.595 |   34.9 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
full  | csr       | opencl|    0.710 |    2.531 |    3.6 | NVIDIA CUDA / NVIDIA RTX A5000
full  | csr       | opencl|    1.223 |    6.052 |    4.9 | NVIDIA CUDA / Quadro P2200
full  | csr       | opencl|    4.230 |    8.486 |    2.0 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
full  | csr       | opencl|    3.575 |   83.714 |   23.4 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
bbox  | lut       | opencl|    3.166 |  425.986 |  134.6 | NVIDIA CUDA / NVIDIA RTX A5000
no    | lut       | opencl|    1.597 |  255.142 |  159.8 | NVIDIA CUDA / NVIDIA RTX A5000
bbox  | lut       | opencl|    3.148 |  548.202 |  174.1 | NVIDIA CUDA / Quadro P2200
no    | lut       | opencl|    1.815 |  241.674 |  133.1 | NVIDIA CUDA / Quadro P2200
bbox  | lut       | opencl|    4.651 |  328.324 |   70.6 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
no    | lut       | opencl|    3.601 |  223.489 |   62.1 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
bbox  | lut       | opencl|    3.773 |  251.532 |   66.7 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
no    | lut       | opencl|    3.151 |  205.475 |   65.2 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
full  | lut       | opencl|    2.590 |  548.720 |  211.9 | NVIDIA CUDA / NVIDIA RTX A5000
full  | lut       | opencl|    2.706 |  523.917 |  193.6 | NVIDIA CUDA / Quadro P2200
full  | lut       | opencl|    4.595 |  297.045 |   64.6 | Portable Computing Language / cpu-haswell-AMD Ryzen Threadripper PRO 3975WX 32-Cores
full  | lut       | opencl|    4.857 |  349.008 |   71.9 | Intel(R) OpenCL / AMD Ryzen Threadripper PRO 3975WX 32-Cores
--------------------------------------------------------------------------------
print(f"Total runtime: {time.perf_counter()-start_time:.3f}s")
Total runtime: 459.641s