From 7870ccfc32b5ba5e8f3deaf4ca932ba078d1bde1 Mon Sep 17 00:00:00 2001 From: kferjaoui Date: Wed, 2 Sep 2026 15:00:39 +0200 Subject: [PATCH] CUDA: expose in docs, drop dead headers Doxygen never read *.cuh and needs EXTENSION_MAPPING to parse it; add both, plus C++/Python pages and AARE_CUDA build docs. Delete ClusterFinderCUDA_old.hpp (declared the same class, polluting the API page), utils/batch.hpp, and the deck. All unreferenced. TODO: - Frozen + CUDAGraph: bound in Python, headers not installed. Ship or drop? - test_ClusterFinderCUDA.py guarded on _cuda_available() - AARE_CUDA_ARCHITECTURES=native needs CMake 3.24, project min is 3.15 - make docs somewhere with sphinx+breathe; new .rst files never rendered - fmt nvcc warnings: gone at -std=c++20 or with -isystem --- docs/ClusterFinderCUDA_optimizations.pptx | Bin 145339 -> 0 bytes docs/Doxyfile.in | 4 +- docs/src/ClusterFinderCUDA.rst | 26 + docs/src/Installation.rst | 33 + docs/src/Requirements.rst | 11 + docs/src/index.rst | 1 + docs/src/python/cluster/index.rst | 1 + .../python/cluster/pyClusterFinderCUDA.rst | 11 + include/aare/ClusterFinderCUDA_old.hpp | 435 ------ include/aare/clusterfinder_kernel.cuh | 12 +- include/aare/utils/batch.hpp | 28 - python/tests/ClusterFinderCUDA.ipynb | 1181 ++++++++--------- 12 files changed, 681 insertions(+), 1062 deletions(-) delete mode 100644 docs/ClusterFinderCUDA_optimizations.pptx create mode 100644 docs/src/ClusterFinderCUDA.rst create mode 100644 docs/src/python/cluster/pyClusterFinderCUDA.rst delete mode 100644 include/aare/ClusterFinderCUDA_old.hpp delete mode 100644 include/aare/utils/batch.hpp diff --git a/docs/ClusterFinderCUDA_optimizations.pptx b/docs/ClusterFinderCUDA_optimizations.pptx deleted file mode 100644 index 4dbdb834d2c006e89e98cf35ccb46cf8afa1fda1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145339 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
02%%#%w=dC3`=o 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
}O3DM`Xg(%tq7 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 Z6=V44!9^^c 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

ea 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 E3;XvGZ~y=R diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index bc9ebeaf..60abd60d 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -288,7 +288,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. -EXTENSION_MAPPING = +EXTENSION_MAPPING = cu=C++ cuh=C++ # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable @@ -831,6 +831,8 @@ FILE_PATTERNS = *.c \ *.hxx \ *.hpp \ *.h++ \ + *.cu \ + *.cuh \ *.cs \ *.d \ *.php \ diff --git a/docs/src/ClusterFinderCUDA.rst b/docs/src/ClusterFinderCUDA.rst new file mode 100644 index 00000000..b8a93097 --- /dev/null +++ b/docs/src/ClusterFinderCUDA.rst @@ -0,0 +1,26 @@ +ClusterFinderCUDA +================= + +GPU cluster finder. Available only when aare is configured with +``-DAARE_CUDA=ON``; on a CPU-only build the class is not compiled and the +Python factory raises ``RuntimeError``. + +Single frames go through :cpp:func:`aare::ClusterFinderCUDA::find_clusters`, +which mirrors the CPU :cpp:class:`aare::ClusterFinder` interface. Throughput +comes from ``find_clusters_batched``, which distributes a batch of frames +round-robin over ``n_streams`` CUDA streams (4 by default) and overlaps H2D, +kernel and D2H work. Results are read back either with ``collect``, which +returns one ``ClusterVector`` per frame, or with ``collect_view``, which hands +back a ``BatchView`` reading clusters in place from the pinned host buffer with +no per-frame allocation or copy. + +.. doxygenclass:: aare::ClusterFinderCUDA + :members: + :undoc-members: + +Device kernel +------------- + +.. doxygennamespace:: aare::device + :members: + :undoc-members: diff --git a/docs/src/Installation.rst b/docs/src/Installation.rst index 2cd8c681..53dc3c50 100644 --- a/docs/src/Installation.rst +++ b/docs/src/Installation.rst @@ -109,6 +109,39 @@ Build the Python bindings. Default option is off. If you have a newer system Python compared to the one in your virtual environment, you might have to pass -DPython_FIND_VIRTUALENV=ONLY to cmake. +**AARE_CUDA "Build CUDA cluster finder backend" OFF** + +Build :doc:`ClusterFinderCUDA`, the GPU cluster finder. Default option is off, +in which case aare builds CPU-only and the class is not compiled at all. + +Requires the CUDA toolkit (nvcc) and a compiler combination nvcc accepts; see +:doc:`Requirements`. With ``AARE_PYTHON_BINDINGS=ON`` the CUDA bindings are +built as a separate extension module, ``_aare_cuda``, which avoids nvcc/gcc ABI +conflicts in the main module. The classes are re-exported onto ``aare``, so +imports stay the same either way: + +.. code-block:: bash + + cmake ../aare -DAARE_CUDA=ON -DAARE_PYTHON_BINDINGS=ON + make -j4 + +.. code-block:: python + + from aare import ClusterFinderCUDA, _cuda_available + +On a CPU-only build ``_cuda_available()`` returns False and the +``ClusterFinderCUDA`` factory raises ``RuntimeError``. + +**AARE_CUDA_ARCHITECTURES "CUDA architectures to compile for" native** + +Only used when ``AARE_CUDA=ON``. Defaults to ``native``, which targets the GPU +in the building machine. Set it explicitly to build portable binaries or to +cross-compile for a GPU you are not building on: + +.. code-block:: bash + + cmake ../aare -DAARE_CUDA=ON -DAARE_CUDA_ARCHITECTURES="80;89" + **AARE_TESTS "Build tests" OFF** Build unit tests. Default option is off. diff --git a/docs/src/Requirements.rst b/docs/src/Requirements.rst index 7c44dbdc..5d820976 100644 --- a/docs/src/Requirements.rst +++ b/docs/src/Requirements.rst @@ -19,6 +19,17 @@ To simplify deployment we build and statically link a few libraries. - pybind11 - ZeroMQ +**Extra dependencies for the CUDA backend (-DAARE_CUDA=ON)** + +Only needed to build :doc:`ClusterFinderCUDA`; aare builds CPU-only without them. + +- CUDA toolkit 11.0 or newer (nvcc), and a host compiler that nvcc supports. + The device code is compiled as CUDA C++17, which nvcc supports from CUDA 11. +- CMake 3.24+ if you keep the default ``AARE_CUDA_ARCHITECTURES=native``; + ``native`` is not understood by older CMake. With an explicit architecture + list the project minimum of 3.15 is enough. +- An NVIDIA GPU at runtime. + **Extra dependencies for building documentation** - Sphinx diff --git a/docs/src/index.rst b/docs/src/index.rst index ab22e57d..3891f222 100644 --- a/docs/src/index.rst +++ b/docs/src/index.rst @@ -49,6 +49,7 @@ AARE Cluster ClusterFinder ClusterFinderMT + ClusterFinderCUDA ClusterFile ClusterVector Interpolation diff --git a/docs/src/python/cluster/index.rst b/docs/src/python/cluster/index.rst index 7f218943..6a994c5c 100644 --- a/docs/src/python/cluster/index.rst +++ b/docs/src/python/cluster/index.rst @@ -7,5 +7,6 @@ Cluster & Interpolation pyCluster pyClusterVector + pyClusterFinderCUDA pyInterpolation pyVarClusterFinder diff --git a/docs/src/python/cluster/pyClusterFinderCUDA.rst b/docs/src/python/cluster/pyClusterFinderCUDA.rst new file mode 100644 index 00000000..5f4fb96b --- /dev/null +++ b/docs/src/python/cluster/pyClusterFinderCUDA.rst @@ -0,0 +1,11 @@ +ClusterFinderCUDA +================= + +.. py:currentmodule:: aare + +Requires a build configured with ``-DAARE_CUDA=ON``. On a CPU-only build the +factory raises ``RuntimeError``. + +.. autofunction:: ClusterFinderCUDA + +.. autofunction:: find_cluster_views_batched_iter diff --git a/include/aare/ClusterFinderCUDA_old.hpp b/include/aare/ClusterFinderCUDA_old.hpp deleted file mode 100644 index 81a528d8..00000000 --- a/include/aare/ClusterFinderCUDA_old.hpp +++ /dev/null @@ -1,435 +0,0 @@ -// SPDX-License-Identifier: MPL-2.0 -#pragma once -#include "aare/ClusterFinder.hpp" -#include "aare/clusterfinder_kernel.cuh" -#include "aare/utils/cuda_check.cuh" -#include -#include -#include -#include -#include -#include -#include - -namespace aare { - -// Per-stream device resources -template -struct StreamContext { - cudaStream_t stream = nullptr; // handle to the stream - FRAME_TYPE *d_frame = nullptr; - PEDESTAL_TYPE *d_pd_mean = nullptr; - PEDESTAL_TYPE *d_pd_sum = nullptr; - PEDESTAL_TYPE *d_pd_sum2 = nullptr; - ClusterType *d_clusters = nullptr; - uint32_t *d_cluster_count = nullptr; - - // Pinned host staging buffers. These make cudaMemcpyAsync real async DMA - // transfers even when the caller's NDView points to pageable memory. - FRAME_TYPE *h_frame = nullptr; - uint32_t *h_cluster_count = nullptr; - ClusterType *h_clusters = nullptr; - - cudaEvent_t kernel_start = nullptr; - cudaEvent_t kernel_stop = nullptr; -}; - -template , - typename FRAME_TYPE = uint16_t, typename PEDESTAL_TYPE = double, - typename = std::enable_if_t::value>> -class ClusterFinderCUDA { - using COMPUTE_TYPE = - device::COMPUTE_TYPE; // match the kernel's internal precision - - static constexpr int BLOCK_X = 16; - static constexpr int BLOCK_Y = 16; - static constexpr int col_radius = ClusterType::cluster_size_x / 2; - static constexpr int row_radius = ClusterType::cluster_size_y / 2; - - Shape<2> m_shape; - size_t nrows; - size_t ncols; - size_t m_image_size; // nrows * ncols - int n_streams; - size_t m_capacity; - - size_t m_image_bytes; - size_t m_cluster_bytes; - - COMPUTE_TYPE m_nSigma; - Pedestal m_pedestal; - ClusterVector m_clusters; - bool m_pedestal_dirty = true; - - using SC = StreamContext; - std::vector v_sc; - - float m_total_kernel_ms = 0.0f; - size_t m_frames_processed = 0; - - // Kernel parameters - dim3 grid; - dim3 block; - size_t shmem_bytes; - - public: - /** - * @brief Construct a ClusterFinderCUDA - * - * @param m_image_size shape of the detector frame (rows, cols) - * @param nSigma threshold in units of per-pixel pedestal - * std - * @param capacity device-side cluster buffer size per stream - * @param n_streams number of CUDA streams for multi-frame - * overlap - */ - ClusterFinderCUDA(Shape<2> shape_, COMPUTE_TYPE nSigma = 5.0, - size_t capacity = 1000000, int n_streams_ = 1) - : m_shape(shape_), nrows(shape_[0]), ncols(shape_[1]), - m_image_size(nrows * ncols), n_streams(n_streams_), - m_capacity(capacity), m_nSigma(nSigma), - m_pedestal(shape_[0], shape_[1]), m_clusters(capacity) { - if (n_streams_ <= 0) { - throw std::invalid_argument( - "ClusterFinderCUDA: n_streams must be > 0"); - } - - if (capacity > - static_cast(std::numeric_limits::max())) { - throw std::invalid_argument( - "ClusterFinderCUDA: capacity must fit in uint32_t"); - } - - if (capacity == 0) { - throw std::invalid_argument( - "ClusterFinderCUDA: capacity must be > 0"); - } - - // Grid/Block dimensions - block = dim3(BLOCK_X, BLOCK_Y); - grid = dim3((static_cast(ncols) + BLOCK_X - 1) / BLOCK_X, - (static_cast(nrows) + BLOCK_Y - 1) / BLOCK_Y); - - // Shared memory: one tile of (BLOCK_X + 2*col_radius) x (BLOCK_Y + - // 2*row_radius) elements - // Mixed precision used -> shmem takes COMPUTE_TYPE = floats (not - // PEDESTAL_TYPE) - shmem_bytes = (BLOCK_X + 2 * col_radius) * (BLOCK_Y + 2 * row_radius) * - sizeof(COMPUTE_TYPE); - - m_image_bytes = m_image_size * sizeof(FRAME_TYPE); - m_cluster_bytes = m_capacity * sizeof(ClusterType); - - v_sc.resize(n_streams); - for (int k = 0; k < n_streams; ++k) { - auto &sc = v_sc[k]; - CUDA_CHECK( - cudaStreamCreateWithFlags(&sc.stream, cudaStreamNonBlocking)); - CUDA_CHECK(cudaEventCreate(&sc.kernel_start)); - CUDA_CHECK(cudaEventCreate(&sc.kernel_stop)); - CUDA_CHECK(cudaMalloc(&sc.d_frame, m_image_bytes)); - CUDA_CHECK(cudaMalloc(&sc.d_pd_mean, - m_image_size * sizeof(PEDESTAL_TYPE))); - CUDA_CHECK( - cudaMalloc(&sc.d_pd_sum, m_image_size * sizeof(PEDESTAL_TYPE))); - CUDA_CHECK(cudaMalloc(&sc.d_pd_sum2, - m_image_size * sizeof(PEDESTAL_TYPE))); - CUDA_CHECK(cudaMalloc(&sc.d_clusters, m_cluster_bytes)); - CUDA_CHECK(cudaMalloc(&sc.d_cluster_count, sizeof(uint32_t))); - - CUDA_CHECK(cudaMallocHost(reinterpret_cast(&sc.h_frame), - m_image_bytes)); - CUDA_CHECK( - cudaMallocHost(reinterpret_cast(&sc.h_cluster_count), - sizeof(uint32_t))); - if (m_cluster_bytes > 0) { - CUDA_CHECK( - cudaMallocHost(reinterpret_cast(&sc.h_clusters), - m_cluster_bytes)); - } - } - } - - ~ClusterFinderCUDA() { - for (auto &sc : v_sc) { - if (sc.stream) - cudaStreamSynchronize(sc.stream); - - if (sc.d_frame) - cudaFree(sc.d_frame); - if (sc.d_pd_mean) - cudaFree(sc.d_pd_mean); - if (sc.d_pd_sum) - cudaFree(sc.d_pd_sum); - if (sc.d_pd_sum2) - cudaFree(sc.d_pd_sum2); - if (sc.d_clusters) - cudaFree(sc.d_clusters); - if (sc.d_cluster_count) - cudaFree(sc.d_cluster_count); - - if (sc.h_frame) - cudaFreeHost(sc.h_frame); - if (sc.h_clusters) - cudaFreeHost(sc.h_clusters); - if (sc.h_cluster_count) - cudaFreeHost(sc.h_cluster_count); - - if (sc.kernel_start) - cudaEventDestroy(sc.kernel_start); - if (sc.kernel_stop) - cudaEventDestroy(sc.kernel_stop); - if (sc.stream) - cudaStreamDestroy(sc.stream); - } - } - - // Non-copyable, non-movable - ClusterFinderCUDA(const ClusterFinderCUDA &) = delete; - ClusterFinderCUDA &operator=(const ClusterFinderCUDA &) = delete; - ClusterFinderCUDA(ClusterFinderCUDA &&) = delete; - ClusterFinderCUDA &operator=(ClusterFinderCUDA &&) = delete; - - void set_nSigma(COMPUTE_TYPE nSigma) { m_nSigma = nSigma; } - COMPUTE_TYPE get_nSigma() const { return m_nSigma; } - - void push_pedestal_frame(NDView frame) { - m_pedestal.push(frame); - m_pedestal_dirty = true; - } - - void clear_pedestal() { - m_pedestal.clear(); - m_pedestal_dirty = true; - } - - NDArray pedestal() { return m_pedestal.mean(); } - NDArray noise() { return m_pedestal.std(); } - - /** - * @brief Move clusters out of the internal ClusterVector, optionally - * reallocating the internal one with the same capacity. - */ - ClusterVector - steal_clusters(bool realloc_same_capacity = false) { - ClusterVector tmp = std::move(m_clusters); - if (realloc_same_capacity) - m_clusters = ClusterVector(tmp.capacity()); - else - m_clusters = ClusterVector{}; - return tmp; - } - - /** - * @brief Find clusters in a single frame, appending them to the internal - * ClusterVector. - */ - void find_clusters(NDView frame, uint64_t frame_number = 0) { - if (m_pedestal_dirty) { // need to update the pedestal on the gpu - sync_pedestal_to_device(); - m_pedestal_dirty = false; - } - - auto &sc = v_sc[0]; - const uint32_t n_pd_samples = - static_cast(m_pedestal.n_samples()); - - // First, CPU copies frame into a reusable pinned buffer - std::memcpy(sc.h_frame, frame.data(), m_image_bytes); - - // Reset cluster counter - CUDA_CHECK(cudaMemsetAsync(sc.d_cluster_count, 0, sizeof(uint32_t), - sc.stream)); - - // Upload frame - CUDA_CHECK(cudaMemcpyAsync(sc.d_frame, sc.h_frame, m_image_bytes, - cudaMemcpyHostToDevice, sc.stream)); - - // Timed Kernel launch - CUDA_CHECK(cudaEventRecord(sc.kernel_start, sc.stream)); - device::find_clusters_in_single_frame - <<>>( - sc.d_frame, sc.d_pd_mean, sc.d_pd_sum, sc.d_pd_sum2, - n_pd_samples, m_nSigma, nrows, ncols, sc.d_clusters, - sc.d_cluster_count, static_cast(m_capacity)); - CUDA_CHECK(cudaEventRecord(sc.kernel_stop, sc.stream)); - CUDA_CHECK(cudaGetLastError()); - - // Read back cluster count into pinned buffer - CUDA_CHECK(cudaMemcpyAsync(sc.h_cluster_count, sc.d_cluster_count, - sizeof(uint32_t), cudaMemcpyDeviceToHost, - sc.stream)); - - // Synchronize to ensure count is available before the CPU reads - // clusters - CUDA_CHECK(cudaStreamSynchronize(sc.stream)); - - record_kernel_time(sc); - - // Clamp to max in case of overflow - uint32_t n_found = *sc.h_cluster_count; - n_found = std::min(n_found, static_cast(m_capacity)); - - // Read back clusters - m_clusters.set_frame_number(frame_number); - if (n_found > 0) { - append_device_clusters_to(m_clusters, sc, n_found); - } - } - - /** - * @brief Batched cluster finding across multiple frames, using n_streams - * CUDA streams to overlap H2D transfer, kernel, and D2H transfer. - * - * Returns one ClusterVector per input frame (with frame_number set to - * first_frame + i). - */ - std::vector> - find_clusters_batched(NDView frames, - uint64_t first_frame = 0) { - if (m_pedestal_dirty) { - sync_pedestal_to_device(); - m_pedestal_dirty = false; - } - - const size_t n_frames = frames.shape(0); - const uint32_t n_pd_samples = - static_cast(m_pedestal.n_samples()); - - std::vector> results; - results.reserve(n_frames); - for (size_t i = 0; i < n_frames; ++i) { - results.emplace_back(); - results.back().set_frame_number(first_frame + i); - } - - const size_t n_rounds = (n_frames + n_streams - 1) / n_streams; - for (size_t round = 0; round < n_rounds; ++round) { - - // Launch phase: fan out kernels on all streams for this round - for (int k = 0; k < n_streams; ++k) { - // OOB guard - const size_t frame_idx = round * n_streams + k; - if (frame_idx >= n_frames) - continue; - - auto &sc_k = v_sc[k]; - const FRAME_TYPE *h_src = - frames.data() + frame_idx * m_image_size; - - std::memcpy(sc_k.h_frame, h_src, m_image_bytes); - - CUDA_CHECK(cudaMemsetAsync(sc_k.d_cluster_count, 0, - sizeof(uint32_t), sc_k.stream)); - CUDA_CHECK( - cudaMemcpyAsync(sc_k.d_frame, sc_k.h_frame, m_image_bytes, - cudaMemcpyHostToDevice, sc_k.stream)); - - CUDA_CHECK(cudaEventRecord(sc_k.kernel_start, sc_k.stream)); - device::find_clusters_in_single_frame - <<>>( - sc_k.d_frame, sc_k.d_pd_mean, sc_k.d_pd_sum, - sc_k.d_pd_sum2, n_pd_samples, m_nSigma, nrows, ncols, - sc_k.d_clusters, sc_k.d_cluster_count, - static_cast(m_capacity)); - CUDA_CHECK(cudaEventRecord(sc_k.kernel_stop, sc_k.stream)); - CUDA_CHECK(cudaGetLastError()); - - // Queue count D2H immediately after the kernel - CUDA_CHECK(cudaMemcpyAsync( - sc_k.h_cluster_count, sc_k.d_cluster_count, - sizeof(uint32_t), cudaMemcpyDeviceToHost, sc_k.stream)); - } - - // Drain phase: fan in results from all streams - for (int k = 0; k < n_streams; ++k) { - const size_t frame_idx = round * n_streams + k; - if (frame_idx >= n_frames) - continue; - - auto &sc_k = v_sc[k]; - - // Wait for memset -> H2D -> kernel -> count D2H - CUDA_CHECK(cudaStreamSynchronize(sc_k.stream)); - - record_kernel_time(sc_k); - - uint32_t n_found = *sc_k.h_cluster_count; - n_found = std::min(n_found, - static_cast(m_capacity)); - - if (n_found > 0) { - append_device_clusters_to(results[frame_idx], sc_k, - n_found); - } - } - } - - return results; - } - - float avg_kernel_time_ms() const { - return m_frames_processed > 0 ? m_total_kernel_ms / m_frames_processed - : 0.0f; - } - - void reset_timers() { - m_total_kernel_ms = 0.0f; - m_frames_processed = 0; - } - - private: - /** - * Upload the current host pedestal (mean, sum, sum2) to every stream's - * device buffers. Called lazily before a find_clusters call when the - * host pedestal has been updated. - */ - void sync_pedestal_to_device() { - // These return-by-value NDArrays must stay alive until the async - // copies complete, so we synchronise at the end before they go out - // of scope. - NDArray h_mean = m_pedestal.mean(); - NDArray h_sum = m_pedestal.get_sum(); - NDArray h_sum2 = m_pedestal.get_sum2(); - - const size_t bytes = m_image_size * sizeof(PEDESTAL_TYPE); - for (auto &sc : v_sc) { - CUDA_CHECK(cudaMemcpyAsync(sc.d_pd_mean, h_mean.data(), bytes, - cudaMemcpyHostToDevice, sc.stream)); - CUDA_CHECK(cudaMemcpyAsync(sc.d_pd_sum, h_sum.data(), bytes, - cudaMemcpyHostToDevice, sc.stream)); - CUDA_CHECK(cudaMemcpyAsync(sc.d_pd_sum2, h_sum2.data(), bytes, - cudaMemcpyHostToDevice, sc.stream)); - } - for (auto &sc : v_sc) - CUDA_CHECK(cudaStreamSynchronize(sc.stream)); - } - - /** - * Copy n_found clusters from sc.d_clusters into the given ClusterVector - * and block on the transfer. - */ - void append_device_clusters_to(ClusterVector &cv, SC &sc, - uint32_t n_found) { - - CUDA_CHECK(cudaMemcpyAsync(sc.h_clusters, sc.d_clusters, - n_found * sizeof(ClusterType), - cudaMemcpyDeviceToHost, sc.stream)); - - CUDA_CHECK(cudaStreamSynchronize(sc.stream)); - - for (uint32_t i = 0; i < n_found; ++i) - cv.push_back(sc.h_clusters[i]); - } - - void record_kernel_time(SC &sc) { - float ms = 0.0f; - CUDA_CHECK(cudaEventElapsedTime(&ms, sc.kernel_start, sc.kernel_stop)); - m_total_kernel_ms += ms; - m_frames_processed++; - } -}; - -} // namespace aare diff --git a/include/aare/clusterfinder_kernel.cuh b/include/aare/clusterfinder_kernel.cuh index b3a2d34c..436ed576 100644 --- a/include/aare/clusterfinder_kernel.cuh +++ b/include/aare/clusterfinder_kernel.cuh @@ -6,14 +6,12 @@ namespace aare::device { -// Device arithmetic precision. -// COMPUTE_TYPE : per-frame stencil arithmetic (shared-memory tile, sums). -// DEVICE_PED_TYPE : device pedestal storage + running variance update. -// Shipped as double/double so the GPU result matches the double-precision CPU -// ClusterFinder to the floating-point floor. float/float is ~2x faster but -// reintroduces a small near-threshold mismatch; a build-time toggle for that -// trade-off is planned. +/// Stencil arithmetic precision. Set both aliases to double for an f64 build. +/// float is safe here because the device pedestal stores centered moments +/// against a host-computed baseline: f32 and f64 agree to 3e-7 in cluster +/// count, and f32 cuts the 9x9 kernel time by ~40%. using COMPUTE_TYPE = float; +/// Device pedestal storage and running variance update. See COMPUTE_TYPE. using DEVICE_PED_TYPE = float; template , diff --git a/include/aare/utils/batch.hpp b/include/aare/utils/batch.hpp deleted file mode 100644 index 4584a670..00000000 --- a/include/aare/utils/batch.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MPL-2.0 -#pragma once -#include "aare/NDArray.hpp" -#include -#include - -template -void pack_frame_batch(const std::vector> &frames, - size_t first_frame, size_t n_frames, - std::vector &batch) { - if (n_frames == 0) - return; - - const size_t rows = frames[first_frame].shape(0); - const size_t cols = frames[first_frame].shape(1); - const size_t image_size = rows * cols; - const size_t total_size = n_frames * image_size; - - if (batch.size() != total_size) { - batch.resize(total_size); - } - - for (size_t k = 0; k < n_frames; ++k) { - const FRAME_TYPE *src = frames[first_frame + k].data(); - FRAME_TYPE *dst = batch.data() + k * image_size; - std::memcpy(dst, src, image_size * sizeof(FRAME_TYPE)); - } -} \ No newline at end of file diff --git a/python/tests/ClusterFinderCUDA.ipynb b/python/tests/ClusterFinderCUDA.ipynb index 1522ba82..efd3415e 100644 --- a/python/tests/ClusterFinderCUDA.ipynb +++ b/python/tests/ClusterFinderCUDA.ipynb @@ -1,596 +1,595 @@ - { - "cells": - [ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "title", + "metadata": {}, + "source": [ + "# ClusterFinder — CPU vs CUDA\n", + "\n", + "Two finders over the same frames and the same pedestal:\n", + "\n", + "| | |\n", + "|---|---|\n", + "| **`ClusterFinderMT`** + `ClusterCollector` | multithreaded CPU baseline |\n", + "| **`ClusterFinderCUDA.find_clusters_batched`** | batched across CUDA streams, over a pinned input buffer, so H2D / kernel / D2H overlap |\n", + "\n", + "**Part 1** times them. **Part 2** compares what they found." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "imports", + "metadata": {}, + "outputs": [], + "source": [ + "import sys; sys.path.append('/home/ferjao_k/aare/build')\n", + "\n", + "import time\n", + "from pathlib import Path\n", + "\n", + "import boost_histogram as bh\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\n", + "from aare import (File, ClusterFinderMT, ClusterCollector, ClusterFinderCUDA)" + ] + }, + { + "cell_type": "markdown", + "id": "md-config", + "metadata": {}, + "source": [ + "## Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "config", + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "id": "title", - "metadata": {}, - "source": [ - "# ClusterFinder — CPU vs CUDA\n", - "\n", - "Two finders over the same frames and the same pedestal:\n", - "\n", - "| | |\n", - "|---|---|\n", - "| **`ClusterFinderMT`** + `ClusterCollector` | multithreaded CPU baseline |\n", - "| **`ClusterFinderCUDA.find_clusters_batched`** | batched across CUDA streams, over a pinned input buffer, so H2D / kernel / D2H overlap |\n", - "\n", - "**Part 1** times them. **Part 2** compares what they found." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "imports", - "metadata": {}, - "outputs": [], - "source": [ - "import sys; sys.path.append('/home/ferjao_k/aare/build')\n", - "\n", - "import time\n", - "from pathlib import Path\n", - "\n", - "import boost_histogram as bh\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from tqdm import tqdm\n", - "\n", - "from aare import (File, ClusterFinderMT, ClusterCollector, ClusterFinderCUDA)" - ] - }, - { - "cell_type": "markdown", - "id": "md-config", - "metadata": {}, - "source": [ - "## Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "config", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Image size: (400, 400) cluster (7, 7)\n", - "Pedestal frames: 1000\n", - "Data frames: 10000 of 100000 in file\n" - ] - } - ], - "source": [ - "base = Path('/mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/')\n", - "f = File(base / 'Cu_factor_10_data_master_0.json')\n", - "pd = File(base / 'Cu_factor_10_pedestal_master_0.json')\n", - "\n", - "n_frames_pd = 1000 # pedestal frames, taken from the head of the file\n", - "N = 10000 # data frames, read after those\n", - "cluster_size = (7, 7)\n", - "rows, cols = f.rows, f.cols\n", - "image_size = (rows, cols)\n", - "\n", - "N_SIGMA = 5\n", - "N_STREAMS = 4 # H2D / kernel / D2H overlap\n", - "BATCH_SIZE = 2000 # frames per find_clusters_batched call\n", - "\n", - "# CPU workers. ClusterFinderMT gives each thread its own ClusterFinder with its\n", - "# own pedestal, and data frames are handed out round-robin -- so at high thread\n", - "# counts each pedestal tracks on only 1/n of the frames while the CUDA finder's\n", - "# single pedestal sees all of them, and the cluster counts drift apart. Keep it\n", - "# low when comparing counts; raise it to measure CPU throughput.\n", - "N_THREADS = 4\n", - "\n", - "# Fixed per-frame output slot the kernel writes into, copied WHOLE on every D2H.\n", - "# Too low does not error -- it TRUNCATES. The CUDA cell prints the peak actually\n", - "# reached, which is how you size this for a new dataset.\n", - "CAP = 3000\n", - "\n", - "capacity = 10_000 # initial ClusterVector capacity, CPU side\n", - "N_BINS = 200\n", - "E_MIN, E_MAX = -2, 4000 # spectrum range, ADU\n", - "\n", - "print(f'Image size: {image_size} cluster {cluster_size}')\n", - "print(f'Pedestal frames: {n_frames_pd}')\n", - "print(f'Data frames: {N} of {f.total_frames} in file')" - ] - }, - { - "cell_type": "markdown", - "id": "md-build", - "metadata": {}, - "source": [ - "## Build the two finders" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "build", - "metadata": {}, - "outputs": [], - "source": [ - "cf_cpu = ClusterFinderMT(image_size, cluster_size, n_sigma=N_SIGMA,\n", - " capacity=capacity, n_threads=N_THREADS)\n", - "sink = ClusterCollector(cf_cpu)\n", - "\n", - "cf_cuda = ClusterFinderCUDA(image_size, cluster_size, n_sigma=N_SIGMA,\n", - " max_clusters_per_frame=CAP, n_streams=N_STREAMS)" - ] - }, - { - "cell_type": "markdown", - "id": "md-ped", - "metadata": {}, - "source": [ - "## Pedestal\n", - "\n", - "Identical frames into both, so the implementation is the only thing that differs." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "train", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pedestal (1000 frames): 0.32s\n" - ] - } - ], - "source": [ - "f.seek(0)\n", - "t0 = time.perf_counter()\n", - "for _ in range(n_frames_pd):\n", - " pd_img = pd.read_frame()\n", - " cf_cpu.push_pedestal_frame(pd_img.copy())\n", - " cf_cuda.push_pedestal_frame(pd_img.copy())\n", - "print(f'Pedestal ({n_frames_pd} frames): {time.perf_counter() - t0:.2f}s')" - ] - }, - { - "cell_type": "markdown", - "id": "md-io", - "metadata": {}, - "source": [ - "## Read the data frames\n", - "\n", - "Kept out of both timing loops: the two finders run over the same in-memory array." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "io", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading 10000 frames: 0.44s (22,750 FPS, 3.20 GB at 7.28 GB/s)\n" - ] - } - ], - "source": [ - "f.seek(0)\n", - "t0 = time.perf_counter()\n", - "data = f.read_n(N)\n", - "t_io = time.perf_counter() - t0\n", - "gb = f.bytes_per_frame * N / 1e9\n", - "print(f'Reading {N} frames: {t_io:.2f}s ({N / t_io:,.0f} FPS, '\n", - " f'{gb:.2f} GB at {gb / t_io:.2f} GB/s)')" - ] - }, - { - "cell_type": "markdown", - "id": "md-cpu", - "metadata": {}, - "source": [ - "## 1 — CPU, multithreaded" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "cpu", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████████████████████████████████████| 10000/10000 [00:16<00:00, 615.07it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU MT (4 threads): 16.26s 615 FPS 17,463,321 clusters (1746.3/frame)\n" - ] - } - ], - "source": [ - "t0 = time.perf_counter()\n", - "# Pass the frame number: find_clusters(frame) defaults it to 0, and every\n", - "# resulting cluster is then stamped frame 0. Part 2 groups by it.\n", - "for i, frame in enumerate(tqdm(data)):\n", - " cf_cpu.find_clusters(frame, i)\n", - "t_cpu = time.perf_counter() - t0\n", - "\n", - "cf_cpu.stop(); sink.stop()\n", - "clusters_cpu = sink.steal_clusters()\n", - "\n", - "hist_cpu = bh.Histogram(bh.axis.Regular(N_BINS, E_MIN, E_MAX))\n", - "n_clusters_cpu = 0\n", - "for cv in clusters_cpu:\n", - " hist_cpu.fill(cv.sum())\n", - " n_clusters_cpu += cv.size\n", - "\n", - "print(f'CPU MT ({N_THREADS} threads): {t_cpu:.2f}s {N / t_cpu:,.0f} FPS '\n", - " f'{n_clusters_cpu:,} clusters ({n_clusters_cpu / N:.1f}/frame)')" - ] - }, - { - "cell_type": "markdown", - "id": "md-cuda", - "metadata": {}, - "source": [ - "## 2 — CUDA, batched + multi-streamed\n", - "\n", - "`register_input_buffer` page-locks the input once so H2D runs at full DMA\n", - "bandwidth instead of through the driver's staging buffer. It is paid once,\n", - "outside the loop, and released when the dataset is done." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cuda", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CUDA batched: 1.17s 8,574 FPS 17,463,350 clusters (1746.3/frame)\n", - " input pinned in 0.09s, once, outside the loop\n", - " vs CPU: 13.94x\n", - " peak clusters in one frame: 2,062 of CAP 3,000\n" - ] - } - ], - "source": [ - "t0 = time.perf_counter()\n", - "cf_cuda.register_input_buffer(data)\n", - "t_pin = time.perf_counter() - t0\n", - "\n", - "clusters_cuda = []\n", - "t0 = time.perf_counter()\n", - "for start in range(0, N, BATCH_SIZE):\n", - " stop = min(start + BATCH_SIZE, N)\n", - " clusters_cuda.extend(\n", - " cf_cuda.find_clusters_batched(data[start:stop], first_frame=start))\n", - "t_cuda = time.perf_counter() - t0\n", - "\n", - "cf_cuda.unregister_input_buffer()\n", - "\n", - "hist_cuda = bh.Histogram(bh.axis.Regular(N_BINS, E_MIN, E_MAX))\n", - "energies = [np.asarray(cv.sum()).ravel() for cv in clusters_cuda if cv.size > 0]\n", - "if energies:\n", - " hist_cuda.fill(np.concatenate(energies))\n", - "n_clusters_cuda = sum(cv.size for cv in clusters_cuda)\n", - "\n", - "print(f'CUDA batched: {t_cuda:.2f}s {N / t_cuda:,.0f} FPS '\n", - " f'{n_clusters_cuda:,} clusters ({n_clusters_cuda / N:.1f}/frame)')\n", - "print(f' input pinned in {t_pin:.2f}s, once, outside the loop')\n", - "print(f' vs CPU: {t_cpu / t_cuda:.2f}x')\n", - "\n", - "# One ClusterVector per frame, so this IS the per-frame maximum.\n", - "peak = max((cv.size for cv in clusters_cuda), default=0)\n", - "print(f' peak clusters in one frame: {peak:,} of CAP {CAP:,}')\n", - "if peak >= CAP:\n", - " print(' !! CAP REACHED -- clusters were dropped; raise CAP and re-run.')" - ] - }, - { - "cell_type": "markdown", - "id": "md-summary", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "summary", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " s FPS us/frame clusters\n", - "CPU MT (4 thr) 16.26 615 1626.1 17,463,321\n", - "CUDA batched 1.17 8,574 116.6 17,463,350\n", - "\n", - "speedup: 13.94x\n" - ] - } - ], - "source": [ - "print(f'{\"\":<22} {\"s\":>7} {\"FPS\":>10} {\"us/frame\":>10} {\"clusters\":>13}')\n", - "for name, t, n in (('CPU MT (%d thr)' % N_THREADS, t_cpu, n_clusters_cpu),\n", - " ('CUDA batched', t_cuda, n_clusters_cuda)):\n", - " print(f'{name:<22} {t:7.2f} {N / t:10,.0f} {t * 1e6 / N:10.1f} {n:>13,}')\n", - "print(f'\\nspeedup: {t_cpu / t_cuda:.2f}x')" - ] - }, - { - "cell_type": "markdown", - "id": "md-part2", - "metadata": {}, - "source": [ - "# Part 2 — Where the two disagree\n", - "\n", - "The two implementations are not bit-identical by construction: the CUDA finder\n", - "updates its pedestal once per frame, the CPU finder per pixel, so once the\n", - "pedestals drift apart a few pixels land on opposite sides of the threshold.\n", - "\n", - "Three views, cheapest first: the **spectra**, the **cluster sets**, and **where\n", - "in the run** the difference accumulates." - ] - }, - { - "cell_type": "markdown", - "id": "md-spec", - "metadata": {}, - "source": [ - "## Spectra\n", - "\n", - "Both curves should lie on top of each other; the ratio panel is the sensitive\n", - "view." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "spectra", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": - "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EP38te5r/Z44caI5tv7oYdO/FQ0C9W9NPy87GF63bp2p31pv9e9Ig7hnnnnG/E3r9543/bvWz/3uu+82Xda1C6nWAf3RYurUqebz1wBOf5jQuquBpX5v2gGe/gig59W6fuaZZ5rupJpfrc+aZ6V/j3369JH+/fvLc889Z9LrDxOrV68O+L4BFLJsbXsAEKG2b99uukDdcMMNeX6Nf3fN7777zhxDb72tX7/e7J84caJ5/O+//5rHY8eOPaEueiNHjrRiYmKsJUuW+Oz/5JNPsnUN08eJiYnWnj17jvt+Nm3aZMXFxVn9+/f32X/gwAGrQoUKPt3TtHucHvujjz7ySXv55ZdbderU8Tz+4IMPTLqpU6f6pNO86/7x48d79lWvXt10l/3jjz+ydZlzuVzWqlWrfPa3b98+W3lrvk4//XTTtdb2zDPPmPLSzyEnef1MNI+al2XLlmXraleqVClP97i8fkbz5883j4cMGXJCdcGuc5deemm255KSksxz/rQe6n7v8tD3VaxYMWvLli2effoeNZ12Q/Tu9vfZZ5+Z/V988YUVDnLqrvnPP/+YfOpn4U+7Supz2kU7J/l5/YgRI8zjbdu2ZUurXThr167teVyrVi1Td/1t3brVHOOpp57K9f3an59/3dL6ofu//fbb43bZ1u688+bNM+l/++23bH/X3n+vmva0004z+3/55RfP/t27d5u/14EDB3r23XXXXdYpp5xibdy40eeczz33nHm9/Tfcr18/69RTT801nwBCh+6aAHACypQpY37h1hay0aNHm66Q2uKVV9qFTn891+592gXK3rR7VaDuotrdrHTp0sc97jfffGOOc8stt/gcV1u/tFXK/7h6ri5dumRrjdCWOu+8avdDTed9TM27toL5H1Nf79+yot0U9f16tyIqnajCn7ao7dy5Uz7++GPzWMtVW/86derk0931ZD6T+vXrm25m3m666SbT0mHPupjXz0gn3VDa/fRkXH311XKyNK/a3dOmrU1KW1y165//fu/PORDv953fLZgCdVnNy3Mn8vqc0uY1XV7zlBP9O9e/d3/a4qh1VP/mYmNjTQuj/k0rbTn3P7+2+tm0xVFn8tRum9qV1/tvRluM/f/edUIY7fLs/Xl27NjR87estLVPW8j1b/jzzz83reYAwgdBHgDHKFeunLmQ1S5oBU0vorT7m17wa9dA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n30avGi+7On2NY2e394eeOABqV+/vs++Bx98MM/nfPHFF+XWW2+VmJhjYYNO89+hQwcZPHhwwNdokON9Pt3uuOMOEwQ3btz4uOf87LPPTIBVqVKlgAGenrtdu3ayePFiEzT269fPJ3+tWrWSjz76SP744w+ZOnWq/PXXX3LNNdfkes7atWvLuHHjzGf7448/mrzqOXbt2uUpZ92ee+45k2bSpEmmDtx+++0+x9GF06+99lq55557cjyXlueECRPMrJ0Fxgqh8ePHWw0bNrRKlixptosvvtiaMWOG5/mePXtamkXvrUmTJj7HOHLkiNWvXz+rbNmyVvHixa0uXbpYmzdv9kmzZ88eq3v37lapUqXMpvf37t3rk2bjxo1W586dzTH0WP3797eOHj3qk2b58uXWpZdeahUtWtSqVKmSlZycbGVkZOTrPaekpJj3obfhQPOvZZHf9wHKONxQlyljJ6AeU85OrsuHDx+2Vq9ebW4jTceOHa3KlStbBw8ezPac9zVl9erVrTFjxvg8X6tWLeuGG24w95OSkqxGjRoFPIZeH3733Xc55qFFixbWPffcY65Tf/zxR7NPy/eJJ54w1796XD2+v5zOmRe7du2yXC6XtXLlyoDPa3413/7X1f5SU1Ot008/3Ro+fPhxz7llyxZT1nrOQOWpscBjjz2Wr/fx+eefm/eh+cjvNfvs2bOttLS0gNfKH330kZWQkGCe9zdx4kQrMTEx4LE1xihSpIj17bffBnw+t7+VvMYSIW3J0/6o2uT8888/m02bXbt16yarVq3ypNFI3ftXgBkzZvgcY8CAATJt2jSZMmWKiboPHjwonTt39omMb7rpJlm2bJmJtnXT+9psa9O02sytfWP1GHosjfr1lw/b/v37pW3btuYXBf3F4KWXXjKR/OjRowu8nAAAABAa2k1Prx+1xU678vkL1CXPm3YZPJmp8L0lJCTIzTff7NOa984775iWoYKg18Xa7bBu3bondZwvvvhC/v33X+nVq1eu6TIyMsw1+kMPPWRaH/3p2nHawqfrx2lrYfny5aVFixYmn7l9fpMnTzbp4+Pj85RfbY3TLqmJiYnSqFGjHNNpV03tshoXF5fvz1GP+8MPP0hBCeli6NqP2b8PqzZdLlq0yPPBap/nChUq5Fiwb775prz77rum36x67733TDP1nDlzpH379rJmzRrz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", - "text/plain": [ - "

" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, (ax_spec, ax_ratio) = plt.subplots(\n", - " 2, 1, figsize=(9, 6.5), sharex=True, gridspec_kw={'height_ratios': [3, 1]})\n", - "\n", - "edges = hist_cpu.axes[0].edges\n", - "cpu_vals, cuda_vals = hist_cpu.values(), hist_cuda.values()\n", - "\n", - "ax_spec.stairs(cpu_vals, edges, label=f'CPU MT ({n_clusters_cpu:,})',\n", - " color='C0', linewidth=1.4)\n", - "ax_spec.stairs(cuda_vals, edges, label=f'CUDA ({n_clusters_cuda:,})',\n", - " color='C1', linestyle='--', linewidth=1.4)\n", - "ax_spec.set_ylabel('Counts')\n", - "ax_spec.set_title(f'Cluster energy spectrum — {N:,} frames')\n", - "ax_spec.legend()\n", - "ax_spec.grid(alpha=0.2)\n", - "\n", - "with np.errstate(divide='ignore', invalid='ignore'):\n", - " ratio = np.where(cpu_vals > 0, cuda_vals / cpu_vals, np.nan)\n", - "ax_ratio.stairs(ratio, edges, color='C1', linewidth=1.2)\n", - "ax_ratio.axhline(1.0, color='gray', linewidth=0.5)\n", - "ax_ratio.set_ylabel('CUDA / CPU')\n", - "ax_ratio.set_xlabel('Energy [ADU]')\n", - "ax_ratio.set_ylim(0.9, 1.1)\n", - "ax_ratio.grid(alpha=0.3)\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "md-sets", - "metadata": {}, - "source": [ - "## Cluster sets\n", - "\n", - "Every cluster is keyed by `(frame, x, y)`, so the two results can be differenced\n", - "directly — no per-frame Python loop.\n", - "\n", - "A cluster whose centre moved by one pixel was *relabelled*, not gained or lost,\n", - "so those are counted separately from genuine adds and drops." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "sets", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU 17,463,321 clusters\n", - "CUDA 17,463,350 clusters net +29 (0.0002%)\n", - "\n", - "exact-position mismatches CPU-only 25 CUDA-only 54\n", - " of which shifted by 1 px 1 4\n", - " genuine add / drop 24 50\n", - "\n", - "frames touched by a genuine difference: 72 of 10,000\n", - "[2.9s]\n" - ] - } - ], - "source": [ - "def cluster_keys(vectors):\n", - " \"\"\"One int64 key per cluster: frame * rows*cols + y * cols + x.\n", - "\n", - " Centres are unique within a frame, so keys are globally unique and the sets\n", - " below need only a sort, never a np.unique.\n", - " \"\"\"\n", - " n = len(vectors)\n", - " sizes = np.fromiter((cv.size for cv in vectors), np.int64, n)\n", - " frames = np.repeat(\n", - " np.fromiter((cv.frame_number for cv in vectors), np.int64, n), sizes)\n", - " xy = [np.asarray(cv) for cv in vectors if cv.size]\n", - " if not xy:\n", - " return np.empty(0, np.int64), frames\n", - " x = np.concatenate([v['x'] for v in xy]).astype(np.int64)\n", - " y = np.concatenate([v['y'] for v in xy]).astype(np.int64)\n", - " return frames * (rows * cols) + y * cols + x, frames\n", - "\n", - "\n", - "t0 = time.perf_counter()\n", - "k_cpu, fr_cpu = cluster_keys(clusters_cpu)\n", - "k_cuda, fr_cuda = cluster_keys(clusters_cuda)\n", - "\n", - "# Sort ONCE. np.setdiff1d and np.isin each re-sort their argument on every call,\n", - "# and the shift check below calls one eight times per direction -- about twenty\n", - "# sorts of a 27-million-element array. Two sorts plus binary search instead.\n", - "s_cpu = np.sort(k_cpu)\n", - "s_cuda = np.sort(k_cuda)\n", - "\n", - "\n", - "def present_in(vals, sorted_keys):\n", - " \"\"\"Which of `vals` appear in an already-sorted key array.\"\"\"\n", - " if sorted_keys.size == 0:\n", - " return np.zeros(vals.size, dtype=bool)\n", - " i = np.searchsorted(sorted_keys, vals)\n", - " np.clip(i, 0, sorted_keys.size - 1, out=i)\n", - " return sorted_keys[i] == vals\n", - "\n", - "\n", - "cpu_only = s_cpu[~present_in(s_cpu, s_cuda)]\n", - "cuda_only = s_cuda[~present_in(s_cuda, s_cpu)]\n", - "\n", - "\n", - "def drop_shifted(only, sorted_other):\n", - " \"\"\"Drop mismatches that have a counterpart within 1 px in the other set.\"\"\"\n", - " keep = np.ones(only.size, dtype=bool)\n", - " for dy in (-1, 0, 1):\n", - " for dx in (-1, 0, 1):\n", - " if dx or dy:\n", - " keep &= ~present_in(only + dy * cols + dx, sorted_other)\n", - " return only[keep]\n", - "\n", - "\n", - "cpu_real = drop_shifted(cpu_only, s_cuda)\n", - "cuda_real = drop_shifted(cuda_only, s_cpu)\n", - "touched = np.unique(np.concatenate([cpu_real, cuda_real]) // (rows * cols)).size\n", - "\n", - "print(f'CPU {k_cpu.size:>12,} clusters')\n", - "print(f'CUDA {k_cuda.size:>12,} clusters net {k_cuda.size - k_cpu.size:+,}'\n", - " f' ({abs(k_cuda.size - k_cpu.size) / k_cpu.size:.4%})')\n", - "print()\n", - "print(f'exact-position mismatches CPU-only {cpu_only.size:>8,} '\n", - " f'CUDA-only {cuda_only.size:>8,}')\n", - "print(f' of which shifted by 1 px {cpu_only.size - cpu_real.size:>17,} '\n", - " f'{cuda_only.size - cuda_real.size:>17,}')\n", - "print(f' genuine add / drop {cpu_real.size:>17,} {cuda_real.size:>17,}')\n", - "print(f'\\nframes touched by a genuine difference: {touched:,} of {N:,}')\n", - "print(f'[{time.perf_counter() - t0:.1f}s]')" - ] - }, - { - "cell_type": "markdown", - "id": "md-drift", - "metadata": {}, - "source": [ - "## Where in the run it accumulates\n", - "\n", - "Cumulative `CUDA − CPU` against frame index. A curve that rises and then flattens\n", - "means the two pedestals settled into agreement and the difference is a start-up\n", - "transient; a steadily sloping line would mean a persistent per-frame bias." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "drift", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": - "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9Lug29S8oX7++WfzXdDj/vjjj5t9onlCvy96/tPP4U0/z0knnSTPPPOMyZvBzlvh+Omnn0z+0za23vQz2u9rGsu7/B9//CF79uzxTPefd9q0abJ3717Tpk+XUUcffbTPfJo39Htgvx+I5hc9Bpqfb7zxRunXr1+x74i+p+0VtR3xrl27zDT93mn7RZ2u7bk0r2ge0XOkHifdrv92dD3a9nDRokXm/KS/DXqu0en//Oc/zflJv/eaB4cNG2aWc7lc8o9//MP8pui5TvfN6tWrzbHW/D9//nzzXdP06Llff09efPFF085s3bp15ruh3/sqVaoE3Qd6HtS8ceSRR3qm/etf/zLntOuvv958v7t37y7Vq1eX0s4T+n268847zbn6v//9r8nThx12mJx66qkhf6djSX+X9Nxhf1d036lA502dpr85mldbt27tma6fQfOC5jv/PIkkFesoEyivjRs3mjteejczVGUtybPvrmk7grJUTdQ79qmpqcVKHd555x2zXr2DbtPXepc1lDYaeudc53/++eeDzvP555+bebTNiDetEqPTtU1jWUvytJTBm25Dp+vd4rJU19S7srr8E0884TNd74yXVpLnfcdXq8Z407TrXVxvehde53388cd9pmv7D72j7109S9Nv3x0vz3GtX7++lZeX55OHdXldj01LYfQOvv9dc29a2qClE6tXr/aZ/thjjxW7Q14avfurpRhaSqnL/vjjj573Dj30UPPQkuBgQklvuCV5uv+1Spt/6ZOWonuXEthtMD/88MOIlOT50zvmum9OO+00U0odSnXNYCV5Om3u3Lk+8x555JGmpNp2++23B6zup/OEUpKnbby0NDU/P9/nM2jbtyZNmnju9D/55JNmfVpCbtPzjZbUasmO93Z1Oe/qi+qGG24wJSf2Oco+j5566qlWWZRUkqclaN77yL/UTNtelyTU5bVET1+/8cYbxebVebxLW7Tdne6rQFq3bm1K/kpi/748+uijAb8n9957r1UaPa5aMqfnNe/zpZ3/brzxRp/5tX2XTh83bpzPdC0t1xIim35+nU9L27zpOU6nP/300z7nOP1uhktL1bSJhT87H7399ts+04OV5Gke9D4H6nlKSxUDlcaW9p0OpyTPXof90NJDXdZ7mj78S+n96e+2/++dLqOfQdPnTWvdaImszq/NVLz9/vvvZnpJNX6Q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E2lmcUqGQeIgX4F8hXjAuQrkK8SL6g67Zi+pBM/mjMqlAAAAAICIIMgDAAAAgARCkBcDmZmZct9995lngHwFJ+N8BfIU4gHnKpCvkqzjFQAAAABIJpTkAQAAAEACIcgDAAAAgARCkAcAAAAACYQgLwaefvppadGihVSuXFlOOOEE+e6772KRDDjM2LFjpUOHDpKdnS316tWT8847T5YvX+4zjzahHTlypBkAMysrS7p16ybLli3zmaegoEBuvPFGqVOnjlStWlXOPfdc+euvv3zmyc3NlQEDBphxVvSh/2/fvj0qnxOxz2cpKSkydOhQzzTyFcpi3bp10r9/f6ldu7ZUqVJF2rVrJwsWLCBfoUwKCwvlnnvuMddH+vvWsmVLuf/++8XlcpGnELJvv/1W+vTpY66T9Lfu/fff93k/mr93a9asMWnRdei6brrpJtm3b1/0jqZ2vILomTJlilWpUiXr+eeft37++Wfr5ptvtqpWrWqtXr2aw5DkzjjjDOull16yfvrpJ2vx4sXW2WefbR1yyCHWzp07PfM89NBDVnZ2tvW///3PWrp0qXXxxRdbDRs2tPLy8jzzXHvttVbjxo2tadOmWQsXLrS6d+9uHXvssVZhYaFnnjPPPNNq27atNXv2bPPQ/88555yof2ZE1w8//GA1b97cOuaYY8y5x0a+Qri2bdtmNWvWzBo0aJA1d+5ca+XKldaXX35prVixgnyFMhk9erRVu3Zt6+OPPzb56e2337aqVatmjR8/njyFkH366afWiBEjzHWShjnvvfeez/vR+r3TeXWaLqvr0HU1atTIuuGGG6J2NAnyouzEE080mcfb4Ycfbt15553RTgocbvPmzeYENWPGDPPa5XJZDRo0MCco2969e60aNWpYzzzzjHm9fft2cxNBbybY1q1bZ6Wmplqff/65ea03F3S9c+bM8czz/fffm2m//vprFD8hoik/P99q1aqV+aHp2rWrJ8gjX6Es7rjjDqtLly5B3ydfIVx6Y/PKK6/0mda3b1+rf//+5CmUifgFedE8L2mwqcvosrY33njDyszMtHbs2BGVI0p1zSjSIlqtytKrVy+f6fp69uzZ0UwK4sCOHTvMc61atczzypUrZePGjT75R8cF6tq1qyf/aP7av3+/zzxaJaFt27aeeb7//ntTtaBjx46eeTp16mSmkQ8T1/XXXy9nn3229OzZ02c6+Qpl8eGHH0r79u3loosuMtXLjzvuOHn++efJVyizLl26yFdffSW//fabef3jjz/KzJkz5ayzzuJchYhYGcXrKJ1Hl9FlbWeccYapCupdrb0ipUdlKzC2bNkiRUVFUr9+fZ89oq810wE2vQE1bNgw86OnJwll55FA+Wf16tWeeTIyMiQnJydoHtNnvSjzp9PIh4lpypQpsnDhQpk3b16x98hXKIs///xTJk6caM5Td999t/zwww+mvYleMF1++eXkK4TtjjvuMDc3Dz/8cElLSzPXS2PGjJFLL72UcxUiYmMUr6P02X87uk5dd7SutQjyYkAbgvpf0PtPQ3K74YYbZMmSJeYuZiTyj/88geYnHyamtWvXys033yxTp041nT0FQ75COLQzDC3Je/DBB81rLcnTzgs08NMgj3yFcL355psyadIkmTx5shx11FGyePFi00GUloQMHDiQPIWISYnSdVSsr7WorhlF2rOO3p3yj+A3b95cLNpH8tIenbQq1DfffCNNmjTxTG/QoIF5Lin/6DxaLVh7fSppnk2bNhXb7t9//00+TEBaLUSPv/bkm56ebh4zZsyQJ5980vxv5wvyFcLRsGFDOfLII32mHXHEEaY3OcX5CuG6/fbb5c4775RLLrlEjj76aNNb4S233GJ6BCZPIRIaRPE6Sufx346uU6uCRuuanyAvirSIVi+0pk2b5jNdX3fu3DmaSYED6d0dLcF799135euvvzbdSHvT13rS8M4/eiLSC3Y7/2j+qlSpks88GzZskJ9++skzz0knnWSqxGj1KtvcuXPNNPJh4jnttNNk6dKl5q64/dASmMsuu8z8r92Uk68QrpNPPrnYEC/alqpZs2bmf85XCNfu3bslNdX3slRvjNtDKJCnUF4tongdpfPoMrqsTWvUaJV23UZURKV7FxQbQuGFF14wvfMMHTrUDKGwatUq9lKSu+6660wPT9OnT7c2bNjgeezevdszj/YIpfO8++67puvfSy+9NGDXv02aNDHdmWu3vT169AjY9a92o6+9Qenj6KOPZgiFJOLdu6YiX6Esw3Gkp6dbY8aMsX7//Xfr9ddft6pUqWJNmjSJfIUyGThwoOm23h5CQX/n6tSpYw0fPpw8hbB6kl60aJF5aJgzbtw48789VFm0fu/sIRROO+00sw5dl66TIRQS3H/+8x8zvlBGRoZ1/PHHe7rIR3LTk1Ggh46d593973333We6ANZueE899VRzkvK2Z88ecxKpVauWlZWVZU46a9as8Zln69at1mWXXWbGitGH/p+bmxu1zwpnBXnkK5TFRx99ZC5i9FykQwE999xzPu+TrxAOvcjW85KOD1u5cmWrZcuWZryzgoIC8hRC9s033wS8lho4cGDUz0saWOrQILoOXZeuU4dsiJYU/ROdMkMAAAAAQEWjTR4AAAAAJBCCPAAAAABIIAR5AAAAAJBACPIAAAAAIIEQ5AEAAABAAiHIAwAAAIAEQpAHAAAAAAmEIA8AAAAAEghBHgAAAAAkEII8AEBSGjRokKSkpBR7rFixItZJAwCgXNLLtzgAAPHrzDPPlJdeeslnWt26dX1e79u3TzIyMqKcMgAAyo6SPABA0srMzJQGDRr4PE477TS54YYbZNiwYVKnTh05/fTTzbzjxo2To48+WqpWrSpNmzaVIUOGyM6dOz3revnll6VmzZry8ccfS5s2baRKlSpy4YUXyq5du+SVV16R5s2bS05Ojtx4441SVFTkE0QOHz5cGjdubNbdsWNHmT59ekz2BwAgMVCSBwCAHw3KrrvuOpk1a5ZYlmWmpaamypNPPmmCtZUrV5ogT4Ozp59+2rPc7t27zTxTpkyR/Px86du3r3lo8Pfpp5/Kn3/+KRdccIF06dJFLr74YrPMFVdcIatWrTLLNGrUSN577z1Twrh06VJp1aoVxwYAELYUy/71AgAgydrkTZo0SSpXruyZ1rt3b/n7779lx44dsmjRohKXf/vtt00guGXLFk9JngZs2qbv0EMPNdOuvfZaee2112TTpk1SrVo1M00DOA0Un3nmGfnjjz9MIPfXX3+ZAM/Ws2dPOfHEE+XBBx+soE8PAEhklOQBAJJW9+7dZeLEiZ7XWl3y0ksvlfbt2xeb95tvvjFB188//yx5eXlSWFgoe/fuNdUxdTmlVTTtAE/Vr1/fBHR2gGdP27x5s/l/4cKFpqSwdevWPtsqKCiQ2rVrV8hnBgAkPoI8AEDS0uDssMMOCzjd2+rVq+Wss84yJXMPPPCA1KpVS2bOnClXXXWV7N+/3zNfpUqVfJbT3joDTXO5XOZ/fU5LS5MFCxaYZ2/egSEAAOEgyAMAoBTz5883JXePP/64aZun3nrrrXLvt+OOO850wqIle6eccgrHAQAQEfSuCQBAKbQKpgZ5Tz31lOk8RdvZaZu68tJqmpdddplcfvnl8u6775oOXebNmycPP/yw6agFAICyIMgDAKAU7dq1M0MoaPDVtm1bef3112Xs2LER2W86Tp8GebfeeqsZeuHcc8+VuXPnmmEaAAAoC3rXBAAAAIAEQkkeAAAAACQQgjwAAAAASCAEeQAAAACQQAjyAAAAACCBEOQBAAAAQAIhyAMAAACABEKQBwAAAAAJhCAPAAAAABIIQR4AAAAAJBCCPAAAAABIIAR5AAAAAJBACPIAAAAAQBLH/wM501RwAhoUigAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "first half: +16 second half: +13\n" - ] - } - ], - "source": [ - "cnt_cpu = np.bincount(fr_cpu, minlength=N)\n", - "cnt_cuda = np.bincount(fr_cuda, minlength=N)\n", - "cum = np.cumsum(cnt_cuda.astype(np.int64) - cnt_cpu.astype(np.int64))\n", - "\n", - "fig, ax = plt.subplots(figsize=(9, 3.6))\n", - "ax.plot(cum, color='C1', linewidth=1.2)\n", - "ax.axhline(0, color='gray', linewidth=0.5)\n", - "ax.set_xlabel('Frame')\n", - "ax.set_ylabel('cumulative CUDA - CPU')\n", - "ax.set_title(f'Cluster-count difference accumulating over {N:,} frames '\n", - " f'(final {cum[-1]:+,})')\n", - "ax.grid(alpha=0.25)\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n", - "half = N // 2\n", - "print(f'first half: {cum[half - 1]:+,} second half: {cum[-1] - cum[half - 1]:+,}')" + "name": "stdout", + "output_type": "stream", + "text": [ + "Image size: (400, 400) cluster (3, 3)\n", + "Pedestal frames: 1000\n", + "Data frames: 10000 of 100000 in file\n" ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.15" - } + "source": [ + "base = Path('/mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/')\n", + "f = File(base / 'Cu_factor_10_data_master_0.json')\n", + "pd = File(base / 'Cu_factor_10_pedestal_master_0.json')\n", + "\n", + "n_frames_pd = 1000 # pedestal frames, taken from the head of the file\n", + "N = 10000 # data frames, read after those\n", + "cluster_size = (3, 3)\n", + "rows, cols = f.rows, f.cols\n", + "image_size = (rows, cols)\n", + "\n", + "N_SIGMA = 5\n", + "N_STREAMS = 4 # H2D / kernel / D2H overlap\n", + "BATCH_SIZE = 2000 # frames per find_clusters_batched call\n", + "\n", + "# CPU workers. ClusterFinderMT gives each thread its own ClusterFinder with its\n", + "# own pedestal, and data frames are handed out round-robin -- so at high thread\n", + "# counts each pedestal tracks on only 1/n of the frames while the CUDA finder's\n", + "# single pedestal sees all of them, and the cluster counts drift apart. Keep it\n", + "# low when comparing counts; raise it to measure CPU throughput.\n", + "N_THREADS = 4\n", + "\n", + "# Fixed per-frame output slot the kernel writes into, copied WHOLE on every D2H.\n", + "# Too low does not error -- it TRUNCATES. The CUDA cell prints the peak actually\n", + "# reached, which is how you size this for a new dataset.\n", + "CAP = 3000\n", + "\n", + "capacity = 10_000 # initial ClusterVector capacity, CPU side\n", + "N_BINS = 200\n", + "E_MIN, E_MAX = -2, 4000 # spectrum range, ADU\n", + "\n", + "print(f'Image size: {image_size} cluster {cluster_size}')\n", + "print(f'Pedestal frames: {n_frames_pd}')\n", + "print(f'Data frames: {N} of {f.total_frames} in file')" + ] }, - "nbformat": 4, - "nbformat_minor": 5 - } + { + "cell_type": "markdown", + "id": "md-build", + "metadata": {}, + "source": [ + "## Build the two finders" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "build", + "metadata": {}, + "outputs": [], + "source": [ + "cf_cpu = ClusterFinderMT(image_size, cluster_size, n_sigma=N_SIGMA,\n", + " capacity=capacity, n_threads=N_THREADS)\n", + "sink = ClusterCollector(cf_cpu)\n", + "\n", + "cf_cuda = ClusterFinderCUDA(image_size, cluster_size, n_sigma=N_SIGMA,\n", + " max_clusters_per_frame=CAP, n_streams=N_STREAMS)" + ] + }, + { + "cell_type": "markdown", + "id": "md-ped", + "metadata": {}, + "source": [ + "## Pedestal\n", + "\n", + "Identical frames into both, so the implementation is the only thing that differs." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "train", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pedestal (1000 frames): 0.86s\n" + ] + } + ], + "source": [ + "f.seek(0)\n", + "t0 = time.perf_counter()\n", + "for _ in range(n_frames_pd):\n", + " pd_img = pd.read_frame()\n", + " cf_cpu.push_pedestal_frame(pd_img.copy())\n", + " cf_cuda.push_pedestal_frame(pd_img.copy())\n", + "print(f'Pedestal ({n_frames_pd} frames): {time.perf_counter() - t0:.2f}s')" + ] + }, + { + "cell_type": "markdown", + "id": "md-io", + "metadata": {}, + "source": [ + "## Read the data frames\n", + "\n", + "Kept out of both timing loops: the two finders run over the same in-memory array." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "io", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading 10000 frames: 5.15s (1,942 FPS, 3.20 GB at 0.62 GB/s)\n" + ] + } + ], + "source": [ + "f.seek(0)\n", + "t0 = time.perf_counter()\n", + "data = f.read_n(N)\n", + "t_io = time.perf_counter() - t0\n", + "gb = f.bytes_per_frame * N / 1e9\n", + "print(f'Reading {N} frames: {t_io:.2f}s ({N / t_io:,.0f} FPS, '\n", + " f'{gb:.2f} GB at {gb / t_io:.2f} GB/s)')" + ] + }, + { + "cell_type": "markdown", + "id": "md-cpu", + "metadata": {}, + "source": [ + "## 1 — CPU, multithreaded" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cpu", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████| 10000/10000 [00:02<00:00, 3440.17it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU MT (4 threads): 2.91s 3,434 FPS 23,242,745 clusters (2324.3/frame)\n" + ] + } + ], + "source": [ + "t0 = time.perf_counter()\n", + "# Pass the frame number: find_clusters(frame) defaults it to 0, and every\n", + "# resulting cluster is then stamped frame 0. Part 2 groups by it.\n", + "for i, frame in enumerate(tqdm(data)):\n", + " cf_cpu.find_clusters(frame, i)\n", + "t_cpu = time.perf_counter() - t0\n", + "\n", + "cf_cpu.stop(); sink.stop()\n", + "clusters_cpu = sink.steal_clusters()\n", + "\n", + "hist_cpu = bh.Histogram(bh.axis.Regular(N_BINS, E_MIN, E_MAX))\n", + "n_clusters_cpu = 0\n", + "for cv in clusters_cpu:\n", + " hist_cpu.fill(cv.sum())\n", + " n_clusters_cpu += cv.size\n", + "\n", + "print(f'CPU MT ({N_THREADS} threads): {t_cpu:.2f}s {N / t_cpu:,.0f} FPS '\n", + " f'{n_clusters_cpu:,} clusters ({n_clusters_cpu / N:.1f}/frame)')" + ] + }, + { + "cell_type": "markdown", + "id": "md-cuda", + "metadata": {}, + "source": [ + "## 2 — CUDA, batched + multi-streamed\n", + "\n", + "`register_input_buffer` page-locks the input once so H2D runs at full DMA\n", + "bandwidth instead of through the driver's staging buffer. It is paid once,\n", + "outside the loop, and released when the dataset is done." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cuda", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CUDA batched: 0.21s 48,578 FPS 23,244,600 clusters (2324.5/frame)\n", + " input pinned in 0.08s, once, outside the loop\n", + " vs CPU: 14.15x\n", + " peak clusters in one frame: 2,522 of CAP 3,000\n" + ] + } + ], + "source": [ + "t0 = time.perf_counter()\n", + "cf_cuda.register_input_buffer(data)\n", + "t_pin = time.perf_counter() - t0\n", + "\n", + "clusters_cuda = []\n", + "t0 = time.perf_counter()\n", + "for start in range(0, N, BATCH_SIZE):\n", + " stop = min(start + BATCH_SIZE, N)\n", + " clusters_cuda.extend(\n", + " cf_cuda.find_clusters_batched(data[start:stop], first_frame=start))\n", + "t_cuda = time.perf_counter() - t0\n", + "\n", + "cf_cuda.unregister_input_buffer()\n", + "\n", + "hist_cuda = bh.Histogram(bh.axis.Regular(N_BINS, E_MIN, E_MAX))\n", + "energies = [np.asarray(cv.sum()).ravel() for cv in clusters_cuda if cv.size > 0]\n", + "if energies:\n", + " hist_cuda.fill(np.concatenate(energies))\n", + "n_clusters_cuda = sum(cv.size for cv in clusters_cuda)\n", + "\n", + "print(f'CUDA batched: {t_cuda:.2f}s {N / t_cuda:,.0f} FPS '\n", + " f'{n_clusters_cuda:,} clusters ({n_clusters_cuda / N:.1f}/frame)')\n", + "print(f' input pinned in {t_pin:.2f}s, once, outside the loop')\n", + "print(f' vs CPU: {t_cpu / t_cuda:.2f}x')\n", + "\n", + "# One ClusterVector per frame, so this IS the per-frame maximum.\n", + "peak = max((cv.size for cv in clusters_cuda), default=0)\n", + "print(f' peak clusters in one frame: {peak:,} of CAP {CAP:,}')\n", + "if peak >= CAP:\n", + " print(' !! CAP REACHED -- clusters were dropped; raise CAP and re-run.')" + ] + }, + { + "cell_type": "markdown", + "id": "md-summary", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "summary", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s FPS us/frame clusters\n", + "CPU MT (4 thr) 2.91 3,434 291.2 23,242,745\n", + "CUDA batched 0.55 18,074 55.3 23,244,269\n", + "\n", + "speedup: 5.26x\n" + ] + } + ], + "source": [ + "print(f'{\"\":<22} {\"s\":>7} {\"FPS\":>10} {\"us/frame\":>10} {\"clusters\":>13}')\n", + "for name, t, n in (('CPU MT (%d thr)' % N_THREADS, t_cpu, n_clusters_cpu),\n", + " ('CUDA batched', t_cuda, n_clusters_cuda)):\n", + " print(f'{name:<22} {t:7.2f} {N / t:10,.0f} {t * 1e6 / N:10.1f} {n:>13,}')\n", + "print(f'\\nspeedup: {t_cpu / t_cuda:.2f}x')" + ] + }, + { + "cell_type": "markdown", + "id": "md-part2", + "metadata": {}, + "source": [ + "# Part 2 — Where the two disagree\n", + "\n", + "The two implementations are not bit-identical by construction: the CUDA finder\n", + "updates its pedestal once per frame, the CPU finder per pixel, so once the\n", + "pedestals drift apart a few pixels land on opposite sides of the threshold.\n", + "\n", + "Three views, cheapest first: the **spectra**, the **cluster sets**, and **where\n", + "in the run** the difference accumulates." + ] + }, + { + "cell_type": "markdown", + "id": "md-spec", + "metadata": {}, + "source": [ + "## Spectra\n", + "\n", + "Both curves should lie on top of each other; the ratio panel is the sensitive\n", + "view." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "spectra", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": + "iVBORw0KGgoAAAANSUhEUgAAA3kAAAKACAYAAAAhGrGwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiCJJREFUeJzt3QmcjPUfwPHv7IWEXDlyVq6QXIkuKkREF12ionSS+hcprA7pQHJ0IilUkg4KlaNIuUtKSpHcx7qt3X3+r+9vd6aZ2Znd2TXns5/36/XsPPPMM8/zm9/8Zvb5zu9yWJZlCQAAAADAFuIinQAAAAAAQPAQ5AEAAACAjRDkAQAAAICNEOQBAAAAgI0Q5AEAAACAjRDkAQAAAICNEOQBAAAAgI0Q5AEAAACAjRDkAQAAAICNEOQBiBlr166V22+/XapXry6FCxeWU089VRo1aiTPP/+87N2717Vfy5YtzRIq48aNk0mTJoXs+IgdlAVPTzzxhHTo0EHOOOMMcTgc0qNHD7959+eff8q1114rp512mvkst27dWlauXBlw3ufl+dOmTZPzzjvPfG9UrFhR+vbtK4cOHcq2n27Tx3Qf3Vefo88N1CuvvCJnn322JCUlmde/f//+gJ8LAMFEkAcgJrzxxhvSuHFj+fHHH+V///uffPHFFzJz5ky54YYb5NVXX5U777wzbGnhwh6UBd9Gjhwpe/bskauvvtoEOv7s2rVLLr74YtmwYYNMmDBB3n//fTl27Jj5cea3337LtYDl5fnvvvuu3HTTTdK0aVOZM2eODB482PxIowGiN9329ttvm310X32OPve9997LNU2rV6+WBx98UFq1aiVff/21LF26VIoVK5br8wAgJCwAiHJLliyx4uPjrSuvvNI6duxYtsePHz9uzZo1y3X/0ksvNUuo1K1bN+jHz8jIsI4cOWLFilhKayjlpSykpqZaJ06csOwsPT3dtV60aFGre/fuPvf73//+ZyUmJlp//fWXa1tKSopVpkwZq0uXLrmeJ9Dnp6WlWRUqVLDatGnj8fx3333X0kug2bNnu7Z9/vnnZtt7773nsW/r1q2tihUrmmPlZMqUKeb5y5YtyzX9hw8fznUfADgZ1OQBiHrPPvusafr0+uuvS6FChbI9rjUGWnPgz4IFC8zz9dbdX3/9Zba7N73UJmA33nijaa6l5ypXrpxcfvnl5ld6Va1aNVm3bp0sXLjQPFcX3eZ04MABeeSRR0yTUk2XNlvT5l+HDx/2OLc+7/777ze1kHXq1DHn0hqEnEyfPl2aN28uRYsWNc3T2rZtK6tWrfLYR5vH6WMbN26U9u3bm/XKlSvLww8/LMePH/fYNzU1VZ5++mmpXbu2OX/ZsmVNc1itJXGnr0+b4H300UfSsGFD04wtOTnZPKZ50aZNGznllFPM8++77z75/PPPPfL7qaeekoSEBNmyZUu213THHXdI6dKlTS2MP7m9J+5p1Nrdc88916TxzDPPlNGjR2c7XqDvUUZGhml+p032ihQpYpoFXnDBBfLJJ5/kWhacZe6dd94xea/n0LTr+zJkyBDzmDcth7pdy6X36/rss89M3ms6tLzofedz9L6WifPPP1+WL18ukRQXF9hlhb5Pl112mVStWtW1rXjx4qYm7dNPP5W0tLSgPP/777+Xbdu2mXLtTlsA6GdDj+N+TN2mj7nT5/7777+ybNkyv+nRGsRbb73VrDdr1syjqao+Vq9ePVm0aJG0aNHCfFa03Ds/0/r5qVChguu97d+/f7ay6Pxc//rrr+Zzr++3Pue5555zvc6LLrrIbK9Zs6bP75Lt27fL3XffLZUqVTLlXsu/fo6983r8+PHSoEEDcz6tidTvh8cffzzH9wNA9EmIdAIAICfp6emm6ZM21dRgJdQ0MNJzaj+/KlWqyO7du2XJkiWuvjV6IXj99ddLiRIlTLNN5Qw8jxw5Ipdeeqn8888/5qJIgw0NAgYNGiQ//fSTzJ8/3+Pi/uOPP5bFixebx8uXLy+nn356joGu9nfSC0691QDthRdeME3WfvjhBznnnHNc+544ccIEvdqEVQMMvbjUQEvTrOdyBjCdOnUy53/00UfNxefff/9tmqnpRakGC3rR6aR9ndavX2/OrReHejGpF8/6enVdLww1/VOnTjXBqzu9sHzmmWfktddeM0Glk/aj1P5Our8GZfl9T5w06NNgTYMozU9tptenTx+TVxrU5fU90gvrKVOmmHwcOnSouTDWfHAGYTmVBacBAwaYwFyDeQ2AcnqP/VmzZo05zsCBA8259MJcgxnd9tVXX7l+BHnsscdMQLhp0yaP9y7aHD16VP744w+55pprsj2m74c+roG9Bisn+/yff/7Ztd1dYmKiCV6cjytd1yBLf5DwPqbzcf2c+KLvv5Z9Ld8TJ040x9YfPZz0s6JBoH7W9P1yBsO///67Kd9abvVzpEHc8OHDzWdav/fc6eda3/fevXubJuvahFTLgP5oMWPGDPP+awCnP0xo2dXAUr83nQGe/gig59WyftZZZ5nmpJpeLc+aZqWfx3vvvVceeOABefHFF83++sPEL7/84vN1A4hiJ1UPCAAhtn37dtME6sYbbwz4Od7NNb/55htzDL11t2nTJrN94sSJ5v7u3bvN/VGjRuWrid6wYcOsuLg468cff/TY/uGHH2ZrGqb3S5QoYe3duzfX17N582YrISHBeuCBBzy2Hzx40CpfvrxH8zRtHqfHfv/99z32bd++vVWrVi3X/alTp5r9ZsyY4bGfpl23jxs3zrWtatWqprnsb7/9lq3JnMPhsNatW+exvW3bttnyW9N1+umnm6a1TsOHDzf5pe+DP4G+J5pGTcvq1auzNbUrXry4q3lcoO/RokWLzP2BAwfmqyw4y9wll1yS7bHBgwebx7xpOdTt7vmhr6tIkSLWP//849qmr1H302aI7s3+Pv74Y7P9k08+saKBv+aaW7duNenU98KbNpXUx7SJtj95ef4zzzxj7m/bti3bvtqEs2bNmq77NWrUMGXX27///muO8eyzz+b4ep3vn3fZ0vKh27/66qtcm2xrc96FCxea/desWZPtc+3+edV9y5Yta7avXLnStX3Pnj3m89qvXz/Xtrvvvts69dRTrb///tvjnC+++KJ5vvMzfP/991unnXZajukEEBtorpkL/QW8Y8eOppmQ/lKqv7znI5A2v4jpr4r6K6/WRugveQCiS6lSpcwv3FpDNmLECNMUUmu8AqVN6PTXc23ep02gnIs2r/LVXFSbm5UsWTLX43755ZfmOLfddpvHcbX2S2ulvI+r59LvLe/aCK2pc0+rNj/U/dyPqWnXWjDvY+rzvWtWtJmivl73WkSlA1V40xq1nTt3ygcffGDua75q7d9VV13l0dz1ZN6TunXrmmZm7m6++WZT0+EcdTHQ90gH3VDa/PRkXHfddXKyNK3a3NNJa5uU1rhq0z/v7e7vsy/urzuvSzD5arIayGP5eb6/fQPdL9A0+aOfc/28e9MaRy2j+pmLj483NYz6mVZac+59fq31c9IaRx3JU5ttalNe98+M1hh7f951QBi9lnF/P9u1a+f6LCut7dMacv0Mz5o1y9SaA4hNBHm50HbxetEwZsyYfGeyXty8+eabJtDTphjaX0C/SAHkrkyZMuZCVpughZpeRGnzN73g16aBOj2DNrnSEfMOHjyY6/N37NhhpnnQCzX3Rfu16I893hdMenEWCD2u0pH+vI+tfXq8j6v55d38UX9gcu/3psfUizltguh9TG3aFUhadRRF7R/nzdc2vQjVpqVjx451XXRqMzHvpp0n857ohbI35zZNa17eI+2XqBfdvo6ZF4G+xznRi3Z3zlEr/W3PqX+j8n7teVmCQQMefV+d74k751Qo3q8tv8/X/p7K377u59F985um/JQDna5BPxPa10+bTeoPDDp6sPZ9VdrsNLfPtb7nvtKl270/73rt4f1+6g8jylnuu3XrZkYr1QBRf6DQYFH7GM6bNy/frx1AZNAnLxf6K5fzly5ftK+H9lHRvh96waS/EGt7euccXfpLnP5arW35a9WqFdx3DygA9EJbB9nQmhXtR6V9TvLKeWHkPfCIr1+pdSCHt956y6zr8Ow6NLv28dLPuvaryi0g1b5QepHk7/H81Aw4n/fhhx96DDRxMvSYelGrU1H44j30u6+06vOdAag7DRJ90cBMB7XQWjX94UxrBnVus9wE+p74Oq9zm/NiP9D3SANJ7Qeozz+ZQM1XvrmXR/c+fOGqNdFAIpI0/7UGSvtAetNt+rgOmhOM59evX9+13b3GWWux9EdX91pn3Vf71elj7v3ynOfR/+/BLAfa504HdNHgzll7p0Ixt56Wa62N176xvmgNn5P2+9VFf+TW1kzaT1f7eupnL1jfPwBCjyDvJOkXof4arZ2V9UtSO+JfeeWV5p9CjRo1zC9n+s9Gf7XW7fpL8RVXXGF+kT6ZXwWBgkQHF5g9e7b06tXLNCHynn9LByTQYMW7iaKTszmg1uBojZCTc5REfzQI0R9xdFAD90mW9cLc+1d2pRdC2hRbAwodnCRYNM160amDTQSj+Z8zrfq9pYGM/lKfH3phqi0UdFAG9wtof5NH60AZOnCKDgajzcN0TrW8NoHz954oHUBFBylxb7Kpg1NowKo1gHl5j/THvWHDhpkf6XTQFX/8lYWcuJdHrZ110v8X4dCkSROJNC0Lo0aNMiOuOgdU0ppZrcXSQYO8Bz/J7/O1bGuQrqOQdu3a1fV8/cFEa9Lc58rTY+p8nFq23PfVkSr1/3t+Pyf+OMu+92A9OkBRsGm51+9QbfocSBNxpQPB6OdAf0zp3Lmz+XwR5AGxgyDvJOgFl/7qp7ULzl/BdAQ3vdjUkar0QkLb22uzB+2HMnnyZHNB9dBDD5kR2bxHzgLgm45OqBfbOuqbjhZ3zz33mGZGGtxpHy2dWkF/ZfcX5GmTO/1xRS/a9QJHL1S0CaCzWZSTXnRr80GtbdIfaTSY1M+pbtdhzd1/8ddARptK6o84WjOj23SEPL1AvOSSS8znXH851/5jmzdvlrlz55rgJj8XihoUaKChoyvqd4r+YKSvQ2vRdBQ+vRhzTmkQKJ2SQFsgaB8fbVKuTci1+ZZ+n33zzTdm5E1foxe609erNWJ6Iajp02aaGlRpDYmv4fS1Vlb7uOkogJpm5xDzOQn0PVH6PawX+FrLpxf2OjKmNjPT1hXOvmuBvkfajE6brmkzOs1nvUjWi3Etb3osHX0wp7KQE81z/ZHPOWqnBiQahPiaYiLWaPDunIJD/9/p/z8NqJw/CjhHnNT/lTq9hPbJ1DzQvNXpALSJob5/7rScaKClTbadAXKgz9cypz+q6nupo7xqzZ2OaKmjXGotsn6WnLQc6zb9ftF+nFpbqP/j9X+6liU9VjDpSJ36OdbRMrW2TD9/+pnUHyqCTfNIPwt6Tq1R15ZFmlf6I7UGf1ojrq0k9Ic0rQm98MILzWdIa7L1e1NHdXX/QQJADIj0yC+xRLNr5syZrvs6ep1u0xHE3BcdBc852l2vXr3MPu6j0q1YscJs+/XXXyPyOoBYpaMK6ihzVapUsZKSksznrWHDhtagQYOsnTt35jgZuo6ud/3111ulSpUyo1reeuut1vLlyz1G19yxY4fVo0cPq3bt2ubYOhrdueeea40cOdJjImSdgFlH5itWrJh5vo6A6HTo0CHriSeeMCNZahr1XPXr17ceeughM1Kokz7vvvvuy9Pr19ETW7VqZUaLLFSokDmvvqb58+e79tH80bQHMqKjjs6no+s1aNDAKly4sHm9+tp1JL7ff//dtZ+e56qrrvKZpp9//tm64oorzPM1b++8807r7bffzjY6oHve6WO9e/cO6DUH+p4406ijZOqIl5r31apVs0aMGJHtmIG+Rzqxt56nXr16rv2aN29uffrpp7mWBefomh988IHP1/XDDz9YLVq0MK/pjDPOMO/Pm2++6XN0TV9576v8OEeLfeGFF6xIcY4k6WvxHt1248aNVufOnU15PuWUU6zLL7/c/H/0dt1115kRRvft25ev5ztH3dRyo++jjkj74IMPmtFpvek2fUz30X31OToSbSByGl1Ty6QvOgqolilNv46U2bNnTzNSpvv3Uk6fa3/H9lVudu3aZV5b9erVzUTy+nlt3LixGUFWPxNKP7v6HVOuXDnz+nUSeL2eWbt2bUB5ACB6OPRPpAPNWKFNK7Q5pjZbUPrL7S233GKaMHj/wqeTiGrtgf46pzV6WuPgpE179Jdg/dU4kP4oABBL7rrrLlMDooNYeDet1Tm8tCZB+yk7B30IBq3h0dpc5yThsA/9X6o1cTrCKgAgMDTXPAk6Wpw2R9FhwbVpjy/a5EE7cWvTTm0Lr7TzsqJtO4BYp83AtJmkNlXUPk4aZOlowtpvzj3A02aO2txO99emoMEM8GBf+iOqTmCvTXwBAIEjyMuFXrRs3LjRdV8vUlavXm36U+gAAFqTp3NXvfTSSybo09HRtL+I9snQfhfaD0g7/N9xxx2mk7j2/dA+KVqD5z3nFADEGu1HpDUs2pdPf9DSfnM6n53283On/fu0f4/+IJbbKKWAk/4YoP3jAAB5Q3PNXOjQxjqBqLfu3bubjvLaDFM75uugKlu3bjUjtukgEToIgrPzvQ6RrJ30tXmmc7QqDQoZXRMAAABAsBHkAQAAAICNeI5vDQAAAACIaQR5AAAAAGAjDLzigw6Oov3oihUrZqZNAAAAAIBI09nvDh48aEa2jovzX19HkOeDBniVK1cO5fsDAAAAAPmyZcsWqVSpkt/HCfJ80Bo8Z+YVL15coiVqT0lJkRIlSlC7SH7bDuWb/LYzyjf5bWeUb/LbzqwovP7WaWW0MsoZr/hDkOeD803UAC+agjxdND3RUsjsjPwmv+2M8k1+2xnlm/y2M8o3+e2UWzzAwCsAAAAAYCMEeQAAAABgIwR5AAAAAGAj9MkDAABAWKWnp8uJEyfI9Xz0yUtNTZVjx44xRoNN8zsxMVHi4+NP+jgEeQAAAAjbRfP27dtl//795PhJzOe8Z88e8s/G+X3aaadJ+fLlTyqwJMgDAABAWDgDvNNPP11OOeUUaqPyESRrLajW9DDauv3y27IsOXLkiOzcudPcr1ChQr6PRZAHAACAkNOLZWeAV7p0aXI8Hwjy7J/fRYoUMbca6OlnJb9NNxl4BQAAACHn7IOnNXgA/HN+Rk6m3ypBHgAAAMKGZoZA6D8jBHkAAAAAYCMEeQAAAAD8uuSSS+S9994jh4Lgp59+kkqVKsnhw4cllAjyAAAAgABGBn3ggQfkzDPPlEKFCknlypWlY8eO8tVXX7n2qVatmmlqp4v2q6pXr5689tprrseHDBki5513XrZj64A0+pwFCxb4PX/Lli0lLi5Onn/++WyPtW/f3jxfj//XX3+50uBv0f0C9dlnn5nXfuONN5r7e/fuNflQq1Yt8xqrVKkiDz74oKSkpHg87+qrrzaPFS5c2IwS2a1bN/n333/9nkf7nz322GNSv359KVq0qFSsWFFuu+02v8/RQVHatWtnXs/HH3/s2q6v/84775Tq1aubQUzOOussGTx4sJnvLie+8knz+6WXXgr43N5lwLn079/f9bi+vvPPP19GjhwpoUSQBwAAAORAA4fGjRvL119/bYIsrY354osvpFWrVnLfffd57Dt06FDZtm2brF27Vjp37iy9e/eW6dOnByV/NbB8++23PbZpEKTpcg63r/vo+Z3Lww8/LHXr1vXY9sgjjwR8ztGjR8vtt99uAh7n+XR58cUXTT5MmjTJ5IUGVu40b95//3357bffZMaMGfLHH3/I9ddf7/c8OnXAypUr5cknnzS3H330kWzYsMEEi76MGjXKZ9+1X3/91cxtp8H1unXrTDD16quvyuOPP57j63TPH10mTJhgjn/NNdcEfG7vMuBcnnjiCY/HNT/Hjx9vRu4MFaZQAAAAAHJw7733mov6H374wdQyOWnwdMcdd3jsW6xYMTORtXr66adNoKO1PV27dj3pPL7qqqvkgw8+kO+++04uuugis02DrDZt2sjmzZvNfR1y33l+deqpp0pCQoLHtkDt3r1b5s+f71HrpLWTGrQ5aU3ZM888I7feequkpaWZc6mHHnrItU/VqlVNbZYGvVpjl5iYmO1cJUqUkHnz5nlse+WVV0ytl742rRV0WrNmjYwYMUJ+/PHHbHPJXXnllWZx0ppXDTQ1qNLA1B/v/Jk1a5YJVPX57nI6t68y4Evbtm3NBOsLFy6Uyy67TEKBmjwAAADAD22eqDVVWmPnHuA5nXbaaTnmnTZXPJmh8N0lJSXJTTfdJBMnTnRt0yDPO9AMlm+//dY0yaxTp06O+2lTzeLFi7sCPF95+O6770qLFi18Bng5HVeDa/c81ho/zYMxY8YEHLimpKRIqVKlAj7vjh075PPPP8+Wr4Gee/jw4WYuSG2aqwGwd1NRfR8bNGggixcvllChJg8A9NfYQV/IiXRLLnSskdfiXzB5ckISpGjyDvIHAMLw/RtOifEOWTf0v9qenGzcuNH0wapdu3aezqG1WlOmTDFNGu+55x4JFm3qp/3ztBnlihUrTACjNXx56WeXl2aq5cqVczXV9EVrpJ566im5++67sz2mfew0INLg6IILLjD9+wJ17NgxU/t38803mwDSSWsINVjs1KlTQMf5448/TI2gr751/miTWK2Nu/baaz22B3LuPn36SKNGjaRkyZKm5nfAgAGyadMmefPNNz32O+OMM0z+hgpBHgBoQJduSWp6hutbMcmRJhLeaw4AQBTSAC8vc5dpYKN9sI4fP25qbP73v//5DIDy69xzz5UaNWrIhx9+KN98840Z0CQvtWN5cfToUVMT6c+BAwdMgHnOOeeYwU286WvXvnp///23JCcnm4FUNNDLLS+15lMHetG+dePGjXNt/+STT0z/w1WrVgWU/n///dc03bzhhhukZ8+eEijtj3fLLbeY1+7sNxfoud2bqep7pcGe9kV01u456aAwGvyGCkEegALr8OBykihpZn1DYppMjbtCbnpK+xn0l9TB/30RAwBCJ9AatUjRgEqDkvXr15s+ZbnRwKZHjx6mmaP22XIPaLRGynsUSufoms5+aYHW5o0dO1Z++eUXU1sUKmXKlJF9+/b5fOzgwYMmgNI+fzNnzvQZaOrzdalZs6Zp8qmDwnz//ffSvHnzHAO8Ll26mNovDarca/H0vtbMeTeRve666+Tiiy/2GJ3033//NX3q9Fyvv/56wK9Zm1BqHz7vwXLycm53WoPprBF2D/K0Cav2ZwwV+uQBKLA0wDM1diKSaiXI1XHfRjpJAIAoo325dKAMDap8zW3mDNCcNKg5++yzzRQA3jVW2uTzn3/+MVMSuNNBPLRJpD4vENqEUZuB6iAoWosWKg0bNjRp9Q70tAZPB3vRmkqt4cqpts+7RlRrOHML8H7//Xcz4It7UKS0+aaOWrp69WrXonRgGPd+ilu3bjVNWrXZpG7Pqbmpt7feesuMpKp95vJzbm/Omj/vQVp+/vlnk7+hQk0egAJNg7uk5D1mPSnSiQEARCVtMqh9sXSkRx0eX5vhaZ87HQ1SR23UWr5AaGCkNVraFFEH5NBAUAMHndJAp1rQfmCB0CaAOjR/qJppOmkQUrZsWTOaZ4cOHVw1ePo6tKmh9jnUgE8Xpfvq6J5au6iLjgCqaf3zzz9l0KBBpubKXy2e5qc2a9TpE7RJpzaTdAbDGmhrQKmDnfga8ERH3tR58Zw1eC1btjTbdDTNXbt2ufbLbaAWfR06eqmv/nuBnHvp0qWmplJrELVWVoN3bb7pnDPQSfviaSB6xRVXSKgQ5AGAD/sk8x9tOXIHAAo8vYjX4EMDM513TgMsDWi0xkeDvIAvvBMSZO7cuWbONu3ztXPnTjO9gPYXe/TRR/OUz7mN6hkMGrDpCJM6MqYzyNPBXpYtW2bWvWsetYmlTgau/c10njvtp6e1n1qLpU07p02bZiaSd9J9tWmrDhqjNZxaK6i8J4zXvocauAVC83fjxo1mqVSpks/aRO9zO2n6dB8dQTM/9LVpM0/tf6g1lvre9urVK9t7O3XqVBMo6+Oh4rDcXy1cUbxG387hYKOBvk2aHk1XoB1/QX7HikiV77efzJyzqPtT2SeprTlwjrnd8Ew7sRu+T8hvO6N8R29+62iJGgRowBRI8z74zm+t4dLgK1z/L3U6AZ0PUIO7YAYlOqiL1tDNnj3b1HyF09EAzx2K/NbgT/t5aqB34YUX5vmzEmicQk0egALrmYwe5rZ7pBMCAECU0ikUtJ+aTkgezCDPORF4uAO8SJ9bRxodOHCg3wAvWAjyAAAAAPgV6Jx0eaHNN3WJhCsjeG4daVSXUCPIA1BgtXSsyFrL3iRzZUJmLZ8Ik6EDAIDYQpAHoMAaEz8ya+2JbI8lZc2fBwAAEGuYJw8AAAAAbIQgDwAAAABshCAPAAAAAGyEIA8AAAAAbIQgDwAAAABshCAPQIG1Q0qZxZdb0gebBQAAu/j666+ldu3akpGREemk2ML1118vI0aMkGhEkAegwLo8bbRZfFlj1TALAABq+/bt8sADD8iZZ54phQoVksqVK0vHjh3lq6++cmWQw+GQjz/+OFuG9e3bV1q2bOm636NHD7OvLomJiVKuXDlp3bq1TJgwwW8A1qZNG0lISJDvv/8+32/Io48+KgMHDpS4uMwQ4KOPPjLnLVu2rBQvXlyaN28uX375pcdzdJ8mTZrIaaedJkWLFpXzzjtP3nnnnRzPs2DBAjOBeoUKFVzPeffdd/3u/91335nXpvv5M23aNJNfnTt3Dsq5jx8/bvKiatWq5v0866yzTP47nThxQoYOHSq1atWSIkWKSIMGDeSLL77wOMagQYPkmWeekQMHDki0IcgDAAAAcvDXX39J48aNTU3Y888/Lz/99JO54G/VqpXcd999+cq7K6+8UrZt22aOPWfOHHOsPn36SIcOHSQtzXOu1s2bN8vSpUvNuSZOnJiv8y1ZskR+//13ueGGG1zbFi1aZIK82bNny4oVK0waNHBdtWqVa59SpUqZYEjPv3btWrn99tvN4h0Mep/r3HPPlRkzZpjn3HHHHXLbbbfJp59+mm3flJQU89jll1/u93h///23PPLII3LxxRcH9DrPDeDcXbp0MQH6W2+9Jb/99ptMnTrV1HI6PfHEE/L666/LqFGjZN26ddK7d2+55pprPPJGz1OtWrUcA9hIcViWZUU6EdFGo/ESJUqYQqe/akQDfZs0PZou/RUD5LedRKp81xw4x9xueKZdtsc+G5S5rcPQzH3shO8T8tvOKN/Rm9/Hjh2TTZs2SfXq1aVw4cISS9q3b28CBg0GtHbI3f79+00tl9I8mDlzZrbaJq3JW716tallctbk6fO8a/00iNRg54033pCePXu6ticnJ8uvv/5qao6aNWsm//77r5x66ql5eg0PPvigCSo/+OCDHPerW7eudO3a1ZzLn0aNGslVV10lTz31VMDn1/21xtK9tkzdeOONUqNGDYmPjzf5ofnkLj09XS699FITWC5evNhnvuX13F988YU5759//mmCWF8qVqwojz/+uAnuNG3OWkTN9ylTpni8NxosasAcLDl9VgKNU6jJA1Bg/Zxwq1l8aeP4wSwAgIJt7969JijQWjTvAE85A7xguOyyy0yzQG0i6R5Ia+3drbfeamqaNCB6//3383xsDUK02WVOtKnowYMH/QY+mhYNaDTYveSSS/J0fg1KvI+rr+uPP/6QwYP994HXJpPanPTOO+/M0/lyOvcnn3xi8kJrZc844wypWbOmqSk8evSoR3NO7wBLm21+++23HtvOP/98+eGHH8z+0SQh0gkAgGiV5EiT1MGlXfdPSIIUTd4R0TQBgC09Vdb/Yz3ni1RokLk+7RaR3+f63u+S/4lc+mjm+sp3RD7v53u/8vVFen0dcNI2btxoghv3pnyhpOfRWkOn+fPn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fv3koosuMv/kKePhz29FGQ+un376yQQZx44dk1NPPVVmzpwp55xzjusCle/v8OS3omwH17Rp02TlypXy448/FqjrE4K8GKGdRL3/6XlvQ870S9Opfv365sv1rLPOkrfffts1IEV+8pn3InDByF9f+/MeZNe1a1fXul4YN2nSxAR8n3/+uVx77bXk90m4//77Ze3atfLtt99me4wyHr78powHV61atWT16tVmoIgZM2ZI9+7dZeHCha7HKdvhyW8N9CjbwbNlyxbp06ePzJ071wxe6I8dyzfNNaOcjuITHx+f7VcAbXbl/asD8kZHR9JgT5twOkfZzCmfdR9tPqujJ/Fe5E2w8lf30VpYb7t27eLzkIsKFSqYIE/LO/mdfzq62ieffCLffPONVKpUybWdMh7e/PaFMn5ytKbi7LPPNj8I6QiEDRo0kJdffpmyHeb89oWynX8rVqww1xE6Mn1CQoJZNJgePXq0WXdeX9jx+oQgLwa+BLRgzps3z2O73temhsg/HQ53/fr15stT++jpB9Q9n/UDrV8EznzW9yExMdFjn23btsnPP//Me5GLYOWv1r5q35wffvjBtc+yZcvMNj4POduzZ4/5RVPLO/mdd/prrNYoffTRR/L111+bMk0Zj1x++0IZD/57oP8n+f4Ob377QtnOv8svv9w0jdVaU+eigfUtt9xi1s8880z7Xp9EZLgX5GsKhbfeesuM3tO3b18zhcJff/1FTubBww8/bC1YsMD6888/zehHOqytDpnrzEcdWUlHU/roo4/MELo33XSTzyF0K1WqZM2fP98MoXvZZZcxhYLbyFWrVq0yi361jBgxwqw7p/oIVv7qEMU6/LGOWqVL/fr1C+QUCjnltz6m5V2HcN60aZP1zTffWM2bNzfDP5Pf+XPPPfeY8qvfIe7TUhw5csS1D2U8fPlNGQ+uAQMGWIsWLTLfF2vXrjVD+uvIgXPnzjWPU7bDl9+U7dC71G10TTuXb4K8GDF27FiratWqVlJSktWoUSOPYaQRGOe8JxowV6xY0br22mutdevWuR7XYXR1mgUdSrdQoULWJZdcYj7s7o4ePWrdf//9VqlSpawiRYqYD+/mzZt5CyzLBBIabHgvOhR0MPNX53q75ZZbTICui67v27evwL0HOeW3Xgi3adPGKlu2rCnvOr+YbvfOS/I7cL7yWhedy82JMh6+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, (ax_spec, ax_ratio) = plt.subplots(\n", + " 2, 1, figsize=(9, 6.5), sharex=True, gridspec_kw={'height_ratios': [3, 1]})\n", + "\n", + "edges = hist_cpu.axes[0].edges\n", + "cpu_vals, cuda_vals = hist_cpu.values(), hist_cuda.values()\n", + "\n", + "ax_spec.stairs(cpu_vals, edges, label=f'CPU MT ({n_clusters_cpu:,})',\n", + " color='C0', linewidth=1.4)\n", + "ax_spec.stairs(cuda_vals, edges, label=f'CUDA ({n_clusters_cuda:,})',\n", + " color='C1', linestyle='--', linewidth=1.4)\n", + "ax_spec.set_ylabel('Counts')\n", + "ax_spec.set_title(f'Cluster energy spectrum — {N:,} frames')\n", + "ax_spec.legend()\n", + "ax_spec.grid(alpha=0.2)\n", + "\n", + "with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratio = np.where(cpu_vals > 0, cuda_vals / cpu_vals, np.nan)\n", + "ax_ratio.stairs(ratio, edges, color='C1', linewidth=1.2)\n", + "ax_ratio.axhline(1.0, color='gray', linewidth=0.5)\n", + "ax_ratio.set_ylabel('CUDA / CPU')\n", + "ax_ratio.set_xlabel('Energy [ADU]')\n", + "ax_ratio.set_ylim(0.9, 1.1)\n", + "ax_ratio.grid(alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "md-sets", + "metadata": {}, + "source": [ + "## Cluster sets\n", + "\n", + "Every cluster is keyed by `(frame, x, y)`, so the two results can be differenced\n", + "directly — no per-frame Python loop.\n", + "\n", + "A cluster whose centre moved by one pixel was *relabelled*, not gained or lost,\n", + "so those are counted separately from genuine adds and drops." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "sets", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU 23,242,745 clusters\n", + "CUDA 23,244,269 clusters net +1,524 (0.0066%)\n", + "\n", + "exact-position mismatches CPU-only 1,976 CUDA-only 3,500\n", + " of which shifted by 1 px 120 107\n", + " genuine add / drop 1,856 3,393\n", + "\n", + "frames touched by a genuine difference: 2,385 of 10,000\n", + "[4.3s]\n" + ] + } + ], + "source": [ + "def cluster_keys(vectors):\n", + " \"\"\"One int64 key per cluster: frame * rows*cols + y * cols + x.\n", + "\n", + " Centres are unique within a frame, so keys are globally unique and the sets\n", + " below need only a sort, never a np.unique.\n", + " \"\"\"\n", + " n = len(vectors)\n", + " sizes = np.fromiter((cv.size for cv in vectors), np.int64, n)\n", + " frames = np.repeat(\n", + " np.fromiter((cv.frame_number for cv in vectors), np.int64, n), sizes)\n", + " xy = [np.asarray(cv) for cv in vectors if cv.size]\n", + " if not xy:\n", + " return np.empty(0, np.int64), frames\n", + " x = np.concatenate([v['x'] for v in xy]).astype(np.int64)\n", + " y = np.concatenate([v['y'] for v in xy]).astype(np.int64)\n", + " return frames * (rows * cols) + y * cols + x, frames\n", + "\n", + "\n", + "t0 = time.perf_counter()\n", + "k_cpu, fr_cpu = cluster_keys(clusters_cpu)\n", + "k_cuda, fr_cuda = cluster_keys(clusters_cuda)\n", + "\n", + "# Sort ONCE. np.setdiff1d and np.isin each re-sort their argument on every call,\n", + "# and the shift check below calls one eight times per direction -- about twenty\n", + "# sorts of a 27-million-element array. Two sorts plus binary search instead.\n", + "s_cpu = np.sort(k_cpu)\n", + "s_cuda = np.sort(k_cuda)\n", + "\n", + "\n", + "def present_in(vals, sorted_keys):\n", + " \"\"\"Which of `vals` appear in an already-sorted key array.\"\"\"\n", + " if sorted_keys.size == 0:\n", + " return np.zeros(vals.size, dtype=bool)\n", + " i = np.searchsorted(sorted_keys, vals)\n", + " np.clip(i, 0, sorted_keys.size - 1, out=i)\n", + " return sorted_keys[i] == vals\n", + "\n", + "\n", + "cpu_only = s_cpu[~present_in(s_cpu, s_cuda)]\n", + "cuda_only = s_cuda[~present_in(s_cuda, s_cpu)]\n", + "\n", + "\n", + "def drop_shifted(only, sorted_other):\n", + " \"\"\"Drop mismatches that have a counterpart within 1 px in the other set.\"\"\"\n", + " keep = np.ones(only.size, dtype=bool)\n", + " for dy in (-1, 0, 1):\n", + " for dx in (-1, 0, 1):\n", + " if dx or dy:\n", + " keep &= ~present_in(only + dy * cols + dx, sorted_other)\n", + " return only[keep]\n", + "\n", + "\n", + "cpu_real = drop_shifted(cpu_only, s_cuda)\n", + "cuda_real = drop_shifted(cuda_only, s_cpu)\n", + "touched = np.unique(np.concatenate([cpu_real, cuda_real]) // (rows * cols)).size\n", + "\n", + "print(f'CPU {k_cpu.size:>12,} clusters')\n", + "print(f'CUDA {k_cuda.size:>12,} clusters net {k_cuda.size - k_cpu.size:+,}'\n", + " f' ({abs(k_cuda.size - k_cpu.size) / k_cpu.size:.4%})')\n", + "print()\n", + "print(f'exact-position mismatches CPU-only {cpu_only.size:>8,} '\n", + " f'CUDA-only {cuda_only.size:>8,}')\n", + "print(f' of which shifted by 1 px {cpu_only.size - cpu_real.size:>17,} '\n", + " f'{cuda_only.size - cuda_real.size:>17,}')\n", + "print(f' genuine add / drop {cpu_real.size:>17,} {cuda_real.size:>17,}')\n", + "print(f'\\nframes touched by a genuine difference: {touched:,} of {N:,}')\n", + "print(f'[{time.perf_counter() - t0:.1f}s]')" + ] + }, + { + "cell_type": "markdown", + "id": "md-drift", + "metadata": {}, + "source": [ + "## Where in the run it accumulates\n", + "\n", + "Cumulative `CUDA − CPU` against frame index. A curve that rises and then flattens\n", + "means the two pedestals settled into agreement and the difference is a start-up\n", + "transient; a steadily sloping line would mean a persistent per-frame bias." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "drift", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": + "iVBORw0KGgoAAAANSUhEUgAAA3kAAAFeCAYAAAA4xtZyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAY95JREFUeJzt3Qd8FGX+x/FfQkIIEErovSi9SlGwHFUUFU+xVzjLqdhRsd3ZTuTUEz317F3s97frqaAoIr0piCAovfdQA0n2//o+44TNZhOSkLK7fN6v10B2dnZ2dubZ2fnN8zy/Jy4QCAQMAAAAABAT4st6AwAAAAAAxYcgDwAAAABiCEEeAAAAAMQQgjwAAAAAiCEEeQAAAAAQQwjyAAAAACCGEOQBAAAAQAwhyAMAAACAGEKQBwAAAAAxhCAPUe+nn36yv/zlL9asWTOrUKGCVa5c2bp06WIPPfSQbd68OXu53r17u6mkPPXUU/bKK6+U2PqjUXHtk7i4OLvnnnuyH2udmrd06dIcy/3tb3+zxo0bW0JCglWrVs3N27t3r1155ZVWr149K1eunHXu3PmgtwfRL7RMFdSuXbvc67799ttcz+VVLpHTa6+9Zueee661atXK4uPjrWnTpnnuoh07dtgNN9xg9evXd+d3fX/ffvvtAu/Swrx+1qxZ1r9/f/cbovPH4MGD7ffffw+77BNPPGGtW7e2pKQk99tz77332r59+wq0TV9//bV169bNKlWq5MrLhx9+aIcS7Sftu3/+85855r/zzjvWrl07S05Odvtlzpw57rumvyP1fFBQjz32mCtPKit6r8Jei+g14abQffj+++/beeedZ4cffrjbj/puXXDBBbZo0aJ81797925r2bKlW+e//vWvXOVV34lVq1YVaptR9hLKegOAg/H888/bsGHD3MXCLbfcYm3btnU/IDNmzLBnnnnGJk+ebB988EGpBTQ1a9a0oUOHlsr7RYOS2icnn3yyO7YK3HwfffSRjRw50u68804bOHCgu/iSp59+2p599ll3Uda1a1f3YwUUlYI8XdBL6IVauHKJ3F5//XVbu3atHXnkkZaVlZVvcKQL4+nTp7uLWV2Evvnmm+4iVq87//zzD7h7C/r6BQsWuOOpIPDdd9+1PXv22F133WXHHXecCzZq1aqVvazOM3//+9/ttttuswEDBrj16waTLoKfe+65fLcnEAjY2Wef7bbl448/doGefr8Otd+FLVu22LXXXps9b8OGDXbRRRfZiSee6J7X+Vv76LLLLnPzop2uR3Ss+/bta5988kmR1nHmmWfaTTfdlGOebmoGe/DBB61u3brud7B58+a2YsUKe+CBB9yN7ylTprggOhyV5507d4Z9rl+/fu67escdd9irr75apG1HGQkAUWrSpEmBcuXKBU488cTAnj17cj2fnp4e+Oijj7If9+rVy00lpV27dsW+/qysrMCuXbsC0aq49olOVXfffXe+y9x///1uuXXr1uWYf9lllwWSk5MDxWnnzp3Fuj6UvoKUqXA2bNhQ5NceKvbu3RvYt29fns9nZmZm/33yyScHmjRpEna5zz77zO3rN998M8f8448/PlC/fv1ARkZGvttRmNefddZZgZo1awa2bduWPW/p0qWBxMTEwIgRI7Lnbdy4MVChQoXAX//61xzrHDlyZCAuLi7w888/57tNK1eudNv04IMPBg7F84zKRYMGDQK33XZbjvkTJ050++Wdd94pk+0q6nf65Zdfdq89kOAyX5TfRb3H1VdffcDlQn//ZNWqVa4cX3rppWFfM3Xq1ED58uUD7733nnufhx9+ONcy//3vf9311vLlywu13ShbNNdE1NLdKTUt0J1Tv9YmWPny5e3UU0/N8/VqbqXXhza7UlMrzQ9uZqgmO2pepCY/eq86deq4u1u6wytqEvHzzz/bd999l92MIrgJUlpamt18882uqYa2q0GDBq4JUeidM73ummuucXf92rRp494rvztn6enpdt9997ll1RSpRo0a1qdPH5s0aVL2Mrojffvtt+d476uvvtq2bt1aoOYq+hzBNXF+k7Tx48fbVVdd5Wrq9L66Y7569eocr8tvn4Sj/XT55Ze79anGTXdwf/311wM2i9N6dSdddGz8z6L/X3jhBdcUxd8G/7jqd1N3jHXnXs1aqlev7u6UhjbP0t399u3b24QJE+zoo4+2ihUr2iWXXFKk46oaDB0rraNTp0726aef5vpsqlFQTYM+h46/7tRefPHF7lj7VAtyxRVXWMOGDd37+s3FMjIy7EDUJEq1D6pt0ufW9qhGItxd3KlTp9qgQYPc8VD5Ouyww9znK8z25tXcKlzTRh3HU045xe2XI444Inv7/P2k1+ix7ojrzrJq7EOPVbhmUCq/Byp7qklQqwC1BlDZq127trvr/v3332cvo231a3S0v/0y5X8/wn0mv/yotke1Qjr2usOumiXVJgXT90XHRsvoffQ9/eyzz8Kep8KZOHGiOy+lpKS4dai86vW+H3/80a3rxRdfzPXa//3vf+451S751MRLtV3aFzq22vf/+c9/wp5HVbZVy6DvgJZdvHhxntupJpoFoVYYOhZnnXVWjvlqnq9zjcpncbxe3xuVsTPOOMOqVKmSvVyTJk3c+TS4NcgXX3zhzqlaR+g6dU7Jr+mlvgv6zsqtt96a45zof0/UZFTnIZ2P9H0TlXP9/mhZvwmevnPLli3LsX6//H3zzTfZ51F9Hn0f9f3WeUO1iGqKqu+/zl2htahq3n7//fdnN0VVOdRn0/cjmN5DZVvvoW3S9177TzXd+VH5Uo2nau18+v4ce+yx7u9zzjknR3PGcOcP/zyhY6EaKr2/tvell14q9He6tBS0zB8sfcZQum5RuVOtXigdb/2e6VyjJsR50e+A9qFaTyF60FwTUSkzM9P9yKj5XaNGjUr8/U466ST3nurnpx+zjRs3ukDKD5R0EaAf5qpVq7rAQfzAUz96vXr1spUrV7rmDh07dnQXc2oKNHfuXBs3blyOHzFdJOhHSM+r2UW4k7Z/YaJmiVpWF9768dI8NclYvny5u8DTRcdpp53m2tQr0NNFpvow3n333a5ZmaZwAXJBqBmNmqep+ZN+PNRc9sILL3TH5UD7JBx/W7Vf9dm7d+9uP/zwg/uMB6L30sWnLl71w6/31I+agsR//OMfLiD1t8u/cFKQpIui6667zjVxUf9NBczab7oYVtDiW7NmjftsI0aMcDcX9INd2OOqi21d6Os99GOpsnT66afbwoUL3UW/6H11saPAWcu1aNHCvbcujPRjrP3nN3PTNui99Hl0HHVhpuDi5Zdfzndf6cJd5VllRsGSgjR9/mnTpmXvI/nyyy/dD7su7EePHu3Kvdb/1VdfZS9TkO0tLK1TZVXNjXQcFUzpBoLmqRz7N3d0kawLvSVLlriLvIPl99/Vd0PfO/XlUrnSxabeV//rwljlS+Xq0ksvdd8BCW7KF46OmfrFKAjS+rVefR5dfOkCXLTfVJ50TNTEWN/7t956y90cKAjdTDn++ONdOdT3QPte3zsdQ61HF8+6saDgWWVE2x9M3wW9p8qGzJ8/330XdNwfeeQRt09UJvR90flPnyOYPk/Pnj3dDSqVzbzOW4Uxb948V/7UxzaYPqP/vLbxYF//22+/uRtB/vzQZceOHesCO93o0GukQ4cOOZZT2dD3wH8+HJUXHQOVZzVVVAAd+h3Rcwro1I/Yv/Gi752adGp+amqqKysqIzpH6jjpfUPfR+tR38PZs2e785N+G3Su0fy//vWv7vyk773K4PDhw93rdNPhz3/+s/tN0blO+0aBpI61yr+CTX3XtD069+v3RIGVgkYFbvpu6HuvGwx50XlQZUOBV3BTQZ3TFGjo+63AOjjYzus8oe+TblDpXK2beSrT6ov2pz/9qcDf6Wii31p9t3WcdONI54bQmw3h6MaljqN+X0PpvK1ypt/J0EA+mG4m+jeN9BpEiTKuSQSKZO3ata5Zwbnnnlvg14Q21xw/frxbh/4PtmTJEjdfzTD85jl6/Nhjj+W7/ryaYIwaNSoQHx8fmD59eq7mD1rv559/nj1Pj6tWrRrYvHnzAT/Pa6+95pZ//vnn81zmiy++cMs89NBDOearSYzmP/fccwdsrqKmVEOGDMnVPGXYsGE5ltN7aP6aNWuK1Czlf//7n3v9v//971zNoEK3zd8GHSufntc8NacLpm2vVKlSjnmTJ092yz7yyCM55q9YscI17QxunqXt17Jff/31QR3XOnXqBNLS0nKUYb1e6/H17ds3UK1atcD69evz3E9XXHFFoHLlyoFly5blmP+vf/3Lvc+BmouFNgdW86nvvvvOvfbHH3/Mfu6www5z0+7du/N8fUG21z8uocIdQ5U17X81afPNmTPHLVevXr0czdc+/PBDN//jjz8+YJNslYHQJoEHap6lpnzaN/369QucfvrpBWquGe4z+eVHTaKCtW3bNnDCCSdkP77lllvCNvfTMuHOU6F69OgRqF27dmD79u05PkP79u0DDRs2dMdaHn/8cbe+hQsXZi+n801SUlLgpptuyvG+el1w80W55pprXHNF/xzln0f/9Kc/BYoiv+aaLVq0yLGPfKtXr3bv+cADD+S77oK+/ocffnCP33rrrVzLahk9p9fI5Zdf7vZVOC1btgwMGDAg323yf19Cm8T535O77rorcCA6rjt27HDnteDzpV/+rr322hzLn3baaW7+6NGjc8zv3LlzoEuXLtmP9fm13P/93//lWE7nOM1/6qmncpzj9N0srDZt2rguFqH8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+QjRgN81UI4QKbIi7Do7LS3NVTb58UheCPKKwG+iqQAvUoI8jamkbYmEwofoRDkC5QiRgvMRKEeIFFkRep19oC5jkbOlAAAAAICDRpAHAAAAADGEIA8AAAAAYghBHgAAAADEEII8AAAAAIghBHkAAAAAEEMI8gAAAAAghhDkAQAAAEAMiZggb8KECTZo0CCrX7++G9zvww8/zPH80KFD3fzgqUePHjmWSU9Pt2uvvdZq1qxplSpVslNPPdVWrlyZYxmNWH/RRRdZ1apV3aS/t27dWiqfEQAAAECUSN9h9ts3ZoGARZuICfJ27txpnTp1sieffDLPZU488URbs2ZN9vT555/neP6GG26wDz74wN5++22bOHGi7dixw0455RTLzMzMXub888+3OXPm2BdffOEm/a1ADwAAAACyzXjJ4t84wypOecSiTYJFiIEDB7opP0lJSVa3bt2wz23bts1efPFFe/31161///5u3pgxY6xRo0Y2btw4O+GEE+yXX35xgd2UKVPsqKOOcss8//zz1rNnT1u4cKG1atWqBD4ZAAAAgKiTvt39t69eV6tg0SVigryC+Pbbb6127dpWrVo169Wrl40cOdI9lpkzZ9q+fftswIAB2cur6Wf79u1t0qRJLsibPHmya6LpB3iiJp+ap2XyCvLUDFSTLy0tzf2flZXlprKmbQgEAhGxLYhelCNQjhApOB+BcoSIkFjRNXvMqpAaMdfZBd2OqAnyVMt31llnWZMmTWzJkiX297//3fr27euCO9XwrV271sqXL2/Vq1fP8bo6deq450T/+0FhMM3zlwln1KhRdu+99+aar/59GRkZFgkHe/v27S7Qi4+PmBa4iDKUI1COECk4H4FyhEiQvHuXVfqjW9m+zZsj4jpb1/wxFeSdc8452X+rdq5bt24u4Pvss89s8ODBeb5OgY+StPiC/85rmVC33367DR8+PEdNnpqBKqCsUqWKRcKPobZf2xMJhQ/RiXIEyhEiBecjUI4QEZIruv+U0DElNTUirrMTEhJiK8gLVa9ePRfkLVq0yD1WX729e/e62rXg2rz169fb0Ucfnb3MunXrcq1rw4YNrsYvL6op1BRKBzoSDrYoyIuk7UF0ohyBcoRIwfkIlCOUubi4iDsfFXQbyn5Li2jTpk22YsUKF+xJ165dLTEx0caOHZu9jDJwzps3LzvIU4IV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jHHZNJ988kn75ptvrHXr1taxY8eirA4AAAAAEAmDoVerVs2GDRtmM2bMcMMo9O7du7i2CwAAAABQGoOhb9u2zcaOHWtLly51/fGaN29u/fr1s86dO7uhFAAAAAAg6gUOgSEURE00r7nmGktLS8sxv2rVqvbMM8/YOeecU9zbBwAAAABlKC52m2uqOeZf/vIXO+2001xWzd27d7tx89RUc9CgQXbRRRfZnDlzSnZrAQAAAADFU5P3xBNPuABPmTSDdenSxV577TUX8Km55ksvvVTQVQIAAAAAyqom74cffrArrrgiz+evvPJKmzhxYnFtFwAAAACgJIM8DZfQsmXLPJ/Xc6tWrSrKNgAAAAAASjvIU3PMChUq5Pl8UlKS7dmzp7i2CwAAAADKUODQyK755Zdfukya4WzdurW4tgkAAAAAIkIgCrNrFirIGzJkSL7Pa9w8AAAAAEAUBHlZWVkluyUAAAAAgNLrkwcAAAAAiKEgT2PhhZs++ugjW7BgQclupZndc889rjlo8FS3bt3s5wOBgFumfv36lpycbL1797aff/45xzrS09Pt2muvtZo1a1qlSpXs1FNPtZUrV5b4tgMAAABAxDXXvP7668PO37Fjh2vKedJJJ9mbb75pKSkpVlLatWtn48aNy35crly57L8feughGz16tBusXcM53H///Xb88cfbwoULs7fphhtusE8++cTefvttq1Gjht100012yimn2MyZM3OsCwAAAABiviZvy5YtYSfVjk2ZMsWWL19u9957b4lubEJCgqu986datWpl1+I99thjduedd9rgwYOtffv29uqrr7phHxR4yrZt2+zFF1+0Rx55xPr3729HHHGEjRkzxubOnZsjcAQAAAAACwQO3T558fHx1r17dxc8qZasJC1atMg1x2zWrJmde+659vvvv7v5S5YssbVr19qAAQNyjNvXq1cvmzRpknus2rp9+/blWEbrUkDoLwMAAAAAOUThAAKFGkIhP4cffniJ9m876qijXB9ANcVct26da4559NFHu353CvCkTp06OV6jx8uWLXN/a5ny5ctb9erVcy3jvz4vqq3U5EtLS3P/q5lqJGQd1TaoNjMStgXRi3IEyhEiBecjUI4QCeICf4yQF4ickQYKuh3FFuT99ttv1rBhQyspAwcOzP67Q4cO1rNnTzvssMNcs8wePXqEHadPgc+Bxu4ryDKjRo0K2xRVzVUzMjIsEg729u3b3WdRzSpAOQLnI0QzftdAOUIkqLhnj1X8IwdJxubNEXGdrWv+UgnyFFjMnj3bJTEZNGiQlRZlx1Swpyacp512mpunGrl69eplL7N+/frs2j314du7d68LzIJr87SMagTzc/vtt9vw4cNz1OQ1atTIradKlSoWCT+GClS1PZFQ+BCdKEegHCFScD4C5QiRIK5CBfd/5cqVrUpqakRcZytHSYGWK+gKFUCEq/FSZJuZmWknnniiG8KgtKj55C+//GLHHXec66OnIG7s2LEuoYoooPvuu+/swQcfdI+7du1qiYmJbpmzzz7bzVuzZo3NmzfPZebMj/r3aQqlAx0JB1t0bCJpexCdKEegHCFScD4C5QhlLu6P2Ccucq77C7oNBQ7ylL0yHNVktW7d2tq0aWMl6eabb3Y1hY0bN3a1b+qTpxq1IUOGuB8CDY/wwAMPWIsWLdykvytWrGjnn3++e33VqlXt0ksvdTWOGj4hNTXVrVO1gcq2CQAAAAD7RW92zQIHeQqmypKSupx33nm2ceNGN3SC+uFp6IYmTZq450eMGGG7d++2YcOGuSaZStTy1Vdf5Ri379FHH3VVnKrJ07L9+vVz4+oxRh4AAACAWEmvGRdQp7oCWL16tRts/K677srVD01j0KlmTTVjoRkuY5FqEFUzqM8dKX3yNm/e7GonI6EaGdGJcgTKESIF5yNQjhARxt1jNvFR23zh11ateZeIuM4uaBxS4C1VgKeVhluZ3kiZXrQMAAAAAKDsFDjI++KLL+ziiy/O83k99+mnnxbXdgEAAAAASjLIW7JkiUt6kheNkbd06dKibAMAAAAAoLSDvOTk5HyDOD2nZQAAAAAAURDkKVvl66+/nufzr732mh155JHFtV0AAAAAUHYCh8AQCsqcefzxx7skK7fcckt2Fs1169a5wcQ1FIGGLAAAAACAmBsUPRaDvD59+th//vMfu/766914c8qyqUHIlb4zMTHRnnjiCevbt2/Jbi0AAAAAoHiCPLniiivslFNOsXfffdcWL15sGmKvZcuWduaZZ7rEKwAAAACAKArypEGDBnbjjTeWzNYAAAAAAA5K2Q/bDgAAAAAoNgR5AAAAAJBL9GbXJMgDAAAAgDxFX3ZNgjwAAAAAiCFFCvK2bt1qL7zwgt1+++22efNmN2/WrFm2atWq4t4+AAAAAEBJZtf86aefrH///m5Q9KVLl9rll19uqamp9sEHH9iyZcvstddeK+wqAQAAAABlVZM3fPhwGzp0qC1atMgqVKiQPX/gwIE2YcKE4touAAAAAEBpBHnTp093g6KHGz9v7dq1RdkGAAAAAEBZBXmqvUtLS8s1f+HChVarVq3i2i4AAAAAKDuBQ2gIhT//+c9233332b59+9zjuLg4W758ud122212xhlnlMQ2AgAAAEDZiDsEhlD417/+ZRs2bLDatWvb7t27rVevXnb44YdbSkqKjRw5smS2EgAAAABQMtk1q1SpYhMnTrRvvvnGDZuQlZVlXbp0cRk3AQAAAABRFuRp2ISmTZta37593QQAAAAAiOLmms2bN7djjz3Wnn322eyB0AEAAAAAURrkzZgxw3r27Gn333+/1a9f3yViee+99yw9Pb1kthAAAAAASl3g0Any1P/u4Ycfdhk1//e//7kELBo3T/9fcsklJbOVAAAAAFAm4mI/yPNp6IQ+ffrY888/b+PGjXPNOF999dXi3ToAAAAAQOkEeStWrLCHHnrIOnfubN27d7dKlSrZk08+WdTVAQAAAADKIrvmc889Z2+88Yb98MMP1qpVK7vgggvsww8/dBk3AQAAAABRFuT94x//sHPPPdf+/e9/u1o8AAAAAEAUB3lKuKL+eAAAAACAKA3yfvrpJ2vfvr3Fx8fb3Llz8122Y8eOxbVtAAAAAFA2AoHYDvLULHPt2rVumAT9rZq8QNCH9h/r/8zMzJLcXgAAAAAoRXGxGeQtWbLEatWqlf03AAAAACCKg7wmTZpk/71s2TI7+uijLSEh50szMjJs0qRJOZYFAAAAAET4OHkaAH3z5s255m/bts09BwAAAACIoiDP73sXatOmTW5AdAAAAABAFAyhMHjwYPe/AryhQ4daUlJS9nNKtqIMnGrGCQAAAACIgiCvatWq2TV5KSkplpycnP1c+fLlrUePHnb55ZeXzFYCAAAAQFmIi9HsmvLyyy+7/5s2bWo333wzTTMBAAAAIJqDPN/dd99dMlsCAAAAACj9IE/++9//2rvvvmvLly+3vXv35nhu1qxZB79VAAAAAIDSya75+OOP21/+8herXbu2zZ4924488kirUaOG/f777zZw4MCibQUAAAAAoGyCvKeeesqee+45e/LJJ13C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rhAGa926deC2224rs21C5Fi/fr07uX333XfucVZWVqBu3bru5Obbs2dPoGrVqoFnnnnGPd66dau7caAbCL5Vq1YF4uPjA1988YV7rBsKWu+UKVOyl5k8ebKbt2DBglL8hChJ27dvD7Ro0cL9KPXq1Ss7yKMcoSBuvfXWwLHHHpvn85QjFIRuVl5yySU55g0ePDhw4YUXUo5QIBYS5JXmuUfBpl6j1/reeuutQFJSUmDbtm0lfgRprhmlVNWrZi8DBgzIMV+PJ02aVGbbhcixbds2939qaqr7f8mSJbZ27docZUZjvvTq1Su7zKhM7du3L8cyas7Qvn377GUmT57smiUcddRR2cv06NHDzaPsxY6rr77aTj75ZOvfv3+O+ZQjFMTHH39s3bp1s7POOss1Hz/iiCPs+eefpxyhUI499lj7+uuv7ddff3WPf/zxR5s4caKddNJJnI9QJEtK8VpIy+g1eq3vhBNOcE1Bg5uul5SEEn8HlIiNGzdaZmam1alTJ8d8PVbhxaFNN6+GDx/ufiB1ghG/XIQrM8uWLctepnz58la9evVcy/iv1/+6aAuleZS92PD222/brFmzbPr06bmeoxyhIH7//Xd7+umn3XnojjvusGnTprm+KLqYuvjiiylHKJBbb73V3bBs3bq1lStXzl33jBw50s477zzORyiStaV4LaT/Q99H69S6S+N6iSAvyqlDaejFfeg8HHquueYa++mnn9wdz+IoM6HLhFueshcbVqxYYddff7199dVXLqFTXihHyI8SY6gm74EHHnCPVZOnxAYK/BTkUY5QEO+8846NGTPG3nzzTWvXrp3NmTPHJYFSzciQIUMoRyiyuFK6FirL6yWaa0YpZejRXa3QOwHr16/PddcAhxZlg1JTqfHjx1vDhg2z59etW9f9n1+Z0TJqCqyMUfkts27dulzvu2HDBspeDFATEh1vZetNSEhw03fffWePP/64+9svB5Qj5KdevXrWtm3bHPPatGnjMs0J5yMUxC233GK33XabnXvuudahQweXvfDGG290WX8pRyiKuqV4LaRlQt9H61RT0NK4VifIi1Kq6tVF2NixY3PM1+Ojjz66zLYLZUd3hlSD9/7779s333zjUk4H02OdcILLjE5iuoD3y4zKVGJiYo5l1qxZY/PmzctepmfPnq75jJpf+aZOnermUfaiX79+/Wzu3Lnujrk/qUbmggsucH8rhTnlCAdyzDHH5BrCRf2qmjRp4v7mfISC2LVrl8XH57xU1Q1ufwgFyhEKq1kpXgtpGb1Gr/WplYyares9SlyJp3ZBiQ+h8OKLL7osPzfccIMbQmHp0qXs9UPQVVdd5bJDffvtt4E1a9ZkT7t27cpeRtmktMz777/v0gafd955YdMGN2zY0KU7V8rfvn37hk0brLT6yiSlqUOHDgyhEMOCs2sK5QgFGX4jISEhMHLkyMCiRYsCb7zxRqBixYqBMWPGUI5QYEOGDHFp7P0hFPTbVbNmzcCIESMoR8g3O/Ts2bPdpFBn9OjR7m9/iLHS+g3zh1Do16+fW4fWpXUyhAIK5D//+Y8bi6h8+fKBLl26ZKfLx6FHJ7Jwk8bOC04dfPfdd7v0wUrh+6c//cmd4ILt3r3bnYBSU1MDycnJ7oS1fPnyHMts2rQpcMEFF7hxZjTp7y1btpTaZ0XZBnmUIxTEJ5984i5wdK7R8D7PPfdcjucpRzgQXXTr3KMxXytUqBBo3ry5G/8sPT2dcoQ8jR8/Puz1kG4alPa5R4GlhgLROrQurVNDNpSGOP1T8vWFAAAAAIDSQJ88AAAAAIghBHkAAAAAEEMI8gAAAAAghhDkAQAAAEAMIcgDAAAAgBhCkAcAAAAAMYQgDwAAAABiCEEeAAAAAMQQgjwAAAAAiCEEeQAA5GPo0KEWFxeXa1q8eDH7DQAQkRLKegMAAIh0J554or388ss55tWqVSvH471791r58uVLecsAAMiNmjwAAA4gKSnJ6tatm2Pq16+fXXPNNTZ8+HCrWbOmHX/88W7Z0aNHW4cOHaxSpUrWqFEjGzZsmO3YsSN7Xa+88opVq1bNPv30U2vVqpVVrFjRzjzzTNu5c6e9+uqr1rRpU6tevbpde+21lpmZmSOIHDFihDVo0MCt+6ijjrJvv/2WYwcAyIWaPAAAikhB2VVXXWU//PCDBQIBNy8+Pt4ef/xxF6wtWbLEBXkKzp566qns1+3atcst8/bbb9v27dtt8ODBblLw9/nnn9vvv/9uZ5xxhh177LF2zjnnuNf85S9/saVLl7rX1K9f3z744ANXwzh37lxr0aIFxxAAkC0u4P8qAQCAsH3yxowZYxUqVMieN3DgQNuwYYNt27bNZs+ene9ee++991wguHHjxuyaPAVs6tN32GGHuXlXXnmlvf7667Zu3TqrXLmym6cAToHiM888Y7/99psL5FauXOkCPF///v3tyCOPtAceeIAjBwDIRk0eAAAH0KdPH3v66aezH6u55HnnnWfdunXLtez48eNd0DV//nxLS0uzjIwM27Nnj2uOqdeJmmj6AZ7UqVPHBXR+gOfPW79+vft71qxZrqawZcuWOd4rPT3datSowfEDAORAkAcAwAEoODv88MPDzg+2bNkyO+mkk1zN3D/+8Q9LTU21iRMn2qWXXmr79u3LXi4xMTHH65StM9y8rKws97f+L1eunM2cOdP9Hyw4MAQAgCAPAIBiNGPGDFdz98gjj7i+efLuu+8e9HqPOOIIl4RFNXvHHXdcMWwpACCWkV0TAIBioiaYCvKeeOIJlzxF/ezUp+5gqZnmBRdcYBdffLG9//77LqHL9OnT7cEHH3SJWgAACEaQBwBAMencubMbQkHBV/v27e2NN96wUaNGFcu6NU6fgrybbrrJDb1w6qmn2tSpU90wDQAABCO7JgAAAADEEGryAAAAACCGEOQBAAAAQAwhyAMAAACAGEKQBwAAAAAxhCAPAAAAAGIIQR4AAAAAxBCCPAAAAACIIQR5AAAAABBDCPIAAAAAIIYQ5AEAAABADCHIAwAAAIAYQpAHAAAAABY7/h+OpBRFZXdhnQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "first half: -263 second half: +1,787\n" + ] + } + ], + "source": [ + "cnt_cpu = np.bincount(fr_cpu, minlength=N)\n", + "cnt_cuda = np.bincount(fr_cuda, minlength=N)\n", + "cum = np.cumsum(cnt_cuda.astype(np.int64) - cnt_cpu.astype(np.int64))\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 3.6))\n", + "ax.plot(cum, color='C1', linewidth=1.2)\n", + "ax.axhline(0, color='gray', linewidth=0.5)\n", + "ax.set_xlabel('Frame')\n", + "ax.set_ylabel('cumulative CUDA - CPU')\n", + "ax.set_title(f'Cluster-count difference accumulating over {N:,} frames '\n", + " f'(final {cum[-1]:+,})')\n", + "ax.grid(alpha=0.25)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "half = N // 2\n", + "print(f'first half: {cum[half - 1]:+,} second half: {cum[-1] - cum[half - 1]:+,}')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}