diff --git a/tests/opencl/j_stat/graphics/graph.png b/tests/opencl/j_stat/graphics/graph.png deleted file mode 100644 index 1545b8a69..000000000 Binary files a/tests/opencl/j_stat/graphics/graph.png and /dev/null differ diff --git a/tests/opencl/j_stat/statistic.ipynb b/tests/opencl/j_stat/statistic.ipynb index b8403f2dd..81d952c55 100644 --- a/tests/opencl/j_stat/statistic.ipynb +++ b/tests/opencl/j_stat/statistic.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -148,15 +148,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/4 [00:00 37\u001b[0m data_frames\u001b[38;5;241m.\u001b[39mappend(\u001b[43mperf\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_file\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 38\u001b[0m data_frame \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat(data_frames, ignore_index\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 40\u001b[0m \u001b[38;5;66;03m# draw graph based on the recived statistic\u001b[39;00m\n", - "Cell \u001b[0;32mIn[7], line 10\u001b[0m, in \u001b[0;36mperf\u001b[0;34m(run_params, path_to_output_file)\u001b[0m\n\u001b[1;32m 7\u001b[0m subprocess\u001b[38;5;241m.\u001b[39mcall(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcommand\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m > \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpath_to_output_file\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, shell\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# collect statistic \u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mpath_to_output_file\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m file:\n\u001b[1;32m 11\u001b[0m lines \u001b[38;5;241m=\u001b[39m file\u001b[38;5;241m.\u001b[39mreadlines()\n\u001b[1;32m 12\u001b[0m error_message \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", - "File \u001b[0;32m~/.pyenv/versions/3.11.9/lib/python3.11/site-packages/IPython/core/interactiveshell.py:324\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 319\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 322\u001b[0m )\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mio_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mIsADirectoryError\u001b[0m: [Errno 21] Is a directory: '/home/jblab/ivan_khromov/release/vortex/tests/opencl/j_stat'" + "name": "stderr", + "output_type": "stream", + "text": [ + " 25%|██▌ | 1/4 [00:00<00:02, 1.12it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cd /home/jblab/ivan_khromov/release/vortex/build && ./ci/blackbox.sh --warps=4 --cores=4 --threads=4 --driver=simx --app=kernel2 --args=\"-N16 -M16 -K16\"\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 50%|█████ | 2/4 [00:01<00:01, 1.14it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cd /home/jblab/ivan_khromov/release/vortex/build && ./ci/blackbox.sh --warps=4 --cores=4 --threads=4 --driver=simx --app=kernel3 --args=\"-N16 -M16 -K16\"\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 75%|███████▌ | 3/4 [00:02<00:00, 1.13it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cd /home/jblab/ivan_khromov/release/vortex/build && ./ci/blackbox.sh --warps=4 --cores=4 --threads=4 --driver=simx --app=kernel4 --args=\"-N16 -M16 -K16\"\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 4/4 [00:03<00:00, 1.14it/s]\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [