mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2026-07-02 21:06:05 +02:00
- Stencil arithmetic and shared memory use float (COMPUTE_TYPE alias). - Pedestal accumulation stays double to preserve variance accuracy. Notes: - On RTX 4090, FP32 throughput is ~64× higher than FP64, so moving stencil math to float improves performance. - Using float also avoids shared memory bank conflicts: stride-18 maps to distinct banks for 32-bit values, but caused conflicts with 64-bit.
424 lines
68 KiB
Plaintext
424 lines
68 KiB
Plaintext
{
|
||
"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": [
|
||
"def make_hist(clusters):\n",
|
||
" h = bh.Histogram(bh.axis.Regular(100, -2, 4000))\n",
|
||
" h.fill(clusters.sum())\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: 40000\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 = 40000\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": "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": 4,
|
||
"id": "6ee7c469-5a23-421a-9bb4-a76e8f57a0c1",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"SERIAL = True"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"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": 6,
|
||
"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": 7,
|
||
"id": "1546f405-1bf6-4073-ab35-8134be695a6c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Pedestal (1000 frames): 0.480s\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": 8,
|
||
"id": "4573be3d-5ba8-4e18-bab0-c874f2b7dcb2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Reading 40000 frames: 1.922s (20815 FPS, 6352.256 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": 9,
|
||
"id": "fbb14fda-2852-4b73-ba2c-9952abac1d99",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"CPU clustering: 73.207s (546 FPS, 55449596 clusters, 1386.24/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": 10,
|
||
"id": "4b8df93b-9a1b-41a5-9fed-9cda295fb523",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# # Warmup: first kernel launch pays CUDA context + pedestal H2D upload cost\n",
|
||
"# cf_cuda.find_clusters(data[0])\n",
|
||
"# _ = cf_cuda.steal_clusters(realloc_same_capacity=False)\n",
|
||
"\n",
|
||
"# t0 = time.perf_counter()\n",
|
||
"# for frame in data:\n",
|
||
"# cf_cuda.find_clusters(frame)\n",
|
||
"# t_cuda = time.perf_counter() - t0\n",
|
||
"# clusters_cuda = cf_cuda.steal_clusters(realloc_same_capacity=False)\n",
|
||
"# n_clusters_cuda = clusters_cuda.size\n",
|
||
"# 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'Speedup (CPU / CUDA): {t_cpu / t_cuda:.2f}×')\n",
|
||
"\n",
|
||
"# hist_cuda = make_hist(clusters_cuda)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"id": "1fda99ee-db54-40c1-8e5b-51168a33fb96",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"CUDA clustering: 2.385s (16774 FPS, 55081141 clusters, 1377.03/frame)\n",
|
||
"Speedup (CPU / CUDA): 30.70×\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"BATCH_SIZE = 2000\n",
|
||
"\n",
|
||
"# warmup\n",
|
||
"_ = cf_cuda.find_clusters_batched(data[0:BATCH_SIZE], first_frame=0)\n",
|
||
"\n",
|
||
"t0 = time.perf_counter()\n",
|
||
"clusters_cuda_per_frame = []\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",
|
||
"\n",
|
||
"n_clusters_cuda = sum(cv.size for cv in clusters_cuda_per_frame)\n",
|
||
"\n",
|
||
"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'Speedup (CPU / CUDA): {t_cpu / t_cuda:.2f}×')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"id": "b7df7b9d-6873-46c4-b6bc-7e4238a5bdf7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"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\n",
|
||
"\n",
|
||
"hist_cuda = make_hist_from_batch(clusters_cuda_per_frame)"
|
||
]
|
||
},
|
||
{
|
||
"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": 13,
|
||
"id": "d3a850df-7df0-485b-971d-381cfdc6be81",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Cluster count diff: 368455 (0.66%)\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": 14,
|
||
"id": "9adeea2f-9309-4c0a-905b-7d1203ba1f4e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png":
|
||
"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005avHixQsEnn3ziXtemTh/SGgcffLB7rmAG/4yuCQAAgJC2aNEi7brrri6Iuf322zV8+HA3KMX777+v888/Xz/99FP9sTfddJPOPPNMlZaWugDmnHPOcfc79thj271c9913n0499dQmE2Xb81s5Go+Y2JC3nF6dO3f2+xynn366e73Lli3zu9/q4a9//at23313ff755z77HnzwQV111VV69NFHtcMOO+irr75yz5mZmekCZK+0tDTNmzfP577Jycn1/z/jjDP0/fff65lnnlFubq6effZZ7bvvvvrhhx+Ul5fnjvnll1+02267ufKOGzfOBXoW9DV8nEgZcbOmpsaNuNkSOy/+7//+TyeccEKHla0hMnkAAAAIaeedd57LjFiQctRRR2ngwIEaMmSILr30Un355Zc+x1oGySaSHjBggG655RZtscUWAWnyV1hYqKlTp7rMVWOWRbQyeBcLeBrzltO7+AvyLEizzNPll1/ebDmuvfZabbnlljrmmGOa7LOg7Oyzz3YBrmVALaNoQdi///1vn+OsbhuWxRavsrIyvfrqqy64tqapVq+WEe3fv78rn9c111yj0aNHu+OsqaI930EHHeSmAWjJE0884d5Ly87avHAXXHBBqzNxs2bNctvsRwDz22+/ueA1MzNTnTp1co87ZcoUt3+vvfZyx9g+u88pp5xSH7RZma28FoxvvfXWeuWVV+qfY9q0aS6Itx8Utt9+e1fOTz/9VN999517THsfLUjebrvt9M0339Tfz84LO19//fVXBQNBHgAgOq1dIi2fVbfY/03l+qbbAATV6tWr9d5777mMnV24N+aviWJDlknalKHom/PZZ5+5YM6aQjb23HPPqVu3bi7IsADNmjs2ZoGWzVdozUf/+c9/qrKy0me/Zcks22fNKxtnCr0++ugjvfzyy65Jpj8VFRVNMmkWyFjw0bBOLOtpTTGtWag1Nfz222/r99k8cZa58vc4VgfG+p698847Lvjef//9XWD3l7/8ZYPBtQWJ9r6eddZZmjNnjt58800XRLaVPZa95unTp7vHszq24Nma9lqgaixjuWLFCt177731QfKTTz7pyjJ37lxdcsklLvtmwV1DV1xxhW677TaXnbTM6vHHH+/qy5qtzpgxwzW3TUhIqD/e6tPqwQLCYKC5JgAg+lgA98COUtX6uts7nCEddJdU+LP0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A1wQY4/97rvvuse6+OKLdfDBB6u6utrnWJu3+YsvvtAFF1ywwSnAvO6//34dffTR6tKli9/n9S42B3RjZ555ps8xDz/8sM9+C7wsILE6sMX+b4GeV0lJifbff3/16dNH//vf//TZZ58pLS3NbauqqmthUFNTo5SUFF100UXad1//081UVFQoOztb11xzjbbeeusWX+9vv/2myy+/XLvvvnuTfevWrXP3tzqJdFV/1G9LTj31VD344IPuPQgUgjwAQESKqS5X35iVbt2h1q2WFvynbg2gXZx33nku0/LVV1/pqKOO0sCBAzVkyBBdeumlrc6sNWbZwB49eigvL0/bbruta1L5xhtvuICv8VzNTz75pAv+zj33XL344osuaGmJZQNffvllHXrooc0+r3fJyspqckxqaqrPMZat8/rxxx9dYPfYY49p5513dsujjz6qt99+2zUBNLa2bN9NN93ksnBWVzfccIPy8/NdwGqsqaAFGhZQ2nM01yTy3nvv1UknneRThsYsWDn++OM1btw4l2ltzJon3nLLLTriiCO0Md58801tv/32Sk5OVrdu3Zq9v79M3Nq1a922Tz75xN22+rAyWtBqwe0WW2zh3lfTv39/t95mm23cfRpmfZ9++mlttdVWrgxbbrmlJkyY0OR5X3rpJXcfO+bZZ591Aa9lLi2DavVs9d8wmLdge9WqVZo2rek0PO2FIA8AEJGS1s7XtKRL3bpDFS+Rvnqkbg1gk61evdoFNZax89eHyZojtpe9997bZZxee+21+m0ej8cFAyeccIK7yLcA0y7qN9RU04IMC1Aas6AjJyfHPY4FWBZ4Nfbcc8+5oMaCA8uOWWbOyzKKFnD95S9/qd9mTT5t2+eff+5uW2Bn97esY2VlpcrKytz/7fH69u2r9mbBpAVPp59+ers9pjV1taDuoIMO0rfffuua5fqrz9a67rrr9MMPP7gg3gJlC3Ctjoz9eGCmTp3qMqfe99+C5+uvv94FqHafW2+91T2OBX4N/eMf/3AZUTvGAjg7Vy0Las1ULev873//W507/9mSIzEx0Z1nn376qQKFgVcAAACinc0raUtDKRlSZj+pqlwq+KnRHTxS9tC6/xbOlyobZbYy+kipWdK6Qqloqe++pC5S181bXbQFCxa4QMsCrI5gz2NBmpdd+K9fv95dvBsL9ixgsiZ3zbEMj/Xf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EUcc0er7XH311TrwwANdk0trkzpp0iR98skneu+99wJaVgAAAAAIB0EfeCUrK8v1rWut33//XSeeeKJWrFjh+vXZxOgW4O23334BLScAAAAAhIOgB3mff/65Nt9881Yf//jjjwe0PAAAAAAQzgIe5M2ePdvvdhsRxgZMufXWW3XLLbcEuhgAAAAAEBUCHuSNGDHCjQTkb6YGG47U+uSdc845gS4GAAAAAESFgAd5NlWCP9afLiMjI9BPDwAAAABRJeBBXt++fd3apjiorq5Wp06dAv2UAAAAABC1Aj7rdmFhoQ466CB17tzZzcq+yy676Ndffw300wIAAABAVAp4kHfVVVdpxowZGjdunO644w4X9J199tmBfloAAAAAiEoBb675/vvv64knntDo0aPdbVsPHTpUVVVVSkhICPTTAwAAAEBUCXgmb/ny5dpmm23qb2+55ZZKTEx02wEAAAAAYRbk2dQJ8fG+CUO7XVtbG+inBgAAAICoE98RQd4+++zjE+itX79ehxxyiMvoec2cOTPQRQEAAACAiBfwIO+GG25osu2www4L9NMCAAAAQFQKSpAHAAAAAAjTPnnl5eV68803VVJS0mRfcXGx22cTpQMAAAAAwiDIe/jhh3XvvfeqS5cuTfbZ5Oj33XefHn300UAXAwAAAACiQsCDvOeee05jx45tdr/tmzhxYqCLAQAAAABRIeBB3vz587X11ls3u3/48OHuGAAAAABAGAR51dXVKigoaHa/7bNjAAAAAABhEOQNGTJEU6dObXb/hx9+6I4BAAAAAIRBkHfaaafp5ptv1ttvv91k31tvvaVbbrnFHQMAAAAACIN58s466yxNnz5dhx56qLbccksNGjRIMTEx+vHHH/Xzzz/rmGOOcccAAAAAAMIgk2eeffZZTZo0SQMHDnSB3U8//eSCvRdeeMEtAAAAAIAwyeR5WcbOFgAAAABAmGfyAAAAAAAdgyAPAAAAACIIQR4AAAAARBCCPAAAAACIIAEP8nJzc3Xuuefq3XffVWVlZaCfDgAAAACiWsCDvOeff16pqam66KKL1K1bNx199NF65plntHr16kA/NQAAAABEnYAHeXvuuafuuusuzZ8/X1988YW23XZbPfDAA+rZs6fbd8899+iXX34JdDEAAAAAICp0aJ+8IUOG6KqrrtKXX36pxYsX6/jjj9dHH32kYcOGaejQoXrnnXc2+Bi33XabdthhB3Xp0kU5OTkaM2aM5s2b1yHlBwAAAIBQF7SBV7p3764zzzxTb731lgoLC3XzzTcrKSlpg/ebNm2azj//fBcofvjhh6qurtaoUaO0bt26Dik3AAAAAISyeIUA67N3+OGHt+rY9957z+f2k08+6TJ6M2bM0B577BGgEgIAAABAeAiJIG9TFBUVuXVWVpbf/RUVFW7xKi4uduva2lq3hAori8fjCakyRTrqnDqPBpzn1Hk04DynzqMB5zl1blobK4R1kGdB0aWXXqrddtvN9elrrg/fuHHjmmwvKChQeXm5QukNs4DVXlNsLNMXUueRifOcOo8GnOfUeTTgPKfOo0FtCF6fl5SURH6Qd8EFF2j27Nn67LPPmj3GBnqxQLBhJq93797Kzs5WWlqaQukkiomJceUKlZMo0lHn1Hk04DynzqMB5zl1Hg04z6lzk5ycrJAP8uxktRE1H3/8cb3++usbdd8LL7xQb775pqZPn65evXo1e5wN5uJvQBcLpEItmLIgLxTLFcmoc+o8GnCeU+fRgPOcOo8GnOfUeWvjhKBEEzZnnmXYLDg75phjNuq+li61DN5rr73mpl/o379/wMoJAAAAAOGmwzJ5ZWVleumll1zWzqY/qKmpcROhn3baaercuXOrH8emT3j++ef1xhtvuLnyVq5c6banp6crJSUlgK8AAAAAAEJfwDN5X331lc466yz16NFD999/v4488kgtWbLEpRr33XffjQrwzIMPPug6QO65557q2bNn/fLiiy8G7DUAAAAAQLgIeCZvl112cf3nLNgbNGjQJj+eNdcEAAAAAAQpyNt7771dE838/HydeOKJ2n///V2nUQAAAABAGDbX/OCDDzR37lyXxTv33HNd08qLL77Y7SPYAwAAAID21SGja9q8dNdff70WLlyoZ555xmX14uPjddhhh+nqq6/WzJkzO6IYAAAAABDxOnwKhf32208vvPCCli9f7vrqvfvuu9phhx06uhgAAAAAEJGCNut2ZmamC/K+/fZbff3118EqBgAAAABElA6ZJ6+2tlZPPfWUm8B80aJFri+eTWJ+1FFHucFYtt12244oBgAAAABEvIBn8mzKg0MPPVRnnHGGli1bpmHDhmnIkCH67bffdMopp+jwww8PdBEAAAAAIGoEPJNnGbzp06frP//5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cY63vyVLlujiiy/WBx984AY4bE4knus01wwiG6EnLi6uSYRvzawa/6KAtrERkCzYsyac3lE2W6pvO8aa0doISbwnG6+96tiOsUxsYwUFBXw2WqFnz54uyLPznjpvOxtJ7c0339THH3+sXr161W/nPO/4OveH83zTWXZiwIAB7ochG3Vw66231r333ss5HoQ694dzfNPNmDHDXV/Y6PXx8fFusaD6vvvuc//3XndE4nULQV6QP+h20n344Yc+2+22NTHEprMhb3/88Uf3RWl99OxD2LC+7UNrH3Zvfdv7kZCQ4HPMihUr9P333/OetEJ71bFlYK1PzldffVV/zP/+9z+3jc/Ghq1atcr9emnnPXW+8eyXV8smvfbaa/roo4/cec15Htw694fzPDDvg/3d5Lu84+vcH87xTbfPPvu4JrKWPfUuFmAff/zx7v+bbbZZ5F63BGW4FzSZQuHxxx93I/OMHTvWTaGwaNEiaqkNLrvsMs8nn3zi+fXXX90IRzZ0rQ2L661PGz3JRkx67bXX3DC5f/3rX/0Ok9urVy/P1KlT3TC5e++9N1MoNBqh6ttvv3WLfYXcfffd7v/eaT/aq45tKGIb5thGp7Jl2LBhUTuFQkt1bvvsvLfhmhcuXOj5+OOPPTvvvLMb6pk6b5tzzz3XncP2XdJwWor169fXH8N53rF1znne/q666irP9OnT3ffG7Nmz3XD+NlrgBx984PZzjndsnXOOd5yRDUbXjORznSAvBDzwwAOevn37ehITEz3bbrutz5DR2DjeuU0scM7NzfUcccQRnrlz59bvt6FybZoFGy43KSnJs8cee7gPdENlZWWeCy64wJOVleVJSUlxH9DFixfzVvzBgggLNBovNvRze9axzfN2/PHHuyDdFvv/mjVrovJ9aKnO7SJ41KhRnuzsbHfe29xitr1xfVLnreevrm2xedy8OM87ts45z9vfaaedVn/tYd8f++yzT32AZzjHO7bOOceDF+TVRuh1S4z9E5wcIgAAAACgvdEnDwAAAAAiCEEeAAAAAEQQgjwAAAAAiCAEeQAAAAAQQQjyAAAAACCCEOQBAAAAQAQhyAMAAACACEKQBwAAAAARhCAPAIAOsueeeyomJsYts2bNCnq9n3LKKfXlef3114NdHABAOyHIAwCEpIYBSMPlgAMOUDg788wztWLFCg0dOrTJvlGjRikuLk5ffvlli/WRkJCg7t27a7/99tMTTzyh2tpan2ObC9rGjh3rAk2ve++915UFABBZCPIAACHLAjoLQhouL7zwQkCfs7KyMqCPn5qaqh49eig+Pt5n++LFi/XFF1/oggsu0OOPP95ifSxatEjvvvuu9tprL1188cU6+OCDVV1dvdFlSU9Pd2UBAEQWgjwAQMhKSkpyQUjDJTMz0ydj9dhjj+nwww93wdMWW2yhN9980+cxfvjhB40ePVqdO3d22a8TTzxRhYWF9fsts2WB1aWXXqpu3bq57Jixx7HHS0lJccHU008/7Z5v7dq1WrdundLS0vTKK6/4PNdbb72lTp06qaSkZKNf65NPPumCtXPPPVcvvviie47m6iMvL0/bbrutrr76ar3xxhsu4Hvqqac2+jkBAJGJIA8AENbGjRunY445RrNnz3bB3PHHH6/Vq1e7fZb1GjlypEaMGKFvvvlG7733nn7//Xd3fEMWwFlm7b///a8efvhhlyk76qijNGbMGNd37uyzz9Y111xTf7wFcscdd5wLzBqy23a/Ll26bNRr8Hg87r4nnHCCttxySw0cOFAvvfRSq+679957a+utt9Zrr722Uc8JAIhcBHkAgJD19ttvuwxcw+Xmm29u0lftr3/9qwYMGKBbb73VZcC++uort+/BBx90GS/bbsHTNtts4/qwffzxx/r555/rH8Pue/vtt2vQoEHuuIceesj9/4477nBrC+jseRo644wz9P7772v58uXutmUHrbynnXbaRr/OqVOnav369dp///3dbQv2mmuy6Y+V2QJTAAAMQR4AIGRZM0nLpDVczj//fJ9jhg8f7pNhsyxafn6+uz1jxgwX0DUMEi0gMr/88kv9/bbffnufx5w3b5522GEHn2077rhjk9tDhgzRxIkT3e1nnnlGffr00R577LHRr9MCumOPPba+n54Frf/73/9cOVqbCbSmpAAAGN9e3wAAhBAL2izL1hIbabIhC3a8o03a+pBDDtG///3vJvfr2bOnz/NsKGiybY1ZNu/+++/XlVde6ZpbnnrqqRsdbFnTUhsJs6qqymUevWpqalzW0V/ZG/vxxx/Vv3//+tsW6BYVFTU5zvoT2mArAIDIRiYPABCxrKnm3Llz1a9fPxcsNlwaB3YNWbbv66+/9tlmffoas2aVNirmfffd557n5JNP3ugyPvfcc+rVq5e+++47n4zl+PHjXV/BDY2a+dFHH2nOnDk68sgjWyy/BamW2bTmpwCAyEaQBwAIWRUVFVq5cqXP0nBkzA2xpp2WKbPmj9ZP79dff9UHH3zg+s1Zpqw5NtDKTz/9pH/84x+u754NguIdvbJhps5G+jziiCP097//3c1xZ8FaW5pq2mAtNm9ew8XKaJm3d955p0l9LFu2TDNnznR9DQ877DA3KudJJ51Uf9zll1/uHteyjFZ+CyBtBFFrotq4uSsAIPIQ5AEAQpaNhmnNKhsuu+22W6vvn5ub60bMtIDOBjWx4MnmlbMmi7Gxzf8JtKaPNj2CjVhpff6sGaV3dE2bxqCh008/3c2t15YBVyyzZgFYwyxcwyaXFjg2HIDFWx+WmbQ586y/oWURbRoFm0Tdy0YPtaDUMoHWt9AexwK8Tz/9VH379t3ocgIAwkuMx18nAwAA4OOf//ynG3VzyZIlTZpbWuBoo2wmJia2WGs2J59N52BNMUOJZScnT57spowAAIQ/MnkAAPgxYcIE16/NmnjayJk2nULDPnc25YH1w7vttttc884NBXgNH9dG+bR+dMF2zjnnuLIAACILmTwAAPy45JJL9OKLL7o+fTY1woknnqirrrqqfpqDG2+80WX3bMoEay7ZmmDJ+tKVlZW5/9tjtjYwDBSbaqK4uNj935qBtjQYDQAgfBDkAQAAAEAEobkmAAAAAEQQgjwAAAAAiCAEeQAAAAAQQQjyAAAAACCCEOQBAAAAQAQhyAMAAACACEKQBwAAAAARhCAPAAAAACIIQR4AAAAAKHL8P9DOGB9YbtdyAAAAAElFTkSuQmCC",
|
||
"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
|
||
}
|