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