mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2026-11-14 16:43:53 +01:00
Optimize CUDA cluster finder transfers and kernel hot path
- Use per-stream pinned host staging buffers for truly async CUDA transfers. - Avoid reserving full device capacity per result frame. - Reduce kernel work by delaying cluster payload construction. - Use squared comparisons and removing per-pixel sqrtf() ops.
This commit is contained in:
1 parent
34e69a8065
commit
88e0e8d678
3 files changed
+241
-91
No files matched your search
@@ -27,13 +27,14 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Helpers\n",
|
||||
"N_BINS = 200\n",
|
||||
"def make_hist(clusters):\n",
|
||||
" h = bh.Histogram(bh.axis.Regular(100, -2, 4000))\n",
|
||||
" h = bh.Histogram(bh.axis.Regular(N_BINS, -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",
|
||||
" h = bh.Histogram(bh.axis.Regular(N_BINS, -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",
|
||||
@@ -62,7 +63,7 @@
|
||||
"\n",
|
||||
"n_frames_pd = 1000\n",
|
||||
"N = 88999\n",
|
||||
"cluster_size = (3, 3)\n",
|
||||
"cluster_size = (9, 9)\n",
|
||||
"image_size = (f.rows, f.cols)\n",
|
||||
"capacity = 100_000 #3_000_000\n",
|
||||
"\n",
|
||||
@@ -115,7 +116,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"SERIAL = False"
|
||||
"SERIAL = True"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -128,7 +129,7 @@
|
||||
"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",
|
||||
" cf_cpu = ClusterFinderMT(image_size, cluster_size, capacity=capacity, n_threads=48)\n",
|
||||
" sink = ClusterCollector(cf_cpu)"
|
||||
]
|
||||
},
|
||||
@@ -139,8 +140,8 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"N_STREAMS = 10\n",
|
||||
"cf_cuda = ClusterFinderCUDA(image_size, cluster_size, capacity=capacity, n_streams=N_STREAMS)"
|
||||
"N_STREAMS = 5\n",
|
||||
"cf_cuda = ClusterFinderCUDA(image_size, cluster_size, n_sigma=7, capacity=capacity, n_streams=N_STREAMS)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -153,7 +154,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Pedestal (1000 frames): 3.212s\n"
|
||||
"Pedestal (1000 frames): 0.501s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -184,7 +185,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Reading 88999 frames: 4.269s (20846 FPS, 6361.676 GB/s)\n"
|
||||
"Reading 88999 frames: 30.101s (2957 FPS, 902.311 GB/s)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -215,7 +216,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU clustering: 14.399s (6181 FPS, 120930205 clusters, 1358.78/frame)\n"
|
||||
"CPU clustering: 835.664s (107 FPS, 90799856 clusters, 1020.23/frame)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -236,7 +237,7 @@
|
||||
" \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",
|
||||
" hist_cpu = bh.Histogram(bh.axis.Regular(N_BINS, -2, 4000))\n",
|
||||
" n_clusters_cpu = 0\n",
|
||||
" for cv in clusters_cpu:\n",
|
||||
" hist_cpu.fill(cv.sum())\n",
|
||||
@@ -256,7 +257,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"execution_count": 11,
|
||||
"id": "4f94cf35-5796-463d-bed8-f44a02d91fc6",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -266,13 +267,13 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"execution_count": 18,
|
||||
"id": "50848f8c-2e66-45b8-b6d5-ca80f368e6ba",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"if(BATCHED):\n",
|
||||
" BATCH_SIZE = 10000\n",
|
||||
" BATCH_SIZE = 2000\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",
|
||||
@@ -300,20 +301,68 @@
|
||||
"\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"
|
||||
" n_clusters_cuda = 0\n",
|
||||
" hist_cuda = None\n",
|
||||
"\n",
|
||||
" # steal the clusters as we go rather than at the end of the dataset \n",
|
||||
" # which might trigger an std::bad_alloc...\n",
|
||||
" for idx, frame in enumerate(data):\n",
|
||||
" cf_cuda.find_clusters(frame)\n",
|
||||
" clusters_frame = cf_cuda.steal_clusters(realloc_same_capacity=True)\n",
|
||||
"\n",
|
||||
" n_clusters_cuda += clusters_frame.size\n",
|
||||
"\n",
|
||||
" h = make_hist(clusters_frame)\n",
|
||||
" hist_cuda = h if hist_cuda is None else hist_cuda + h\n",
|
||||
" \n",
|
||||
" t_cuda = time.perf_counter() - t0\n",
|
||||
" kernel_ms = cf_cuda.avg_kernel_time_ms()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"execution_count": 19,
|
||||
"id": "502d0d3b-6b1e-4cc9-91df-9d998bd849b5",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(9, 9)"
|
||||
]
|
||||
},
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"cluster_size"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "2e3e4b9c-7f23-4fb7-bc3e-fa3d766d51fc",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU clustering: 835.664s (107 FPS, 90799856 clusters, 1020.23/frame)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"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": "code",
|
||||
"execution_count": 24,
|
||||
"id": "4b8df93b-9a1b-41a5-9fed-9cda295fb523",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -321,10 +370,10 @@
|
||||
"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"
|
||||
"CUDA clustering: 8.812s (10100 FPS, 89995010 clusters, 1011.19/frame)\n",
|
||||
" Kernel only: 0.039 ms/frame\n",
|
||||
" PCIe + overhead: 0.060 ms/frame\n",
|
||||
"Speedup (CPU / CUDA): 94.83×\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -348,7 +397,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"execution_count": 21,
|
||||
"id": "d3a850df-7df0-485b-971d-381cfdc6be81",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -356,7 +405,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Cluster count diff: 3382175 (2.80%)\n"
|
||||
"Cluster count diff: 804846 (0.89%)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -376,16 +425,36 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"execution_count": 22,
|
||||
"id": "aff8db7e-8332-4228-857f-a9875cf940d3",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"200 201\n",
|
||||
"200 201\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print(len(hist_cpu.values()), len(hist_cpu.axes[0].edges))\n",
|
||||
"print(len(hist_cuda.values()), len(hist_cuda.axes[0].edges))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"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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 truncated
|
||||
"iVBORw0KGgoAAAANSUhEUgAAAxYAAAJOCAYAAAAqFJGJAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAsURJREFUeJzs3Qd4U1UbB/B/96K7dFL2HoIMGaKAIChLXDgRFNkiCDgQB/Cp+AkCDoa4UJThgk8BWYogAoIM2UuBstvSRelu7/e8J9yQdNGdpPn/niekTU7uvTm5Kee95z3nOGiapoGIiIiIiKgUHEvzYiIiIiIiIgYWRERERERUJthjQUREREREpcbAgoiIiIiISo2BBRERERERlRoDCyIiIiIiKjUGFkREREREVGoMLIiIiIiIqNQYWBARERERUakxsCCiMrFv3z48+eSTqFWrFtzd3VGlShW0bNkS77zzDuLi4ozlOnfurG7lZe7cuVi4cGG5bZ9sR2U8F37//Xf0798fERERcHV1ha+vLzp06IB58+bh6tWrxnI1a9aEg4OD8Sbfx7Zt2+LLL780256U6927d777+uuvv9RrraUOi/o3prjvafLkyWZ15enpiWrVqqFHjx744IMPcOXKlQKPKTMzE6Ghoep13333XRm/YyLbw8CCiErt448/RqtWrbBz5048//zzWLNmDZYvX44HH3wQ8+fPx+DBgyuslitjY5JKprKdC6+//jpuv/12nDt3Dv/5z3+wfv16LF26FF27dlWN41deecWs/K233opt27apm9SDNH4HDhyoghBbUxF/Y2SbUldyP2PGDFSvXh0vvPACmjRpgr///jvf16xcuRKXLl1SP3/66aelPgYiW+ds6QMgItsm/xGPGDECd955J1asWAE3Nzfjc/LY+PHj1X/UtkzTNKSlpcHDwwO2IDU11WaO1VrIlWdpeDs7W+d/i99++y2mTp2qGtDSyJZj1d19992qASzfRVN+fn5o166d8fdu3bqhRo0amDlzpvrO2oqK+hsjgUtQUJDx94cffhjPPPMMOnXqhL59++LYsWNm+9aDCek5kjLr1q3D2bNnVW8Hkb1ijwURlcpbb72lGjkLFizI85+ukP905T/lgvz222/q9XJv6tSpU3lSFv7991/1n314eLjaV0hIiLpau3fvXmMKxMGDB7Fp0yZjWoM8pktKSsKECRNUKoUcl6STjB071iyFRMjrpEEhV0IbNWqk9vXFF18UWg/Lli1D+/bt4eXlpVI0JI1iz549ZmUGDRqknjtx4gR69uypfo6MjFQNo/T0dLOyGRkZeOONN9CwYUO1/6pVq6o0kJiYGLNyetrHDz/8gJtvvlmliEyZMkU9J3XRvXt3ldohrx81ahRWrVplVt9y5Vsa02fOnMnznp566ikEBgaqoKogN/pMTI9RrjDfdNNN6hhr166N999/P8/2ivoZ5eTkqDSVFi1aqCBKb0T/+OOPNzwX9HNu0aJFqu5lH3Ls8rnoaTG56Vf85bzM/b7kqrXUvRyHnC/yu/4a+V3OiVtuuUWl4ZSUBBX+/v6qzvI7Pm9vb/VZF0bqqEGDBjh9+jTKilzJl+PJ72r9zz//rJ7TPxM5d4cOHarOef2cll6VDRs2lOvfmNJo3rw5Jk2ahKioKPUdN3X+/HkV0PTp00f1osg5WZl6yIhKwjovzRCRTcjOzsavv/6qrvRJY6G8SWNc9ik51ZKmEBsbi61btyIhIUE9Lw3XBx54QOWdSxqM0BsiKSkp6qqiXFF8+eWXVQNXGp6vvfYa9u/frxo3pg02uTIq+ezyvORQBwcHF9rwkTQUafjLvQQF06dPx2233YYdO3agcePGZlfGpREkV56lUbt582bVuJdjln0JaaDcc889av9yJVpy6KUxKKkwMj5FGqimPRK7d+/G4cOH1b6lQS4N2QsXLqj3Kz9L6osc/5IlS1TAZGrYsGF488038dFHH6lARic565JmI+UlECjpZ6KTQEMCBGm4S31+/fXXGDNmjKorCSSK+xlJkPbVV1+pepRGtzQupR70hn9h54Ju4sSJKhiUANLR0bHQz7iwhrVsRxqfsi8J6u677z712C+//GJsFL/44osqCDl58qTxs5Njlc9L0pMKa5DKZ3ngwAE89NBDKkgsKTn35DySBn1ZNrwlqPr888/zpCPJe5I6lXNEDBgwQH1Gcr7Vr19fnSPy++XLl63mb0x+5Psq30P5rj7xxBNm70+OTwJwvTfos88+U+dCfsEfkV3QiIhK6OLFi5r8GXn44YeL/JpOnTqpm27jxo1qG3Jv6uTJk+rxzz//XP0eGxurfp89e3ah22/SpInZ9nXTpk3THB0dtZ07d5o9/t1336ntrl692viY/O7r66vFxcXd8P1ERUVpzs7O2ujRo80ev3LlihYaGqr179/f+NjAgQPVtr/55huzsj179tQaNGhg/H3JkiWq3Pfff29WTo5dHp87d67xsRo1amhOTk7a0aNHzco+//zzmoODg3bw4EGzx3v06JGnvuW4goODtfT0dONj//3vf1V9yedQkKJ+JnKMcix79+41e/zOO+/UfHx8tKtXrxbrM9q8ebP6fdKkSSU6F/Rz7vbbb8/z3Ouvv66ey03OQ3nctD7kfXl4eGhnz541PibvUcqFhYUZ35dYsWKFevzHH380Pnbq1Cn12T311FOFvo/t27er17700ktaUcmxyXmVmZmpbnLc+vkn54ZpuV69euW7Df1807+DBXn//fdVOdNzUL47bm5u2vjx442PValSRRs7dqxW3n9jivue9M88JiYm39ekpqaq5++++27jYzk5OVrdunW1iIgILSsry2w7v/zySzHeIVHlwlQoIrIJAQEBqFOnjuoJkBxxSTOSK/tFJekpTZs2VakzWVlZxpukLOWXinXHHXeo1JMbWbt2rdqOXMk03a5c5Zer77m3K/uS1AlTcmXeND1FjlXSVqSc6Tbl2OVqf+5tyuvlCrApSQGS92vaWyIeeeSRPO9Beg6io6NVHr+QepVejl69epmlkpXmM5EBsHJ129Sjjz6qUp/kqnVxPiNJsRGS2lUa999/P0pLjlVSqXSS+iSkZ8m0d0F/3PRzlivc8v7Ka9Dv6tWr4eLiom7SM/LNN99g9OjRZj1TZeGxxx5TvUGmvS7SOybpfdKLp5N0MCkj+9++fbvqQbEFhmsNyPP9ktQ56W1ycnJSj8l7lfNUei2I7BUDCyIqMRnoKI0nSe8ob/IftqSWSCNT0m5kmklJ6Xj22WcLnQ5SJzO3yHSVekNLv0luujQcJIXHVFhYWJGOS58Rpk2bNnm2LTnZubcr9ZU7tUgaZabjGGSbkiYi6T25t3nx4sUiHaukl8h4h9zye0xSWSRta86cOcYGvqTp5E6bKs1nIgFRbvpjeipMUT8jydWXxlx+2yyOon7GhZHgypR8ZoU9Xth4lYJIipko7vesY8eOahYlSZ07dOiQOqdkjIZ+LELG10g6T34k6BHyGRRG3qukC8lUtvq2JICQQEICSp18H6Qh/sknn6gUNHmdBORyTpfl35iyeE+m9GBQxhHp9GDw3nvvVfUqN0mFkzr//vvv86QCEtkLjrEgohKTxp0M1JUryCWdDUVvZOcevJy78axf4dX/Q5cZWuQKrOTsS56+5MkXRhooktte0NVE09lgRFFzpPXXyRz2cnxlQbYpg6YLmulGGto3OlZ5vR70mCqoESfBgEzdKb0HH374oeoBkRl3bqSon0l++9Ufk2MtzmckwYs0HOX1pQkO8qs30/PRdExGfudjRZH32KxZMzXrkIxDKeo4C2notm7dutAyEmjK9LX50R/PLxjNTa7WS4+XTIErgZAENLmntZXPb/bs2eomg6FlUPdLL72kessKOtdL8jemrN6TTh98rq+/k5iYqIIH/YJCfhYvXoyRI0cWeR9ElQV7LIioVGSQqlxNHjJkiGpM5ibpDj/99FOBr9dTbeRKdX7/mRdEGr4yWFkaXHoqjZDGoEy3mpsMnP3nn39UI1YaW7lvhaX8FEau1ssVUtl2ftu9UcMuP3KschVfGs/5bU9m9rkRScOSAb9ypdqUDMjOj1x5lQahDCiXQdLSKCruANSCPhMhg7BzrwUgjS8JkqSnozifkUyvKm60HkNB50JhCjofCzuHK8Krr76K+Ph4FQDml5qTnJysAo/ikkHH+Z0nQoJEfWG9G5EZqSQlTAZxy00CtPzS7nRyrkmPmASvuc+V0v6NKav3JOSclQH4cl7IwoT6eSvnlUy6sHHjxjw3CaCYDkX2ij0WRFQqktIgDTxpiMrMLTLfvKQ/yH/2knMvU0RK3nzucQU6SWeRhsC0adPUmAa5Ai7pNTJ9qilp6ElDRK6q16tXT6VzyGwx8rhc9dRJo1Yaz5J2IVOaSgNHHpMZieQqoyww9txzz6lxCTIeQK6cSoNMGtRFbWyYkgaHzEokM8HI1Kt33XWXeh/SWyAzQsmsTPr0r0Ul07fKrEkym46Mf5CUEkndkCu20nCRGaMkECiMvF9p3EgjXI5PrtBKg+jIkSPqeZkFKfeVYRmzILMXyTHLrEs3UtTPRE8jkXQZ6c2QK/Ayo5Nc3f7vf/9rvAJf1M9I0rZkhiHJ1Zd6loBEggg532RbMo6gsHOhMFLnkqKjzzYlQaOk9eQ3HW9pSYqNjFGR9KAbjbOQOpbgQhqz8hnK8clrpQfjzz//VLN6yaxRN5pyNjc5vySFSa7Gy0xcUj8SwEidSS+cjJ3J3UOWHzl/JK1Jyvv4+KiZsaTHRCdX+bt06aLG1cgUyrJN6dWQngopW5Z/Y0r6nnbt2qWOWbYrU8nK3yGZklhmtpLARU8hk89KvuMym1l+M6bp9SBBSe5xRUSVnqVHjxNR5SCz4cisM9WrV9dcXV01Ly8v7eabb9Zee+01LTo6usBZocSFCxe0Bx54QAsICFCzMT3++OPaX3/9ZTZ7y6VLl7Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 900x600 with 2 Axes>"
|
||||
"<Figure size 800x600 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -394,7 +463,7 @@
|
||||
],
|
||||
"source": [
|
||||
"fig, (ax_spec, ax_ratio) = plt.subplots(\n",
|
||||
" 2, 1, figsize=(9, 6), sharex=True,\n",
|
||||
" 2, 1, figsize=(8, 6), sharex=True,\n",
|
||||
" gridspec_kw={'height_ratios': [3, 1]}\n",
|
||||
")\n",
|
||||
"\n",
|
||||
@@ -407,7 +476,7 @@
|
||||
"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",
|
||||
"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",
|
||||
@@ -416,7 +485,7 @@
|
||||
"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.set_ylim(0.5, 2.0)\n",
|
||||
"ax_ratio.grid(alpha=0.3)\n",
|
||||
"\n",
|
||||
"plt.tight_layout()\n",
|
||||
@@ -426,7 +495,7 @@
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a6ca4581-bb29-4c74-a34a-bd427551a39b",
|
||||
"id": "e33bdd78-8f0c-4690-9153-3f9eaffd4afa",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
|
||||
Reference in new issue
Block a user