Files
aare/python/tests/ClusterFinderCUDA.ipynb
T
kferjaoui 34e69a8065
Build on RHEL8 / build (push) Successful in 3m13s
Build on RHEL9 / build (push) Successful in 3m37s
Run tests using data on local RHEL8 / build (push) Successful in 3m51s
Add per-frame kernel timing via CUDA events
2026-04-28 13:09:25 +02:00

457 lines
69 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "789d5aab-0c75-4ed3-94bf-e66172f6737c",
"metadata": {},
"outputs": [],
"source": [
"import sys; sys.path.append('/home/ferjao_k/aare/build')\n",
"\n",
"from pathlib import Path\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
"import numpy as np\n",
"import boost_histogram as bh\n",
"import time\n",
"\n",
"from aare import File, ClusterFinder, ClusterFinderMT, ClusterCollector, ClusterFinderCUDA"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3f6089d6-2245-4aca-aad3-2417c16afae2",
"metadata": {},
"outputs": [],
"source": [
"# Helpers\n",
"def make_hist(clusters):\n",
" h = bh.Histogram(bh.axis.Regular(100, -2, 4000))\n",
" h.fill(clusters.sum())\n",
" return h\n",
"\n",
"def make_hist_from_batch(result_list):\n",
" h = bh.Histogram(bh.axis.Regular(100, -2, 4000))\n",
" energies = [np.asarray(cv.sum()).ravel() for cv in result_list if cv.size > 0]\n",
" if energies:\n",
" h.fill(np.concatenate(energies))\n",
" return h"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "415b09d4-d0d0-4166-8601-9d84302617bd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Image size: (400, 400)\n",
"Pedestal frames: 1000\n",
"Data frames: 88999\n"
]
}
],
"source": [
"base = Path('/mnt/sls_det_storage/matterhorn_data/aare_test_data/')\n",
"f = File(base / 'Moench03new/cu_half_speed_master_4.json')\n",
"\n",
"n_frames_pd = 1000\n",
"N = 88999\n",
"cluster_size = (3, 3)\n",
"image_size = (f.rows, f.cols)\n",
"capacity = 100_000 #3_000_000\n",
"\n",
"print(f'Image size: {image_size}')\n",
"print(f'Pedestal frames: {n_frames_pd}')\n",
"print(f'Data frames: {N}')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "3e49d862-45f4-4d37-a078-947e6b9ec9e3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"500000"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f.total_frames"
]
},
{
"cell_type": "markdown",
"id": "5531b79d-12ad-4de6-84b7-0224b10d13c3",
"metadata": {},
"source": [
"## Pedestal (both finders trained on identical frames)"
]
},
{
"cell_type": "markdown",
"id": "e33b421f-969a-41d6-8aa6-5bd859a88fb3",
"metadata": {},
"source": [
"- Modify the boolean `SERIAL` to choose between the sequential CPU version (ClusterFinder) and its multi-threaded homologue (ClusterFinderMT)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "6ee7c469-5a23-421a-9bb4-a76e8f57a0c1",
"metadata": {},
"outputs": [],
"source": [
"SERIAL = False"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9d8f69bf-27f6-48c8-b2da-4157d67e6b04",
"metadata": {},
"outputs": [],
"source": [
"if(SERIAL):\n",
" cf_cpu = ClusterFinder(image_size, cluster_size, capacity=capacity)\n",
"else:\n",
" cf_cpu = ClusterFinderMT(image_size, cluster_size, capacity=capacity, n_threads=24)\n",
" sink = ClusterCollector(cf_cpu)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "cbdcb805-708b-4205-bda9-2aa163d0e81f",
"metadata": {},
"outputs": [],
"source": [
"N_STREAMS = 10\n",
"cf_cuda = ClusterFinderCUDA(image_size, cluster_size, capacity=capacity, n_streams=N_STREAMS)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1546f405-1bf6-4073-ab35-8134be695a6c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Pedestal (1000 frames): 3.212s\n"
]
}
],
"source": [
"t0 = time.perf_counter()\n",
"for _ in range(n_frames_pd):\n",
" img = f.read_frame()\n",
" cf_cpu.push_pedestal_frame(img.copy())\n",
" cf_cuda.push_pedestal_frame(img.copy())\n",
"print(f'Pedestal ({n_frames_pd} frames): {time.perf_counter() - t0:.3f}s')"
]
},
{
"cell_type": "markdown",
"id": "5df035f0-7a27-4d5a-8f8d-c94e745bcd1a",
"metadata": {},
"source": [
"## Read all data frames into memory (I/O out of the timing loop)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "4573be3d-5ba8-4e18-bab0-c874f2b7dcb2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reading 88999 frames: 4.269s (20846 FPS, 6361.676 GB/s)\n"
]
}
],
"source": [
"f.seek(n_frames_pd)\n",
"t0 = time.perf_counter()\n",
"data = f.read_n(N)\n",
"t_io = time.perf_counter() - t0\n",
"print(f'Reading {N} frames: {t_io:.3f}s ({N/t_io:.0f} FPS, '\n",
" f'{f.bytes_per_frame * N / 1024**2 / t_io:.3f} GB/s)')"
]
},
{
"cell_type": "markdown",
"id": "c1e9362e-dcc2-41af-bfa1-c62d0968477e",
"metadata": {},
"source": [
"## CPU clustering"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "fbb14fda-2852-4b73-ba2c-9952abac1d99",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU clustering: 14.399s (6181 FPS, 120930205 clusters, 1358.78/frame)\n"
]
}
],
"source": [
"t0 = time.perf_counter()\n",
"for frame in data:\n",
" cf_cpu.find_clusters(frame)\n",
"t_cpu = time.perf_counter() - t0\n",
"\n",
"if(SERIAL):\n",
" clusters_cpu = cf_cpu.steal_clusters(realloc_same_capacity=False)\n",
" n_clusters_cpu = clusters_cpu.size\n",
" \n",
" hist_cpu = make_hist(clusters_cpu)\n",
"else:\n",
" cf_cpu.stop()\n",
" sink.stop()\n",
" \n",
" clusters_cpu = sink.steal_clusters() #cf_cpu.steal_clusters(realloc_same_capacity=False)\n",
" \n",
" hist_cpu = bh.Histogram(bh.axis.Regular(100, -2, 4000))\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 clustering: {t_cpu:.3f}s ({N/t_cpu:.0f} FPS, '\n",
" f'{n_clusters_cpu} clusters, {n_clusters_cpu/N:.2f}/frame)')"
]
},
{
"cell_type": "markdown",
"id": "8cfd7091-8020-49ff-b033-28bf773983d8",
"metadata": {},
"source": [
"## CUDA clustering"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "4f94cf35-5796-463d-bed8-f44a02d91fc6",
"metadata": {},
"outputs": [],
"source": [
"BATCHED = True"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "50848f8c-2e66-45b8-b6d5-ca80f368e6ba",
"metadata": {},
"outputs": [],
"source": [
"if(BATCHED):\n",
" BATCH_SIZE = 10000\n",
"\n",
" # Warmup: first kernel launch pays CUDA context + pedestal H2D upload cost\n",
" _ = cf_cuda.find_clusters_batched(data[0:BATCH_SIZE], first_frame=0)\n",
" \n",
" clusters_cuda_per_frame = []\n",
"\n",
" cf_cuda.reset_timers()\n",
" t0 = time.perf_counter()\n",
" for start in range(0, N, BATCH_SIZE):\n",
" stop = min(start + BATCH_SIZE, N)\n",
" clusters_cuda_per_frame.extend(\n",
" cf_cuda.find_clusters_batched(data[start:stop], first_frame=start)\n",
" )\n",
" t_cuda = time.perf_counter() - t0\n",
" kernel_ms = cf_cuda.avg_kernel_time_ms()\n",
" \n",
" n_clusters_cuda = sum(cv.size for cv in clusters_cuda_per_frame)\n",
"\n",
" hist_cuda = make_hist_from_batch(clusters_cuda_per_frame)\n",
" \n",
"else:\n",
" # Warmup\n",
" cf_cuda.find_clusters(data[0])\n",
" _ = cf_cuda.steal_clusters(realloc_same_capacity=False)\n",
"\n",
" cf_cuda.reset_timers()\n",
" t0 = time.perf_counter()\n",
" for frame in data:\n",
" cf_cuda.find_clusters(frame)\n",
" t_cuda = time.perf_counter() - t0\n",
" kernel_ms = cf_cuda.avg_kernel_time_ms()\n",
"\n",
" clusters_cuda = cf_cuda.steal_clusters(realloc_same_capacity=False)\n",
" n_clusters_cuda = clusters_cuda.size\n",
" \n",
" hist_cuda = make_hist(clusters_cuda)\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "4b8df93b-9a1b-41a5-9fed-9cda295fb523",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CUDA clustering: 5.111s (17413 FPS, 124312496 clusters, 1396.79/frame)\n",
" Kernel only: 0.021 ms/frame\n",
" PCIe + overhead: 0.036 ms/frame\n",
"Speedup (CPU / CUDA): 2.82×\n"
]
}
],
"source": [
"print(f'CUDA clustering: {t_cuda:.3f}s ({N/t_cuda:.0f} FPS, '\n",
" f'{n_clusters_cuda} clusters, {n_clusters_cuda/N:.2f}/frame)')\n",
"print(f' Kernel only: {kernel_ms:.3f} ms/frame')\n",
"print(f' PCIe + overhead: {t_cuda*1000/N - kernel_ms:.3f} ms/frame')\n",
"print(f'Speedup (CPU / CUDA): {t_cpu / t_cuda:.2f}×')"
]
},
{
"cell_type": "markdown",
"id": "b966cce1-0f73-4565-a707-1aec2a69f75e",
"metadata": {},
"source": [
"## Agreement check: \n",
"- Cluster counts should match closely.\n",
"- However, as the CUDA CF updates the pedestal once per frame rather than per-pixel, a small divergence after the first few frames is expected."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "d3a850df-7df0-485b-971d-381cfdc6be81",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cluster count diff: 3382175 (2.80%)\n"
]
}
],
"source": [
"diff = abs(n_clusters_cpu - n_clusters_cuda)\n",
"rel = diff / max(n_clusters_cpu, 1)\n",
"print(f'Cluster count diff: {diff} ({rel:.2%})')"
]
},
{
"cell_type": "markdown",
"id": "81638ad3-6112-4bd7-a93a-f4d97f1f94cf",
"metadata": {},
"source": [
"## Plots"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "9adeea2f-9309-4c0a-905b-7d1203ba1f4e",
"metadata": {},
"outputs": [
{
"data": {
"image/png":
"iVBORw0KGgoAAAANSUhEUgAAA3kAAAJOCAYAAAAK+M50AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAnDZJREFUeJzt3Qd4VFX6x/FfekJJqKGEKk061lVXRRQLNuzgWrA3LIhrwY6rYlkV/dsbtlXUVdS1iwV1lRVRBBEFFKST0FIgPfN/3jNOzCSTkIQk076f5xkuuffOzJl3Tib3ndNiPB6PRwAAAACAiBAb7AIAAAAAABoOSR4AAAAARBCSPAAAAACIICR5AAAAABBBSPIAAAAAIIKQ5AEAAABABCHJAwAAAIAIQpIHAAAAABGEJA8AAAAAIghJHoCwNH/+fJ155pnq2bOnkpOT1aJFC+2666666667tGnTpvLzDjjgAHdrLA8//LCeeeaZRnt8hI9IrAtffPGFTjrpJGVkZCgxMVFpaWnaZ5999Mgjj2jr1q3l5/Xo0UMxMTHlN/t9/Mtf/qLnnnvO7/HsvCOPPDLgc3377bfuvqESw9p+xtT1Nd18881+sWrWrJm6dOmiQw89VP/3f/+n3NzcastUXFysjh07uvv9+9//buBXDCCSkOQBCDtPPPGEdtttN82ZM0dXXnml3n//fc2YMUMnnniiHn30UZ199tlNVpZIvLBH/URaXbjpppu0//77a/Xq1frHP/6hjz76SNOnT9dBBx3kEpXrr7/e7/y//vWv+vrrr93N4mCJyLhx41xCGG6a4jPGHtNiZdt//vOf6tatm6666ioNHDhQP/zwQ8D7vP3221q/fr37/1NPPbXDZQAQueKDXQAAqAu7KLrwwgt18MEH64033lBSUlL5Mdt3xRVXuIumcObxeFRQUKCUlBSFg/z8/LApa6iwFhlLguLjQ/PP8KuvvqpbbrnFJTOW8FhZfUaNGuWSEftdrKhVq1baa6+9yn8eOXKkunfvrnvvvdf9zoaLpvqMsSSyXbt25T+PHTtWF198sYYPH66jjz5aixcv9ntuX2JnLap2zocffqhVq1a5VkAAqIyWPABh5fbbb3cXnI8//niVCyBjF0B2gVSdzz77zN3fthUtX768Sreq3377zV14de7c2T1Xhw4dXCvGvHnzyrtpLVy4ULNmzSrvemX7fHJycvT3v//ddfeyclmXtwkTJvh1czN2P7u4sxaC/v37u+d69tlna4zDyy+/rL333lvNmzd33cisq9f333/vd84ZZ5zhji1dulSHH364+3/Xrl3dRWphYaHfuUVFRbr11lu18847u+dv376966qWlZXld56va9rrr7+uXXbZxXVjmzx5sjtmsTjkkENc9zO7//jx4/XOO+/4xdtahCyxWblyZZXXdNZZZ6lt27Yuwa3O9t6TimW0lpchQ4a4Mu6000564IEHqjxebd+jsrIy15Vu2LBhLqH1JTRvvfXWduuCr849//zzLvb2HFZ2e198Xfcq87WEWb2s/LqsNcdib+Ww+mI/++5jP1ud2HPPPV1XwfqyBK9169YuZoHK17JlS/de18Ri1K9fP/3+++9qKNbCZeUJ1Ir13nvvuWO+98Tq7nnnnefqvK9OW2vjzJkzG/UzZkcMHTpU1113nVasWOF+xytas2aNSy6POuoo17podTKSWo4BNKzQ/AoRAAIoLS3VJ5984r4Btwu3xmaJkT2njcGxrlQbNmzQV199pS1btrjjlkSccMIJbpySddUzvovCbdu2uW/b7Zv2a6+91iUblgTceOONWrBggbvQrHjxbC0GNv7JjtuYm/T09BovQq2rnCVhtrUE7e6779Z+++2nb775RgMGDPBrMbILUmuRsQTj888/d4mWldmey9jF4ujRo93zWwuNjbmyC3PrrmfjGS1ZqNhS991332nRokXuuS05sqRi7dq17vXa/617npX/pZdecslrReeff75uu+02PfbYYy6p9LExTtYV0M63pKy+74mPJX2WrFkSZfH817/+pcsuu8zFypK6ur5HljC/8MILLo6WANmFvsXBl4TVVBd8Jk2a5BJzS+ZjY2NrfI9rSnLscSwRsOeyBPu4445z+z7++OPyBOXqq692CeGyZcvK3zsrq71f1oWypuTA3ssff/xRY8aMcQl7fVnds3pkyVVDJkGW4E6bNq1Kl0l7TRZTqyPmtNNOc++R1be+ffu6OmI/b9y4MWQ+YwKx31f7PbTf1dNPP93v9Vn57MsQXyvp008/7epCoEQcQJTzAECYWLduncc+tsaOHVvr+wwfPtzdfD799FP3GLataNmyZW7/tGnT3M8bNmxwP0+dOrXGxx84cKDf4/tMmTLFExsb65kzZ47f/n//+9/ucd99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hxzigggAAID68Y3BsxY8AOHN93tsv9f1TfIYMAYAABAh6EoJhL+G+D0myQMAAACACEKSBwAAAASw//7768UXXyQ2QbB8+XLXojVv3rywi/+DDz6oo48+OqhlIMkDAABA0GcGveSSS7TTTju55bJsHeSjjjpKH3/8cfk5PXr0cBf9drMxS4MGDdJjjz1Wfvzmm2/WsGHDqjy2TUhj9/nss8/qVKa3337blWvs2LHl+x5//HEdcMABbu00e8zKy1VYYnL22WerZ8+ebgKNXr166aabblJRUZHfeTbpoL2+5s2bq127drr00kurnPPKK6+412Pn9O7dW3fffbff8S+//FJ//etf3UQ79lw777yz7rvvviqv47XXXtOAAQNcXG07Y8YMv+NTpkzRHnvsoZYtW7qJPo455hj98ssvfufY/BkW386dO7vnshgsXLjQ7xzb53t/fLeKsQu2Z555xi1N0BTOPfdczZkzx71HwUKSBwAAgKCxxGi33XbTJ598orvuuksLFizQ+++/rxEjRmj8+PF+595yyy1au3at5s+f75KRCy64QC+//HKjlOuBBx7QmWee6bcumU1vf9hhh+naa68NeJ+ff/7ZLQ9myaclQZZ0Pfroo37n20yotjb01q1bXRIwffp0l4hdccUV5ee89957OuWUU9zrs3hYWeyxrIXIx5K/iy++WJ9//rkWLVqk66+/3t0sEfX5+uuvNWbMGJ122mn64Ycf3Pakk07S//73v/JzZs2a5eI8e/ZsffTRR25GSZsY0crnY+/Lvffe657fkhdbw+3ggw9Wbm5uleTG3h/frWISHilKS0vde1wTS6j/9re/6f/+7/+arFxVeMJYdna2TcvptqGktLTUs3btWrcFsY8G1HliH22o88Q+1OTn53t++uknt20MZWVlnqKiIrdtaKNGjfJkZGR48vLyqhzbvHlz+f+7d+/uue+++/yO9+nTxzN27Fj3/5tuuskzdOjQgI9h14uffvpprcuUlZXliYmJ8fz4448Bj9tj2WNWLF917rrrLk/Pnj3Lf3733Xc9sbGxntWrV5fve+mllzxJSUnl17Qnn3yy54QTTvCL/b333uvp0qVLje/Bscce6zn11FPLfz7ppJM8hx12mN85hx56aHnMAsnMzHSvbdasWeXP37FjR88dd9xRfk5BQYEnLS3N8+ijj5bvGz58uOeyyy7z1PWz1B63V69ensTERE/Xrl09t956qzu2bNkyV47vv//e/Txt2jT3nBXNmDHDneMzb948zwEHHOBp0aKFp2XLlp5dd93VM2fOnPL3q+LN6ospLCz0XHnllZ7OnTt7mjVr5tlzzz3d+b64P/300+55//Of/3j69+/viYuL8/z222/unD322MPdx47vs88+nuXLl5eX5bPPPnOvadu2bZ6G/H2ubf5DSx4AIHptWSmtmffnLf+Prle5670/23EAjWbTpk2u1c5akqxlqrLtda9LTk4uXz6iIVkLm3UJ7d+//w4/VnZ2ttq0aePXumZdTa3ro8+hhx6qwsJCzZ071/1s/7fXVpF1k1y1apV+//33gM/z/fff66uvvtLw4cP9nsta5Sqy57Lzaiqv8ZV52bJlrttqxcexlip7nsqP869//ct1Px04cKD+/ve/V2npq2zSpEm68847dcMNN+inn35y4x87dOig+rLWzy5durjWRovlNddco4SEBO2zzz6aOnWq62bra2W08hlrrf3vf//rWlSthfjEE090rbVLlizxa8G1bq1PPvmka6G12FhLssXA7mNxPu+88/xmxdx9991d3fzmm28UDEFfJw8AgMayeku+Nm/1H+fik5C3Wn1ePVCxJfl/7hz7krTz4dK8F6SPb5ESmknjv5FadeVNQljKLyrVr1l5O/w4NibLuqnZml21md69V/sWSknc/vpeS5cudY9t48nqwroUvvDCC64r44UXXqjG6EJqyUbFrpr18euvv7oue/fcc0/5PkuYKicyrVu3VmJiojvmS8Quv/xynXHGGW6s2+LFi3X//fe7Y5ag2PhEH0tqsrKyXExs3Nw555xT43PZz77nqczei4kTJ2rfffd1iajvMXz3q/w4FRNOS7BsLKJ15fzxxx9dAmddRK0LaCCWANprsi6g48aNc/tsDKM9d33ZWMcrr7yyvD716dOn/FhaWpqru1a+iu/PSy+95JJnX9JtyZ998TBt2jTXPdhYsvbwww9r6NCh5V9OWDJ85JFHujKbyl8I2JcW9iWF1aWKiXdTIckDAERsgjfynlnKLy4NeLx3zCo9mthWrY+arLade3t3tv7jwmnYqVJaV+n1c6VtG0nyELYswTvy/5p+8oe3L9lXgzLStnueJRV1WRfs6quvduPOrKXLkiK7oD///PPV0PLz86u0pNXV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Xv29lPmTVLTjU9MDCE02qchTTz3lpuUPZpKH8LNmzRo999xz9UrwGgpJHgAgbFkLniV4U8cMU+90/9a2+Lxeyvt5hdI7/DlLHADUhY1jA+qqurF8TYkkDwAQ9izBqzqDYJrU764glQgAgOBhwBgAIDIV5kkrv/FuAQCIIrTkAQAi08al0lMHe5dO6DysYR87tau053lSQjNpTaXlFRJbSO1YRh0AEDwkeQAA1FXzNlLvg6QVH0hvX+p/rPu+0rj/SGXFUmyCxCzLAIAmRpIHAEANbFH0yjyeMsUWFCq93xFS56FVW/LWzZceH944rYgAAGwHSR4AAAG0bp6olIQ4TXh5XoAB7R4NaxejB84+QF0CJXGVu3ACANCESPIAAGGthbYpecMCKabCEgrxSVJsvNSsrXdbDxmtUjTziuEBF1pfuj5XT3z0vTvWpXXzHSk+AAANjiQPABDWdo1dot4zzvHf2bqndNk86arfduixLdGzW6DumgCi22mnnab+/fvr2muvDXZRolJMTIxmzJihY445RuHk7bff1g033KC5c+cqthHHbLOEAgAgrH1X1kdLj33HO/7Ndzv5pWAXC0AdrFu3Tpdccol22mknJSUlqWvXrjrqqKP08ccf+13Uv/HGG1XuO2HCBB1wwAHlP59xxhnuXLslJCSoQ4cOOvjgg/X000+rrKys2sWr4+LiNHv27FqVd/78+XrnnXdcmX1ef/11HXrooWrXrp177nnz/Lttb9q0yZ3fr18/NWvWTN26ddOll16q7OzsgM9RWFioYcOGuUSg4mNt3LhRhx12mDp37lweq4svvlg5OTnl5xQUFLg4DB48WPHx8QETISuvxaV9+/ZKTU3V3nvvrQ8++KDKObvvvrtatWql5s2bu/I8//zzfueUlJTo+uuvV8+ePZWSkuLew1tuucUv1h6PRzfffLMrs51j79fChQsVKj777DP3nm3ZsqXRn+vII490z/Xiiy826vOQ5AEAwlb8tvU6J/5dlTRL905w4rul9w9uwdIHSJf/5N0CqNHy5cu122676ZNPPtFdd92lBQsW6P3339eIESM0fvz4ekXPkqC1a9e6x37vvffcY1122WXuAtuSkopWrFihr7/+2iVKTz31VK0e/8EHH9SJJ56oli1blu/bunWr/vrXv+qOO+4IeJ81a9a42z//+U/3Gp955hn3Os8+++yA51911VUuKarMkr7Ro0frrbfe0uLFi93jzJw5UxdccEH5OaWlpS6ZsiRy5MiRAR//888/d0neu+++61qVLEaWWH///ffl57Rp00bXXXedi48ltmeeeaa7VUwG77zzTj366KMuJosWLXLv4d13363/+7//Kz/H9t17773unDlz5qhjx47uuXNzcxVJPB5PlfoViMWwYnwaqzBhKzs722MvwbahpLS01LN27Vq3BbGPBtR5Yh8sS+Z94fHclOrdNqH5Kzd5Dr/jLbdF0+LzJrD8/HzPTz/95LaNoayszFNUVOS2DW3UqFGejIwMT15eXpVjmzdvLv+/XfPNmDGjyjmXXXaZZ/jw4eU/jxs3zjN69Ogq53388cfuMZ544gm//TfffLNn7NixnkWLFnlatmwZsByV62CrVq08b7/9dsDjy5Ytc8/z/fffe7bnlVde8SQmJnqKi4v99r/77ruenXfe2bNw4UL3WN98802Nsb///vs9Xbp0CXisungEMmDAAM/kyZNrPGeXXXbxXH/99eU/H3HEEZ6zzjrL75zjjjvOc+qpp7r/W7k7duzoueOOO8qPFxQUeNLS0jyPPvpojc/11FNPuTJZjOwxxo8fH7A+fPrpp+7nivXl+++/d/vs/TDLly/3HHnkke69a9asmXvcd955p/z9qnizmFm5CwsLXbl79uzpSU5O9gwZMsTz6quvlj+H73nff/99z2677eZJSEjwfPLJJ5558+Z5DjjgAE+LFi1cndp11109c+bMKb+flcXu9+uvv9b597m2+Q8teQAANLRNy6RXTvduAVT/q7Jpk2vNshY76w5YmXUTbCgHHnighg4d6rog+liuMG3aNJ166qnaeeed1bdvX73yyis1Po61aFm3PuvGuKOsq6Z1lbQulT7r16/Xueee67pFWrfO7bHWQXtNw4cP36GyWPdKa1mz1rtALFbWffaXX37R/vvvX75/3333dfutVdH88MMP+vLLL3X44Ye7n5ctW+a641qXWB/rZmrl/eqrr6otzyOPPOLqxXnnnedaPq3lsnfv3vV+fePHj3ddYK0F0x7PWiBbtGjhuru+9tpr7hx7bdYCfP/997ufb7zxRtdSamWx7qWXX365qyuzZs2q0uo6ZcoU15I5ZMgQnXLKKerSpYtrtbRW0muuucZ1Hfbp3r270tPT9cUXX6ixMPEKAAAN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WjREuuAL74EnR0qlf3TvTGgmjf+GRA8AaokkDwACWLNuje5/+CF9UDRER8d9pX8k+I8TXlM6WKUJ16t1y8ZdBw+IdMUtMjSy8G49d3Iv9e7c/s8D58z0tuRtWCy9fq60bSNJHgDUEkkeAASwbf1vuiv2QY069N/q2PUyLd16ot/xjgktNLNzv4BjjADUzRq1U0G7wVL7Cguldxrq3Vr3zYtmS617EFYAqCWSPACoQdc2KerdeydJdgPQ5BJSpPT+BB4A6qB2S6YDAAAEw5YV0psXe7cAgFohyQMAAKFr2ybp++e9WwBArdBdE0B0Ky6Qsn6usrssvpm+K+utFvHNglIsINoszcwLuD95Q556N3lpACC8keQBiOolErauWay+rwyvcuyn0T9pQtEtertVr6CUDYgWrZsnKiUhThNenhfw+MCYZXonScrMK1R6k5cOAMITSR6AqLTu958196krdH/xaCXrtirHF748z1142gUogMZjM9TOvGK4W5MykKzFidIsKSe/mCQPAGqJJA9AVMrbskFHx36plodMUPu+ewY8xxI8lkgAGp/9nlX3u/bz1m56uORojbSu02vmedfOy86XStdK8YlSh4G8RQBQCUkegKjmlkjIqLA2F4CQUtK8o+4qGatR2zKlV8d454xLHSLlzJdadpSuWBTsIgJAyCHJAxDZtqyUtm388+c2O0nJqYorzAlmqQDUUb4tln7erD9b8tJSvC15AIAqSPIARK4tK1X24B6KLckv37X8sOeV13W44n/9Qts8SSpNbhPUIgKonbLEFlLnDKmsTIrLlNLTpaxF0j39pVP/TbdNAKiAJA9AxFq/cYMKilN1R/F5WuHxzsv3+xuFytOXaq+Baplwr57v0DPYxQRQX6XFUu4a7xYAUI4kD0D4r3OXkCwV5kkbl/odytlaqIML79PUMcPUO71FlbsysQoQfuvoeTxl2pa9VVkl2UrZyBp6ABAISR6A8B5vN/sRab+J0qbfpKcO9jvc03XFfNAleIOYXAWIiHX0YuVR/9YeLdoco/4xy1lDDwACIMkDED6Tp7TrKyU2+/PnDYvlmf2wfu10uIrSdlLise/43W3F5iLp/T/H4wEI/3X0vC15m9QsrY02LEn6cw29nDVSXqb/nZu1kVp1C07BASCISPIAhDZL6B7aUyre5p1Zr/Mw6b9TpTlPusP5niSd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yCP9jv3nP//Rrbfeqnvvvbcxyog6JHj9+/d3i9RXp1mzZlq0aBGJHgAAABDtSd55552nzz//XEcffbR23nln9evXTzExMS5hWLx4sU466SR3DoLHWvAswXvhhRdcsleZvVennnqqO4/WPAAAACDKkzxjyYMleS+++KJL7Dwej0v2Jk+e7JI8hAZL8HbddddgFwMAAABAqCd5xpI5EjoAAAAACPPZNQEAAAAAoY8kDwAAAACiubsmwp9NwBIIyysAAAAA4Y8kL4pYEmdLKNgMm4GwvAIAAAAQRUle586dNXr0aDe75kEHHaTExMTGLRkanC2bYK14gRZLZ3kFAAAAIMqSPFs2wRY9v/TSS7V+/XodeuihLuE74ogj1KZNm8YtJRo00WONPAAAACBy1XrilQMOOED33HOPlixZoq+//tqtw/bQQw+pU6dO7th9992nX3/9tXFLCwAAAABo+Nk1Bw4cqEmTJmn27NlasWKFTjnlFH3yyScaPHiwBg0apHfeeadWjzNlyhTtscceatmypdLT03XMMcfol19+qU+RAAAAAAANsYRChw4ddO6557qunDbW6x//+IeSkpJqdd9Zs2Zp/PjxLln86KOPVFJSokMOOURbt27lzQEAAACAYM+uabMzHnvssbU+//333/f7edq0aa5Fb+7cudp///0Vrax1NNDkKE2x1EF1yys09vM2VLw8Ho8KCgq0evVqxcTEhGyZAQAAgKhYQiE7O9ttq5vIpbCw0N18cnJy3LasrMzdQoWVxZKN+pRp5cqVrsvrtm3bakymf/zxR3Xt2tVvvz1nbGxsvZ67bdu2atGihU4//fQ6P28wVY6XvX4bL/rdd9+5GIRimSPRjtR5EPtwRJ0n9tGGOk/so01ZiF7b1LY8IZPkWRAnTpyofffd1120VzeGb/LkyVX2Z2VludabUAq+Jay+pKsuVq1apf79+7tYBEpMLKm599573eQ3dm7lY7vttpuLRWZmZp2e17rYfvXVV+WJc12e16Smpqp9+/ZqapXjZTEvKipyS3zYMSuzbWvbhRhNX+exY4h9cBD34CH2xD3aUOeJe0W5ubkKqyTv4osv1vz58/Xll19We45N9mIX8z6WkNiFvSUXlmSE0i+jdRW0ctX1gte6GVp31T59+miXXXapcrxLly6uS6VNdhOItVzZOdbtta5quk9tnvfVV1+tNtGzbpP1bU2zBLO67qvLly/3i5fF3pJ+K8cPP/zgjtk5ycnJDV4uNEydx44h9sFB3IOH2BP3aEOdJ+4VVXdN2yhJnlU+m1Hzqaee0htvvFHn+19yySV666239Pnnn7tkojrWGhOoRcYuKkPtwtKSkjVr1rgL37r4+eefy3+ZA72m7t27a+HChdUmPY01Bq2m57Wk6rjjjtOoUaOqvb8lgZYk1rVsNt5uwIAB2+2+WjG58MXO9tkvwqmnntrg5UJVvriH2u9iNCD2xD3aUOeJe7ShzhN3n9peZ+1Qkmdr5j399NN69tlntXnzZrdAel1Y1y5L8GbMmKHPPvtMPXv2VCSwlqeLLrrIdX+sTz9eSzwsWQu1Bc1rel5LlKpLPO2YJVpffPGF61pZF3ZfS/BeeOGFau9bXWJr+2pTLjtOkgcAAIBIUeckLz8/X6+88oprtbOlD0pLS91C6GeddZabuKMubPmEF198UW+++aZbK2/dunVuf1pamlJSUhSuLGmwCWKee+65Oic1JhxnhKwpAbTXY4lrTS1qNbH77rfffvWKSbASYgAAACDkk7xvvvlGTz75pF5++WX17dvXXbDbGCzrXjly5Mg6J3jmkUcecdsDDjigylIKZ5xxhsLdzjvv7GZ6jHbba1GLxKQXAAAACPkkb5999nFdKy3Z69evX4M8uXXXRHSgRQ0AAAAIsSTvwAMPdF00bWr+0047zY2/q+ukIkAoqm4BeFoQAQAAENFJ3ocffugmFLGulBdeeKEbmzdmzBh3jGQP4Wh7YwWZeRMAAADhqE5zndt6YjfeeKOWLVum559/3rXqxcfHa/To0br22mv13XffNV5JgUYaK2hr6VW+2WyeNqtnfccRAgAAAMFS7yUUDj74YHezpRPsgtiWUrjzzjvdbJtAuGCsIAAAACLNDq9a3Lp1azchy/fff685c+Y0TKkAAAAAAI3fkmcLez/zzDN6/fXXtXz5cjcWzxYwP+GEE9xkLCwXAAAAAABhkuTZcgdHH3203n33XQ0dOlSDBw92+2xMk61pZ4nfG2+80bilBUJk5k3D7JsAAAAI6yTPWvA+//xzffzxxxoxYoTfsU8++UTHHHOMnnvuOZ1++umNUU4gpGbeNMy+CQAAgLBO8l566SU3g2blBM+3ht4111yjf/3rXyR5iKiZN6ubXdOOWQJox+3cprRixYoaZ/2khREAACC61TrJmz9/vu66665qj48aNUoPPPBAQ5ULCIuZN2vqzrkjqkvULMHr37+/W96hOrQwAgAARLdaJ3mbNm1Shw4dqj1ux2w5BSAa1KY7546wx7Zxru3bt6+SVFqCZ8uWWLJXXQvjF198EfA4rXwAAACRr9ZJnq1/ZwufVycuLk4lJSUNVS4grLtz7oisrCwdd9xxOuyww6pNAPfbb7+ALX3bSz5p5QMAAIh8dZpd02bRTEpKCni8sLCwIcsFRPVC6jUlkDW1xtWUfAZzHCEAAABCMMkbN27cds9hZk0g+AlkYyafAAAAiKAkb9q0aY1bEgAAAADADovd8YcAAAAAAIRdS56tjxcTE1Nlf1pamvr166fx48era9euDV0+AA2spmUfmH0TAAAgipK8YcOGBdy/ZcsWvfvuu3rwwQf15ZdfVnsegNBf9oHZNwEAAKIoybvvvvtqPG4teddee61L+ACE37IPzL4JAAAQZUne9px//vk69NBDG+rhADQCZt4EAACIfA2W5KWkpKigoKChHg5AiI3ZY7weAABAlCV5H374ofr27dtQDwcgxMbsMV4PAAAgwpK8t956K+D+7OxszZkzR0899ZSeeeaZhiwbgBAZs8d4PQAAgAhM8o455piA+1u2bKmdd97ZJXgnnnhiQ5YNQBNjzB4AAEAUJXllZWWNWxIAYTtez+PxKDExUenp6U1eJgAAADTSmDwA0TteLzY2Vvvss49eeOEFde/evcnLBwAAgHokeZ988okuvvhizZ49W6mpqVXG5dkF3qOPPqr99tuvtg8JIILW2Lv//vv15ZdfauPGjXV+fGbuBELDihUrqv09DxXWc8Bm8169erViYmL4/ACAHUnypk6dqnPPPbdKgmfS0tLcOnn33nsvSR4QheP12rZt677kOf300+vVtdtaCV9//XW1b98+4HGSQKDxE7WsrCwdd9xx2rZtW0iH23oO7Lbbbpo7d677vNne58f28PkCIKqTvB9++EF33nlntccPOeQQ/fOf/2yocgEII127dtXDDz+soqIi9816fS4sDzvssGrPqekijgs0RJuakrgdTdTsd+3999+vd8LUlC15ycnJLg7b+/zYHj5fAER1krd+/XolJCRU/0Dx8e6PS118/vnnuvvuu923cWvXrtWMGTOqncUTQGizi0KbeMW+Za+rmrqCbi8J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f/21Lr74Yj311FM1xmP58uV67733NGLECF122WU68sgjVVJSUueypKWlubIAAKIDSR4AIOiSkpJcElLx1rp1a78WqyeffFLHHnusS5769Omjt956y+8xfvrpJx1++OFq0aKFa/067bTTtGHDhvLj1rJlidXEiRPVrl071zpm7HHs8VJSUlwy9eyzz7rn27Jli7Zu3arU1FT9+9//9nuu//znP2revLlyc3Pr/FqnTZvmkrULL7xQL7/8snuO6uKRkZGhXXfdVddee63efPNNl/A988wzdX5OAEB0IckDAISFyZMn66STTtL8+fNdMnfKKado06ZN7pi1eg0fPlzDhg3Tt99+q/fff1/r169351dkCZy1rP33v//VY4895lrKTjjhBB1zzDFu7Nz555+v6667rvx8S+TGjh3rErOK7Ge7X8uWLev0Gjwej7vvqaeeqp133ll9+/bVK6+8Uqv7HnjggRo6dKhef/31Oj0nACD6kOQBAILu7bffdi1wFW//+Mc/qoxVO/nkk9W7d2/dfvvtrgXsm2++ccceeeQR1+Jl+y152mWXXdwYtk8//VSLFy8ufwy771133aV+/fq58x599FH3/7vvvtttLaGz56nonHPO0QcffKA1a9a4n6110Mp71lln1fl1zpw5U9u2bdOhhx7qfrZkr7oum4FYmS0xBQCgJiR5AICgs26S1pJW8TZ+/Hi/c4YMGeLXwmataJmZme7nuXPnuoSuYpJoCZH59ddfy++3++67+z3mL7/8oj322MNv35577lnl54EDB+q5555zPz///PPq1q2b9t9//zq/TkvoxowZUz5Oz5LW//3vf64ctW0JtK6kAADUxH80OAAAQWBJm7Wy1cRmmqzIkh3fbJO2Peqoo3TnnXdWuV+nTp38nmd7SZPtq8xa8x588EFdc801rrvlmWeeWedky7qW2kyYxcXFruXRp7S01LU6Bip7ZYsWLVLPnj3Lf7ZENzs7u8p5Np7QJlsBAEQnWvIAAGHPumouXLhQPXr0cMlixVvlxK4ia+2bM2eO3z4b01eZdau0WTEfeOAB9zzjxo2rcxn/9a9/qUuXLvrhhx/8WiynTp3qxgpub9bMTz75RAsWLNDxxx9fY/ktSbWWTet+CgCITiR5AICgKyws1Lp16/xuFWfG3B7r2mktZdb90cbp/fbbb/rwww/duDlrKauOTbTy888/6+qrr3Zj92wSFN/slRVb6mymz+OOO05XXnmlW+POkrX6dNW0yVps3byKNyujtby98847VeKxevVqfffdd26s4ejRo92snKeffnr5eX//+9/d41oro5XfEkibQdS6qFbu7goAiB4keQCAoLPZMK1bZcXbvvvuW+v7d+7c2c2YaQmdTWpiyZOtK2ddFmNjq/9TZ10fbXkEm7HSxvxZN0rf7Jq2jEFFZ599tltbrz4TrljLmiVgFVvhKna5tMSx4gQsvnhYy6StmWfjDa0V0ZZRsEXUfWz2UEtKrSXQxhba41iC98UXX6h79+51LicAIDLEeAINPgAAIErddtttbtbNlStXVuluaYmjzbKZmJhY42PYmny2nIN1xQwl1jo5Y8YMt2QEACBy0ZIHAIhqDz/8sBvXZl08beZMW06h4pg7W/LAxuFNmTLFde/cXoJX8XFtlk8bRxdsF1xwgSsLACA60JIHAIhql19+uV5++WU3ps+WRjjttNM0adKk8mUObr75Zte6Z0smWHfJ2iRLNpYuPz/f/d8es7aJYWOxpSZycnLc/60baE2T0QAAwh9JHgAAAABEELprAgAAAEAEIckDAAAAgAhCkgcAAAAAEYQkDwAAAAAiCEkeAAAAAEQQkjwAAAAAiCAkeQAAAAAQQUjyAAAAACCCkOQBAAAAgCLH/wPGoNJHURQyqAAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 900x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (ax_spec, ax_ratio) = plt.subplots(\n",
" 2, 1, figsize=(9, 6), sharex=True,\n",
" gridspec_kw={'height_ratios': [3, 1]}\n",
")\n",
"\n",
"edges = hist_cpu.axes[0].edges\n",
"cpu_vals = hist_cpu.values()\n",
"cuda_vals = hist_cuda.values()\n",
"\n",
"ax_spec.stairs(cpu_vals, edges, label=f'CPU ({n_clusters_cpu} clusters)')\n",
"ax_spec.stairs(cuda_vals, edges, label=f'CUDA ({n_clusters_cuda} clusters)', linestyle='--')\n",
"ax_spec.set_ylabel('Counts')\n",
"ax_spec.set_title('Cluster energy spectrum: CPU vs CUDA')\n",
"ax_spec.legend()\n",
"ax_spec.grid(alpha=0.3)\n",
"\n",
"with np.errstate(divide='ignore', invalid='ignore'):\n",
" ratio = np.where(cpu_vals > 0, cuda_vals / cpu_vals, np.nan)\n",
"\n",
"ax_ratio.stairs(ratio, edges, color='k')\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.5, 3.5)\n",
"ax_ratio.grid(alpha=0.3)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a6ca4581-bb29-4c74-a34a-bd427551a39b",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}