{ "cells": [ { "cell_type": "markdown", "id": "f6ff5b25-4eeb-4532-a1bb-ad6a01eb1fe1", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "# Параллельное программирование\n", "\n", "Цель - повышение производительности, эффективное использование вычислительных ресурсов.\n", "\n", "* Последовательные вычисления - имеется единственная инструкция выполняемая в данный момент времени.\n", "* Параллельные вычисления - несколько инструкций выполняются одновременно.\n", "\n", "Типы задач в которых распараллеливание вычислений может помочь:\n", "* Вычислительно-сложные (CPU-bound)\n", "* С задержками на ввод-вывод (IO-bound, большие задержки и/или большие объемы данных)\n", "\n", "## Критический путь\n", "\n", "При распараллеливании вычислительно-сложные задачи имеют ограничение на увеличение производительности определяемое т.н. критическим путем." ] }, { "cell_type": "code", "execution_count": 1, "id": "59dbcc3e-a50e-4e11-b247-8056c6d1bc4f", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' graph my_graph { rankdir=\"LR\";\n", " a [color=\"red\", style=\"solid\"]; b1; b2; b3 [color=\"red\", style=\"solid\"]; b4; c [color=\"red\", style=\"solid\"];\n", " d1 [color=\"red\", style=\"solid\"]; d2; d3; e [color=\"red\", style=\"solid\"]; a -- b1 -- c; a -- b2 -- c; a -- b3 -- c;\n", " a -- b4 -- c; c -- d1 -- e; c -- d2 -- e; c -- d3 -- e; } '''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "markdown", "id": "01fa8184-4a15-4277-b758-26fa1672b644", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "Путь `a - b3 - c - d1 - e` является критическим и определяет наименьшее возможное время выполнения. Добавление узлов для параллельного вычисления `b1 - b4` и `d1 - d3` не даст сокращения общей продолжительности вычислений.\n", "\n", "\n", "## Виды параллелизма с прикладной точки зрения\n", "\n", "| Вид параллелизма | Число ядер | Число узлов | Оперативная память | Примечание |\n", "| -------- | ---------- | ------- | ------- | ------- |\n", "| Параллелизм на уровне данных | 1 | 1 | - | SIMD, происходит незаметно для нас на уровне процессора/компилятора |\n", "| Кооперативная многозадачность | 1 | 1 | Общая | Корутины/async-await, только для IO-bound задач |\n", "| Специализированные сопроцессоры | N | 1 | Изолированная | Вычисления на видеокартах |\n", "| Потоки | N | 1 | Общая | |\n", "| Процессы | N | 1 | Изолированная | |\n", "| Однородные вычислительные кластеры | N | N | Изолированная | Вычислительные кластеры |\n", "| Гетерагенные вычислительные кластеры | N | N | Изолированная | Распределенные вычисления |\n", "\n", "\n", "### Параллелизм на уровне данных\n", "\n", "На примере сложения чисел `А1`, `A2` и `B1`, `B2`. `C1` и `C2` - результаты сложения:" ] }, { "cell_type": "code", "execution_count": 2, "id": "42793df4-6f8c-4714-804c-9b076e9262c5", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\";\n", " a [shape=box, label=\"Прочитать А1\"];\n", " b [shape=box, label=\"Прочитать B1\"];\n", " c [shape=box, label=\"Сложить С1 = А1 + B1\"];\n", " d [shape=box, label=\"Сохранить С1\"];\n", " e [shape=box, label=\"Прочитать А2\"];\n", " f [shape=box, label=\"Прочитать B2\"];\n", " g [shape=box, label=\"Сложить С2 = А2 + B2\"];\n", " h [shape=box, label=\"Сохранить C2\"];\n", " a -> b -> c -> d -> e -> f -> g -> h \n", " }'''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "code", "execution_count": 4, "id": "f3d65fed-7d73-4ffa-a187-0cf880010a32", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\";\n", " a [shape=box, label=\"Прочитать А1, A2\"];\n", " b [shape=box, label=\"Прочитать B1, B2\"];\n", " c [shape=box, label=\"Сложить Ci = Аi + Вi\"];\n", " d [shape=box, label=\"Сохранить C1, C2\"];\n", " a -> b -> c -> d \n", " }'''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "markdown", "id": "a492cef2-4c0d-46d3-807f-bc5d2e3c7d8d", "metadata": {}, "source": [ "### Кооперативная многозадачность\n", "\n", "#### Последовательное выполнение" ] }, { "cell_type": "code", "execution_count": 5, "id": "6a86ef74-c4bb-409a-800b-586f0f4e79df", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\";\n", " e [shape=box, label=\"Вычисления 1\", color=\"green\" width=3]; f [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"green\" width=2]; g [shape=box, label=\"Вычисления 2\", color=\"green\" width=4]; h [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"green\" width=3]\n", " a [shape=box, label=\"Вычисления 1\", color=\"blue\" width=3]; b [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"blue\" width=2]; c [shape=box, label=\"Вычисления 2\", color=\"blue\" width=4]; d [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"blue\" width=3]\n", " a -> b -> c -> d -> e -> f -> g -> h \n", " }'''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "markdown", "id": "38195b11-8eda-4bc0-8dfb-da4588e143a1", "metadata": {}, "source": [ "#### Кооперативное выполнение" ] }, { "cell_type": "code", "execution_count": 6, "id": "1c87e15f-c86d-465d-8e8c-43bd46656263", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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cTqdeHl5MWTIEN544w38/f0zMaGIZKXdu3ezevVqfvnlF2bMmEGuXLlSbBsXF4e3t3cWphMRERE7VatWjf3799/19/Lnz8/rr7/OoEGD8PHxyYRkIiIiIiJZ4nPd+icikg01atSIPXv2pHiH+P9KSEigXr16fPnll1StWjWT04lIVqtVqxa1atVKs93169cpUqQIlStXpm/fvgwYMCAL0omIiIidqlevzqFDh5KG4E2Nt7c3CQkJPPvss7zzzjsUKVIkCxKKiIiIiGQuzSYhIpINBQcHExcXl2Y7b29v8uXLxxdffMFPP/2kQqlIDufp6cmMGTN45JFHKJjGRK3R0dFZlEpEREQy0pIlS/j3v//NwIEDAahatWqac5t7eXnhcDh47LHHOHz4MJMnT1ahVERERESyDRVLRUTcWHR0ND/99BPff/99sveDg4NJbZT1xIsdXbt25ffff6dv3744HI7MjisiLs7f359u3boxbtw4nn766VTbDhs2jEKFCtGyZUuuXr2aRQlFRETkXs2cOZOVK1cSGRkJQJUqVVIckcbDw7psVLNmTTZt2sSiRYsoX758lmUVEREREckKmrNURMSNVa5cmd9++42goCB27tyZ7LMiRYpw6dKlW77j4eFBpUqVmDp1KvXr18+qqCKSzfzyyy9s3LiRAwcOMGnSpFRvuIiMjCRPnjxZmE5ERCRn2bdvHyNHjmT//v288847dO3a9Y6/e+zYsdsWQD08PChbtixjxoyhc+fOGRlXRERERMSVfK4nS0VEXNTVq1eJiIhItc3UqVMJDQ29pVAK0KBBg6Q7wcEactfX15f33nuPffv2qVAqIvekevXqDBo0iC+++CLVQum5c+cICAjggQce4PPPP8/ChCIiItlDbGwsJ06cSLWNj48PuXLlokePHlSpUuWull+2bFl8fX2T/uzl5UX+/Pn58MMPOXz4sAqlIiIiIpLtqVgqIuJitm/fTqVKlShUqBALFixItW3Dhg2pUKHCbT+rX78+np6eSfMPPfHEE/z+++8MGzYszTmJREQySt68eVm0aBF///vfKV26dKptr1+/TkJCQhYlExERcX0dOnTA39+f5s2bp9ouMDCQkJAQ3nzzTapWrXpX6/Dw8KBixYqAVXR9/fXXOXXqFIMHD8bLyyvd2UVERERE3IWG4RURcTFnzpzhiy++oG7dujRs2JCCBQumaznr1q2jRYsWlC1blilTpvDwww9ncFIRkYz17LPPEhISQrVq1Vi9ejX+/v52RxIREclwcXFxHD16lAMHDlC3bt1UbyaaP38+Hh4eVKlS5a6fGL0bvXv3xtPTk7feeosSJUpk2npERERERFzQ5yqWiohkka+++orFixdz8uRJdu/enenri4iI4OOPP2bo0KH4+Phk+vpERO7VgQMH+OmnnwgNDWXcuHEptjPGcPnyZQoXLpyF6URERDLGd999x5NPPomnpydz5869q/lFM0tMTIzOGUREREQkp1KxVEQkq7z++uv89ttvBAcH88orr2hIKxGRdDp69CgVK1akVKlSjBgxgueff97uSCIiIixfvpy9e/dijOGNN95Isd3169c5duwYlStXVoFSRERERMR+KpaKiNyLqKgofvjhB7Zv305wcDCPP/643ZFERLK9qKgoNm3axJ49e6hXrx7NmjVLse3FixcJCAggV65cWRdQRERypODgYC5fvkyTJk2YPn263XFEREREROTOqFgqInIvLly4QIkSJahUqRIvvfQSzz33nN2RRETkL55++mm+/fZbqlWrxtatW1U0FRGRu7Jz504mTJjAwYMH+eijj2jatGmKbZ1OJ56enlmYTkREREREMsDnGgNSROQ2jDEcOXKEnTt30q1bNzw8PG7brmjRoly7do28efNmcUIREbkTb731Fu3bt+fEiROpFkrj4+MJCwvj/vvvz8J0IiJiJ2MMV69epWDBgim2iYmJ4erVqzz88MMULVo01eWpUCoiIiIi4p70ZKmIyG28+uqrfPDBB/j4+PDbb79RtmxZuyOJiEgm+uWXX6hRowaFChVizJgx9OnTx+5IIiKSiVq3bs2WLVuSRh4QEREREZEcS8PwikjOExcXx5UrVyhWrFiKbQ4fPsy1a9eoWbOmhmwUEckBoqKi2LlzJ3v37qVevXoEBwen2PbMmTMEBASQJ0+eTMkyduxYevbsSYkSJTJl+SIi2dnx48c5dOgQdevWpVChQim2++yzz8idOzc1atSgdu3aWZhQRERERERcjIqlIpJzxMfH06xZM37++Wfatm3Lt99+a3ckERFxQ+3bt2flypU8+OCD/PLLLykO1Z4e8fHx+Pv74+npyZtvvsnLL7+Mj49Phi1fRCQ7mzJlCs8//zwAq1atonXr1jYnEhERERER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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\";\n", " e [shape=box, label=\"Вычисления 1\", color=\"green\" width=3]; f [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"green\" width=2]; g [shape=box, label=\"Вычисления 2\", color=\"green\" width=4]; h [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"green\" width=3]\n", " a [shape=box, label=\"Вычисления 1\", color=\"blue\" width=3]; b [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"blue\" width=2]; c [shape=box, label=\"Вычисления 2\", color=\"blue\" width=4]; d [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"blue\" width=3]\n", " subgraph cluster_1 {a e c g peripheries=0 }\n", " a -> b [style=dotted];\n", " a -> e;\n", " e -> f [style=dotted];\n", " b -> c [style=dotted];\n", " e -> c;\n", " c -> d [style=dotted];\n", " f -> g [style=dotted];\n", " c -> g;\n", " g -> h [style=dotted];\n", " }'''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])\n" ] }, { "cell_type": "markdown", "id": "713d7ef0-2996-48f2-9834-cc7cb243d6f0", "metadata": {}, "source": [ "### Вытесняющая многозадачность" ] }, { "cell_type": "code", "execution_count": 7, "id": "e4afbb6b-c17f-48ad-8995-3cf5be872308", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABrkAAAC1CAYAAADr2pRkAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzde3zPdf/H8cd3B+Y4alERuhzSXOjSzCGHycgcymEYMUslktJB1mVhpAtdV0WlyCnlilUyp7mcWxgSpZNLisphzsWM707v3x+fa9+fb2aY2Wff7Xm/3Xarfb6f7+f7/GCfz96f1/vgMMYYRERERERERERERERERDzHai+7E4iIiIiIiIiIiIiIiIhcLRW5RERERERERERERERExOOoyCUiIiIiIiIiIiIiIiIeR0UuERERERERERERERER8TgqcomIiIiIiIiIiIiIiIjHUZFLREREREREREREREREPI6KXCIiIiIiIiIiIiIiIuJxVOQSERERERERERERERERj6Mil4iIiIiIiIiIiIiIiHgcFblERERERERERERERETE46jIJSIiIiIiIiIiIiIiIh5HRS4RERERERERERERERHxOCpyiYiIiIiIiIiIiIiIiMdRkUtEREREREREREREREQ8js+1vPnVV18lKSkpv7KIiIiIiIiIiIiIiIhIMfHYY48RGhqa5/df00iupKQktmzZci2HEBERERERERERERERkWImPj6en3/++ZqOcU0juQCaNm3KRx99dK2HERERERERERERERERkWKiQoUK13wMrcklIiIiIiIiIiIiIiIiHkdFLhEREREREREREREREfE4KnKJiIiIiIiIiIiIiIiIx1GRS0RERERERERERERERDyOilwiIiIiIiIiIiIiIiLicVTkEhEREREREREREREREY+jIpeIiIiIiIiIiIiIiIh4HBW5RERERERERERERERExOP4FNQHORwF9UkiIiJyoYULoVcvu1NItl9+gbAw+OEHu5OIFA19+8KcOVCihN1JxJPs3AmNGtmdQkSKsz17oHZtu1OIFH5xcfDww5CSYncSEbkafn7w1lswcOD1/6wCK3IBDB8OzZoV5CeKiIgUb717251ALrRzJ3TqBJUqWcVHdQISyZvXX4fNm2HECJg0ST9LkndTpsDNN9udQkSKk/37YeRIu1OIFH4ZGdbPymuvwZAhEBJidyIRuZwdO2DyZLjtNvjkE7j77oL53AItcjVrpp7kIiIiBUlFrsJj7Vro3h2CgmDRIvD3tzuRiOfJzISnnoKk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nnTt8+uvv/LSSy+57iXff/89sbGxbn/W+ZH5t99+IzY2lvHjx3P48GG3/Y0xbNu2jdjYWF555RXOnj1b6M6zKN+PPv0U2raFFi1g3ToVuKTgZf9cpqSkEBcXR7t27ahcuTJPPfUUGzdutDmdZMuPa7sxhnXr1hEbG8t7771Heno6xhi2bNlCbGws8+bNIyMjgxMnTjBhwgTGjRvnKuCcOnWKCRMmEBsby65du1yfM3fuXJo0acIPP/zAl19+SdOmTd06Nvz666/861//cn2/f/9+YmNjiYuLc91Lpk6dSrdu3fj1119ZtGgRDRo0YOHChQDs27eP2NhYYmNjSU5OBqx216RJk4iNjWXnzp0AV5z53Llz3HPPPfTq1Ytdu3Zx9uxZYmNj+de//pXrlLgXFrgu/DtxOBy0adPmcn99IlKEXNheWr16Nb169eLGG2+kf//+LF261HVty8iA6Gjo1g0iImDt2uJX4MpNcnIy27dvp0yZMgQGBmKMISkpidjYWDZs2EBKSgpLly6ldevWPP/8827vjY6OpkOHDvz666+sWbOGxo0bM2TIEFe7IvtY7777rus9K1asIDY2lh9//DFfM2/cuJHY2FjeeustVzsqW2ZmJh9//DGxsbG8//77ZGRkFIrzvNQ97fbbb+f222/P859PUbBzJzRuDN9/bz3nKIoFLkDTFYrkp99++80ApmbNmubvf/+7GT16tBk+fLhp3ry58fHxMVFRUSb1gvGggwYNMoA5f/58jsdr3Lix+ctf/uK2rXbt2iYkJMRtW/ny5U2/fv1c3z/77LMGcPusf/3rXwYwiYmJxhhjUlJSTJUqVczbb7/t2mfIkCEGMJ999plr2/Dhw92GMwPmySefNMYYc/bsWVOlShXz/fffu+0PmK1btxpjjBk8eLABzOnTp137zJ49+6JpSa4k89mzZ42Xl5dp1KiRycrKMsYY07p1a1O/fv0c//xysnPnTk1XKMUKJLpN56Svi7+qVatmRo9+21SrZk25sX+/3X9r+eP99983gAkJCTEvvviiiYmJMYMHDza1atUy/v7+5pVXXnHbv27duqZ169au78ePH28As3HjRmOMMT/99JMpVaqUWbJkiWufpUuXGsDtHmSMMb179zbp6enGGGM++ugjA5hNmzble+Y6deqYZs2a5Xiss2fPGsAMHDiw0J2nMca89tprRXK6wtdft6bAqFbtPtt/tvWlr0t9BQYGmldfXWzQdGEF4npf2w8ePGgAM3bsWNe2HTt2GMDMnDnTte3uu+82wcHBbsfr0qWL8fHxMZmZmcYYY7Zv3278/PzMrl27XPvceeedpkSJEq7rvTHGhIaGuv5//fr1BjCLFi0yxhizbds2U6dOHXP27FljjDV1fePGjU2lSpVcU4HVrVvXNGrUyC1LZGSk8fb2dvucK8m8cuVKA5inn37atQ9ghg0bluOfYW5iYmJMVFTUVb9Pro41XeF/bL8W6qv4fXl7e+fpfbfddpv5xz/eMG3bGuPnZ8ycOXb/FNnr4YcfNoCJjIw0o0ePNi+88IKJjIw0FStWNDVq1DCrVq1y7ZucnGwAM2bMGNe2tm3bmpIlS7qu4x9++KEpW7asOXjwoGuf7GdkF97HMjMzTc+ePV3fDx061JQoUcL1fCy/Mh86dMgA5oUXXsjxWMuXLzeAmTdvXqE7zwu1aNHCzJ0796reU9S8/74xpUsbExJizJEjdqe5NE1XKFJIORwOHA4HmZmZnDlzhsOHD1O2bFlKlizJ6dOnKVWqFGANn/X29qZkyZI5HqdcuXKkpaVdtM3L6/8HYe7fv5+0tDTKlCnj2pY9DDn7czIyMjh48KDbto8//pjk5GQeeugh1/uio6OpW7eu21Dh7CHJF8o+xtKlS0lLS3P1SgQ4dOgQYPW0CA4Odr2/XLlybufw521XkrlUqVJUrVqV48ePk5KS4np/ThlFJNudPP10HM2a2Z3j+ouMjOT8+fOX3c/Hx4eMjAxuuOEGHnzwQf761z78/e9NqVMHliwpeqNOsu8Z6enpnDp1ihMnTnDDDTeQlpZGWlqaaxqS0n9aJTp7EWp/f38A3nzzTXx9fencubNrn86dO9OqVSvmz5/PP/7xD6pWrQrATTfddNGUGNmfM2/ePH7++We31/483eyVZi5btuxFubOVLl0aLy8vt3tNQZ5ncWMMxMbCuHEwejS0bTuK5OSH7Y4lRdiZM2d4+OEr+zfm6+tLeno6VapUYcCAAfTp04f09L9e54TyZ9fr2p79/xe2kf773/8CXNRGuvBec+rUKU6fPk3JkiVd733zzTcJCgqifv36rv3effdd9u/f73a9z62NNHv2bPz9/d2mJXQ4HBw9epTt27cTEhJC+fLlXftfeB5+fn5un3MlmW+//Xa8vb0vmtniattIx48f5+OPP2b9+vVX9T7Jq4ZMmRKnUTBSoB5++GHOnDlz2f2y20sVK1akb9++NGrUh3HjmuPrC1u3WtMUCnh7e2OMwel0cvToUVJSUqhTp47b7A9/vp9lZWVx+vRpypYt67qOT548mZCQEG699VbXfi+++CIzZsxg0qRJrt93vLy8qFy5stvxfH19XTNEjBs3zm2WqJymrL2SzGXLls0xe7acnukV5HleiXXr1uHt7U1kZOQVv6cocTrh+efhjTes/06YABfMvF8kqcglch00bNjQba72rKwsxo4dy/jx49m0aRNffPEFfn5+OBwOjDFMmDCBkiVLUqVKFcLCwqhQoQKQ81RGfn5+JCUl8eSTT5Kens7PP/+c67RIixcvJiYmxq2BB7Br1y5KlizpVmCrVq0aTz75pNt+ud1EvvvuO7f1SQDuvPNOxowZw9133+32/gun+Pj+++8veczcMjscDpYtW8aAAQOoX78+DzzwAPv373c9bBSRnATQtGlPeva0O8f1N3DgwEu+5uPjQ2ZmJqVKlaJ79+706tWLDh06sGSJL/36QVgYzJ8Pf3reVCR069aNJ554wvX96dOn6d27N6NGjeLnn392rWXicDjYv38/L7zwArt27WLjxo289NJL/PWv1oPgjRs34u/vf9F9oXnz5iQmJvLtt9+6rse53TvmzZvH2rVr3bYNHz7c7SHe1WZ+6aWXKF++PDVr1qR9+/au9dZyylFQ51mcOJ3w0EPwySfwwQfQty9AS7tjSRF34sSJXItc2Q/o/P396d27N/379+eee+5x/dz+b0Y4KUDX69peokQJHA4HM2fO5OzZs/zyyy+ujnc5cTqdvPnmm0ybNu2izoa7du3i5ptvdtt2zz33cM8997htu9o2UlhYGGFhYdx4441u53hhG2nbtm15ylynTh0+/PBDnnrqKZo2bUrr1q0veZxLMcYwdOhQZsyYcdH5y/VSmbCwntSubXcOKU4ee+yxS77m4+NDVlaWq7NX9jrGc+b4MmQIhIZav+cV86WN3DzzzDOuNgRYS4y0bduWiIgI0tPT6devn+t+sWHDBp599lk2bNjAsWPHeO+99wBrKZOdO3e6HQesDnj16tVj69atpKamUrp0abKysi66v1xo3LhxblOwN2zY8KIi19VkTkxM5KWXXiIgIIC77rqLpk2b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nHE4HK5jlClTxixatMicPXvWLcugQYNMenq6W5YuXbqYH3744Yoyz54927Rv394AJiEhwezevduEhoa6PvOVV1655N/Pn8/zwq/+/fvn278DuZiuP2KX3NpLWVnGTJxojLe3MX37GnP2bAEG8xBJSUlm+PDhpkKFCgYw9957rxkyZIgZOXKk6dOnjylbtqxxOBzmkUceMRkZGWb37t3m3nvvNYBp1KiRiY6ONgMGDDClSpUy1atXd913MjMzXdf8Bx54wDz99NPmtttuM2PGjDHGGPPqq6+aSpUqmT59+rjaHzExMeYvf/mLAUy3bt3Mzz//nC+Zv/32W9OmTRvXc7Po6GjTsWNHA5i+ffua9957z9WOqVWrllm8eLHt53nmzBnXvS+nr1mzZuX/P4ZCYs8eY/76V2MCAozJpQla6Pn7+5vp06dfyyFWOYzJe/fR7N6rf552LCcOByxcCOoQJCIiUnB0/7UcPGgN2z9+HFasgD/N+lrk5LQOSPZI4YCAABo2bOhasyMtLY2XX37Zbd9SpUpRpUoVwsLCuPHGG91e+/nnn1mxYgVOp5Pg4GDX+h0xMTFMnTqVHj16UKVKFdeo5LS0NH799Vc+/fRTRowYkWO25ORk3nnnnSvOnJqayuTJk932LV++PHfccQcdOnTgiy++YOXKla7XAgICGDRokO3neak/77p167p6ThZ2H38M/ftDp07W4uMaMCOeaudOaNQI9uyBCzoLi4hcd7r+SGFz5gw89BDEx8NLL8HIkXYnKpy2bNni1sbI5nA48PPz4+abb6Z58+auUUh79uzh3//+t9t+5cqVo1atWtx3332uJU2yJSUlsXHjRkqVKsV9993nOk6LFi04cOAAXbp0oWLFiq6pms+dO8euXbv4z3/+w7p163Kcku9qM3///ffExcW57RcQEEDjxo0JDg5mwYIF7N692/V6UFAQderUsfU8v/vuu1xrE0OHDuWmm2665Oueatkyq132l79Y04peMOjb41SoUIHJkyczaNCgvB5itYpcIiIiRZjuv/DNN1aBq0IFq8B12212JyqaRo8eTefOnQkODs7x9W3btrFy5co8zxVfWBSX88zJlCnwzDPWXO+vvabFx8Wz6SGziNhF1x8pTP77X+je3eoMuGABtGljdyL5s4iICN555x3XlLd/9sorr9C4cWOPX3equJzntTIGJk+Gv/8dHnwQpk+H/83A77Hyo8jlk5+BRERERAqTtWuhRw+4+26rd1OxnJu6gIwbNy7X14ODgy9ZGPIkxeU8L5SZCU89BdOmwaRJ8L8p80VERETEg8XHQ2QkNGgAa9bALbfYnUhysmDBglxfH1FEfjkvLud5LU6csApbGzZYxa1HHrE7UeGh/pciIiJSJL3/PoSFQbt2sHy5ClwieeF0Qt++MHMmfPihClwiIiIini4jA6KjoVs3iIiwOgaqwCVSuO3cCY0bw/ffQ2KiClx/piKXiIiIFDlTpsCAATBkiDVdo9YNErl6J09CaCisXm199e5tdyIRERERuRbHj0OHDlZ7afZsazRIiRJ2pxKR3HzwAbRoYa27tX07FLGJQ/KFpisUERGRIiMzE5580mqsvfEGDB1qdyIRz7Rvn7WW3fnzsHkz1K1rdyIRERERuRZffmlN5e7rC1u3WtMUikjh5XTC889bzzaefx4mTABvb7tTFU4qcomIiEiRcP489O8PS5fCv/8NvXrZnUjEM+3aZRW4brjBGsFVtardiURERETkWsyYAcOGWaP0P/gAKla0O5GI5ObgQQgPh+++g48+sgrUcmmarlBEREQ8Xva0auvWWYsmq8Alkjdr1kDLltbIrY0bVeASERER8WTnz8Ojj8LgwfD001aHQBW4RAq3xEQICoJTp2DLFhW4roSKXCIiIuLR9u2D5s3h0CHYtMmaq1pErt5771kjuLp2hYQEKF/e7kQiIiIikle//QatW0NcHCxaBBMngpeeBIsUajNmWB14mzSxphUNDLQ7kWfQpU1EREQ81hdfQLNmULIkfP651g0SyatJk+Chh2DIEJg711qrQUREREQ80/r11kgQpxN27LA6MYlI4ZWSAr17w+OPw/jx8Omn4O9vdyrPoSKXiIiIeKTVq6FtW6hf3ypwValidyIRz5OZaRW2Ro2Ct96CKVPA4bA7lYiIiIjkhTFW56V27azRIJs3Q82adqcSkdz8+KPVeXfdOli5EkaOVJvsaqnIJSIiIh5n7lzo1Am6d4cVKzStmkhenD1r9eqdN8/qKThkiN2JRERERCSvzpyBnj0hJgYmTID586F0abtTiUhuli2D4GBrdprt263itFw9FblERETEo2RPq/bMMzBnjqZVE8mLEyegfXtISoJVq6BLF7sTiYiIiEhe/fe/1ho+n39u/W43cqTdiUQkN9mjLh94wGqLff45VK9udyrP5WN3ABEREZErkZlpzU89axa8/TYMHmx3IhHP9PPP0KGD9TO1eTPUqWN3IhERERHJq/h4iIyEBg1g7Vq45Ra7E4lIbk6cgL594bPPYPp0eOQRuxN5Po3kEhERkULv7Fmrh9P8+bB4sQpcInm1bZs133uFCtYoLhW4RERERDxTRgZER0O3bhARoQKXiCfYuRMaN4YffoDERBW48ouKXCIiIlKoJSdD69awZYs19UbnznYnEvFMS5ZAmzZw113WQ5BKlexOJCIiIiJ5cfy4NTJ/yhSYPdsaDVKihN2pRCQ3H3wALVpY0xJu326txSX5Q0UuERERKbR++glatYJTp6xRJ82b251IxDPNng09ekDv3rB8OZQrZ3ciEREREcmLL7+EoCD45RfYuhWiouxOJCK5cTrhqaesaUWHDYM1a9ThML8V6JpcvXtbXyIiIiKXk5RkLcB64oT1vaZVE8k7hwNiY+HFF+1OIlK46N4iIiKe5O23YfhwSEuzvm/Y0N48InJlypeHRYuga1e7kxRNBVbkWriwoD5JRERELuSJo5+MsYpbb79tdxKRoqFyZWtUpIhYbr9dbVQRsZfWTpKrdfw4BARYU56JiGdp1Ahq1rQ7RdFVYEWuXr0K6pNERETE0zkcWntLRESunwoV1EYVERHPEhAAPXvanUJEpPDRmlwiIiIiIiIiIiIiIiLicVTkEhEREREREREREREREY+jIpeIiIiIiIiIiIiIiIh4HBW5RERERERERERERERExOOoyCUiIiIiIiIiIiIiIiIeR0UuERERERERERERERER8TgqcomIiIiIiIiIiIiIiIjH8bnWAxw4cIC4uLj8yCIiIiIiIiIiIiIiIiLFQHp6+jUf45qLXFu2bKF3797XHERERERERERERERERETkSjmMMcbuECIiIiIiIiIiIiIiIiJXYbXW5BIRERERERERERERERGPoyKXiIiIiIiIiIiIiIiIeBwVuURERERERERERERERMTjqMglIiIiIiIiIiIiIiIiHkdFLhEREREREREREREREfE4KnKJiIiIiIiIiIiIiIiIx1GRS0RERERERERERERERDyOilwiIiIiIiIiIiIiIiLicXzsDiB59+qrr5KUlGR3DBERERERERERERERkav22GOPERoamuf3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iIhIPlnPeoIIwomTHeygK13tjiQiuUghhd705nEeZzzj+ZRP8cff7lh5pq6TIvlk4sSJnD9/3m2bl5cXfn5+VKlShdatW1O1alWb0km21NRUEhISqFu3LvXq1bM7jojkk7S0NNq3b0+fPn0IDw/nxhtvzJfjvsmbDGc4UUTxDu94zKiTsWPHXrTN29ubsmXLcvvtt9O2bVvKlSs8U8QlJyfzzjvvXLS9MGe+VkeOHCE+Pp6+fftStmxZu+NcVymk0JOebGQjS1hCGGF2R8oX+/btY+jQofTp04euXbsWqX+fIvmhOF7bPdHnn3/O9u3bKVWqFC1btlQbSaQIGzBgALVr16ZPnz7UrFkzX45pMExmMqMYRW968y7vUprS+XLswmbLli2sXLnyou2+vr5UqFCBwMBAWrZsiY9P4WkzemLmvEpPT2fZsmXs3buXSpUq0aFDBypXrmx3rELpR36kO91JJpmVrCSUULsjXTON5BLJJ1lZWWzevJnY2FjmzJnDsWPHOHfuHLt372bEiBFUq1aNqKgonE6n3VGLrYiICG666SbCw8P55ptv7I4jIvnss88+Y/DgwVSuXJkOHTrw73//m5SUlDwdK3tatSd5khhimMlMjylwgfUL/sKFC4mNjSUhIYE//viD06dPk5SUxIMPPkilSpWYMmWK3THdeGLmvNi/fz8hISHceuutPPbYY3n+N+opDnOYVrTiK77iMz4rMgUugMzMTBISEoiMjCQgIIDw8HAWL16s3/VELlBcru2eKDMzk4iICKZOncqhQ4eYPXs29evX54knnrA7mohcJ19//TUvvvgitWrV4u6772bKlCkcPnw4z8c7wxl60pMYYpjABOYzv8gWuLKdPn2aqVOnEhsby9dff825c+c4evQoixcvpm3btlSvXp3169fbHdONJ2a+WkeOHKFVq1YkJCRw4MABXnzxRWrWrMm8efPsjlboLGMZwQRTghJsZ3uRKHABYMRjhYeHm/Dw8CvaF4NZaBZe50Syb98+A5gePXq4bU9LSzMREREGMKNHj7YpnSxatMiMGjXKAObDDz+0O06xoeuPFASn02kA15e3t7fx8vIyvr6+pmPHjiYuLs44nc4rO5ZxmgfNg8bH+Jh3zbvXOfn1M2fOHAOYN954w217cnKyCQwMNIBZt26dTely5omZr9axY8fMkiVLTMeOHQ1g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sWfPHlJSUnC73bz66qt5Dombs8CV83ficrlo0qTJ7/36RKQQyczMJDMzk4yMDNasWUOvXr248cYb6dChA8uXL3c+72aQQTzxtKMdXejCetYXuQJXXpKSkti5cyclSpTgnnvuwczYunUrbrebTZs2cfr0aZYvX06jRo0YMmSIx7bx8fE8/PDDHD58mHXr1hEZGUnfvn2dfkX2vt59911nm08//RS328133313TTNv2bIFt9vN22+/7fSjsmVmZrJo0SLcbjcffvghGRkZBeI4c2vTbr/9dm6//fYr/vkUBokkEkkk+9jHZjYXygIXoOEKfZmGKyx4fvzxRwOsSpUq9uKLL1pCQoINHDjQ6tevbwEBAdazZ087c+a/j4P26dPHADt37twl9xcZGWl33HGHx7KqVata48aNPZaVLl3aunfv7nz//PPPG+DxXq+++qoBtnnzZjMzO336tFWoUMGmTp3qrNO3b18D7O9//7uzbODAgR6PMwM2YMAAMzNLSUmxChUq2L59+zzWB2z79u1mZvbUU08ZYCdPnnTWmTFjxkXDkuQnc0pKivn5+VmdOnUsKyvLzMwaNWpkNWvWvOTP71ISExM1XOF1hmG31bzNY0gnfemrIH1VrVrVJn480W6z2+weu8cO2SFv/29zTXz44YcGWOPGje3ll1+24cOH21NPPWV33nmnhYaG2sSJEz3Wr169ujVq1Mj5fvTo0QbYli1bzMzs+++/t5CQEPvkk0+cdZYvX26ARxtkZta5c2dnmLaFCxcaYJ9//vk1z1ytWjWrV6/eJfeVkpJigD3++OMF7jjNzF5//XWDwjdc4Rv2hvmZn93WQuf9vL7Cw8Nt6tqpRXa4JCla/uhz+5EjRwywkSNHOst2795tgL333nvOsvvuu8+ioqI89te6dWsLCAiwzMxMMzPbuXOnBQcH2549e5x17r77bitWrJjH8KPNmjVz/r5x40YDbPHixWZmtmPHDqtWrZqlpKSY2fmh6yMjI61cuXJ26tQpMzvfFtWpU8cjS2xsrPn7+3u8T34yr1692gB77rnnnHUA69+//yV/hnkZPny49ezZ87K3E/Elu223sc77nwV86SssLMyGuofaQ2kPWbAF20yb6e1fo1c98cQTBlhsbKwlJCTYsGHDLDY21sqWLWuVK1e2NWvWOOsmJSUZYCNGjHCWNW3a1IKCgpzz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FKOYt2OJSB7mMIcGNKASldjJTqKI8nakQkNFLhERESmwvud7GtKQE5xgK1upT31vRxLxSTOYQXva05nOrGQlpSjl7UgiIiIicgV2sYsIIviBH9jOdnrS09uRRCQPqaTyLM8SSyz96c861umGw2tMc3IVIZ3//x8RERFfsJWttKY1xzgGoGHVRK6CCxdu3LzMy96OIhfQuU1ERETyaypTGchA0kgDIJxwLycSkfwoTWkWs5i2tPV2lEJJRa4iYj7zvR1BRIowPX0jl8swjnGMqUz1dhSRQuFmbqYhDb0dQ3K4ndv1GV1ERMRLfHHuqmSSCSOMOczxdhQRuUx1qEMVqng7RqGlIlcR0YlO3o4gIiKSby5cmntLRAq1MpTRZ3QRERHJtzDC6EhHb8cQESlwNCeXiIiIiIiIiIiIiIiI+BwVuURERERERERERERERMTnqMglIiIiIiIiIiIiIiIiPkdFLhERERGlmN+IAAABeklEQVQREREREREREfE5KnKJiIiIiIiIiIiIiIiIz1GRS0RERERERERERERERHyOilwiIiIiIiIiIiIiIiLicwK8HUCuzr///W8WLFjg7RgiIiIiIiIiIiIiIiL5lp6eftX7UJHLx23bto3OnTt7O4aIiIiIiIiIiIiIiMh15TIz83YIERERERERERERERERkcuwVnNyiYiIiIiIiIiIiIiIiM9RkUtERERERERERERERER8jopcIiIiIiIiIiIiIiIi4nNU5BIRERERERERERERERGfoyKXiIiIiIiIiIiIiIiI+BwVuURERERERERERERERMTnqMglIiIiIiIiIiIiIiIiPkdFLhEREREREREREREREfE5KnKJiIiIiIiIiIiIiIiIz1GRS0RERERERERERERERHyOilwiIiIiIiIiIiIiIiLic1TkEhEREREREREREREREZ+jIpeIiIiIiIiIiIiIiIj4HBW5RERERERERERERERExOf8PwxvTV0q8/TcAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\";\n", " e [shape=box, label=\"Вычисления 1\", color=\"green\" width=3]; f [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"green\" width=2]; g [shape=box, label=\"Вычисления 2\", color=\"green\" width=5]; h [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"green\" width=3]\n", " a [shape=box, label=\"Вычисления 1\", color=\"blue\" width=5]; b [shape=parallelogram, label=\"Ввод-Вывод 1\", color=\"blue\" width=2]; c [shape=box, label=\"Вычисления 2\", color=\"blue\" width=3]; d [shape=parallelogram, label=\"Ввод-Вывод 2\", color=\"blue\" width=3]\n", " subgraph cluster_1 { a b c d }\n", " subgraph cluster_2 { e f g h } \n", " e -> f -> g -> h \n", " a -> b -> c -> d \n", " \n", " }'''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "markdown", "id": "f7953f55-6eb9-486d-a02e-3efdb06b1d4f", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Проблемы с вытесняющий многозадачностью\n", "\n", "* Доступ к разделяемым ресурсам\n", "* Состояние гонки\n", "* Взаимные блокировки\n", "* Активное ожидание\n", "\n", "## Способы преодоления\n", "\n", "* Мьютексы (Mutex)\n", "* Барьеры (Barrier)\n", "* Критические секции (Critical section)\n", "* Обмен сообщениями\n", " * Сокеты (socket)\n", " * Модель издатель-подписчик (pub-sub)\n", " * Очереди (queue: FIFO, LIFO)\n" ] }, { "cell_type": "markdown", "id": "98b47ba0-c9a3-4d79-9b1e-8a33a9f27c7e", "metadata": {}, "source": [ "### Парадигма map-reduce\n", "\n", "Есть способ записи программ способствующий их эффективному распараллеливанию - парадигма map-reduce." ] }, { "cell_type": "code", "execution_count": 86, "id": "4cc1c345-3f81-4965-8634-4840a8afbdb7", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pydot\n", "from IPython.display import Image, display\n", "def view_pydot(pdot): plt = Image(pdot.create_png()); display(plt);\n", "\n", "mydot = ''' digraph my_graph { rankdir=\"LR\"; aa [shape=record, label=\"A1|A2|A3|A4|A5|A6\"];\n", " nmap[label=\"map(f, [A]) → [B]\"]; nmapfoo[label=\"f(A) → B\"]; bb [shape=record, label=\"B1|B2|B3|B4|B5|B6\"];\n", " nfilter[label=\"filter(g, [B]) → [B]\"]; nfilterfoo[label=\"g(B) → True/False\"]; cc [shape=record, label=\"B1|B3|B5\"];\n", " nreduce[label=\"reduce(h, [B]) → B\"]; nreducefoo[label=\"h(B,B,I) → B\"]; dd [shape=record, label=\"B\"];\n", " aa -- nmap -- bb -- nfilter -- cc -- nreduce -- dd; nmapfoo -- nmap; nfilterfoo -- nfilter; nreducefoo -- nreduce; } '''\n", "\n", "graphs = pydot.graph_from_dot_data(mydot)\n", "view_pydot(graphs[0])" ] }, { "cell_type": "markdown", "id": "9bf46d5e-d2e7-457f-8d7c-4531e1848c86", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "### Замечание о параллельных вычислениях с использованием пакета NumPy\n", "\n", "По умолчанию пакет NumPy использует внутреннее распараллеливание и задействует все доступные ядра, если это возможно. Подавить данное поведение можно следующими переменными окружения:\n", "\n", "```python\n", "import os\n", "os.environ['OPENBLAS_NUM_THREADS'] = '1' # для NumPy собранной с OpenBLAS\n", "os.environ['MKL_NUM_THREADS'] = '1' # для NumPy собранной с MKL\n", "```" ] }, { "cell_type": "markdown", "id": "2453ac67-7533-40db-853b-a16eeeed54d3", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Параллелизм на уровне данных\n", "\n", "```python\n", "import timeit\n", "import numpy as np\n", "import array\n", "\n", "# Подготовка данных\n", "\n", "cns = 42\n", "s = 100\n", "count = 10\n", "\n", "data = []\n", "result = []\n", "\n", "# Реализации умножения матриц\n", "\n", "# На списках\n", "\n", "for _ in range(0,s):\n", " data.append([float(x) for x in list(range(cns,cns+100))])\n", " result.append([float(x) for x in list(range(cns,cns+100))])\n", " cns+= 1\n", "\n", "def matmul1():\n", " for m in range(s):\n", " for n in range(s):\n", " result[m][n] = 0.0\n", " for o in range(s):\n", " result[m][n] += data[m][o] * data[o][n]\n", "\n", "# На массивах\n", "\n", "fdata = []\n", "for row in data:\n", " fdata += row\n", "\n", "adata = array.array('d', fdata)\n", "aresult = array.array('d', fdata)\n", "\n", "def matmul2():\n", " for m in range(s):\n", " for n in range(s):\n", " aresult[m*s + n] = 0.0\n", " for o in range(s):\n", " aresult[m*s + n] += adata[m*s + o] * adata[o*s + n]\n", "\n", "# С использованием NumPy\n", "\n", "ndata = np.array(data)\n", "nresult = np.zeros(ndata.shape)\n", "\n", "def matmul3():\n", " global nresult\n", " \n", " nresult = np.zeros(ndata.shape)\n", " nresult = np.dot(ndata, ndata)\n", "\n", "# Измеряем скорость\n", "\n", "print(timeit.timeit(matmul1, number=1))\n", "print(timeit.timeit(matmul2, number=1))\n", "print(timeit.timeit(matmul3, number=1))\n", "\n", "```\n" ] }, { "cell_type": "markdown", "id": "9f6c43fd-b7d5-410c-bd7e-ca6ba0e8fd89", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## Запуск параллельных вычислений с использованием пулов потоков и процессов\n", "\n", "### Запуска многопоточного выполнения функции через ThreadPoolExecutor" ] }, { "cell_type": "code", "execution_count": 28, "id": "192cc894-56be-47bd-888c-3cbc576ed522", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Task 1 is complete\n", "Task 0 is complete\n", "Task 2 is complete\n", "Task 5 is complete\n", "Task 3 is complete\n", "Task 4 is complete\n", "Task 7 is complete\n", "Task 6 is complete\n", "[1, 0, 4, 25, 9, 16, 49, 36] in 1.3230907917022705 sec\n" ] } ], "source": [ "from time import sleep, time\n", "import numpy.random as random\n", "from concurrent.futures import ThreadPoolExecutor\n", "\n", "#поскольку мы запускаем потоки, то можем сохранять результаты\n", "#в общую переменную common_data\n", "\n", "common_data = []\n", "\n", "#если sleep в этой функции заменить вычислениями, то\n", "#прибавки в производительности между 1 и несолькими потоками \n", "#не будет из-за работы Python GIL. ходят слухи, что в 3.14 это изменится...\n", "\n", "n_threads = 3\n", "\n", "def work(i):\n", " sleep(random.random())\n", " common_data.append(i**2)\n", " print(f'Task {i} is complete\\n', end=\"\")\n", "\n", "data = list(range(8))\n", "\n", "results = []\n", "\n", "stime = time()\n", "with ThreadPoolExecutor(n_threads) as executor:\n", " executor.map(work, data)\n", "executor.shutdown()\n", "ptime = time()\n", "\n", "print(common_data, \"in\", ptime-stime, \"sec\")" ] }, { "cell_type": "markdown", "id": "e7d5e2ac-ddfe-4335-9440-20413991494f", "metadata": {}, "source": [ "### Запуска выполнения функции в нескольких процессах через ProcessPoolExecutor" ] }, { "cell_type": "code", "execution_count": 24, "id": "b803c53d-2406-41ad-a775-bef0a8cef521", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Task 1 is complete\n", "Task 0 is complete\n", "Task 2 is complete\n", "Task 4 is complete\n", "Task 3 is complete\n", "Task 5 is complete\n", "Task 6 is complete\n", "Task 7 is complete\n", "[]\n", "[0, 1, 4, 9, 16, 25, 36, 49] in 1.8475453853607178 sec\n" ] } ], "source": [ "from time import sleep, time\n", "import numpy.random as random\n", "from concurrent.futures import ProcessPoolExecutor\n", "\n", "#поскольку мы запускаем процессы, то мы не можем сохранять результаты\n", "#в общую переменную common_data - этот список останется пустым\n", "\n", "common_data = []\n", "\n", "#рост производительности будет пропорционален числу процессов n_procs,\n", "#но ограничен числом ядер процессора данного компьютера\n", "#использование процессов позволяет преодолеть проблему GIL\n", "\n", "n_procs = 3\n", "\n", "\n", "def work(i):\n", " sleep(random.random())\n", " common_data.append(i)\n", " print(f'Task {i} is complete\\n', end=\"\")\n", " return i**2\n", "\n", "#поскольку по факту будет запущено несколько копий данного скрипта\n", "#код запускающий ProcessPoolExecutor должен быть оформлен в блоке __main__,\n", "#а код реализующий вычисления - в виде глобальной функции\n", "\n", "if __name__ == '__main__':\n", " data = list(range(8))\n", " \n", " stime = time()\n", " with ProcessPoolExecutor(n_procs) as executor:\n", " ft = executor.map(work, data)\n", " executor.shutdown()\n", " ptime = time()\n", " \n", " print(common_data) # пусто\n", " print(list(ft), \" in \", ptime-stime, \" sec\") # результаты собранные через return" ] }, { "cell_type": "code", "execution_count": 15, "id": "18557bc1-2c78-413f-8ba4-2a72077bd5fd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 in 9.005588054656982 sec\n", "Task 1 is complete\n", "Task 2 is complete\n", "Task 4 is complete\n", "Task 6 is complete\n", "Task 7 is complete\n", "Task 0 is complete\n", "Task 3 is complete\n", "Task 6 is complete\n", "Task 7 is complete\n", "Task 0 is complete\n", "Task 5 is complete\n", "Task 0 is complete\n", "Task 4 is complete\n", "Task 7 is complete\n" ] } ], "source": [ "import random\n", "from time import sleep, time\n", "from concurrent.futures import ThreadPoolExecutor\n", "\n", "#В новых версиях python есть реализация разбивания списка на чанки в модуле itertools\n", "\n", "def batched2(data):\n", " result = []\n", " for i in range(0,len(data),2):\n", " result.append([data[i],data[i+1]])\n", " return result\n", "\n", "#Реализация класса для простого map-reduce. Может использоваться с любым пулом\n", "\n", "class SimpleMapReducePool:\n", " def __init__(self, pool):\n", " self.pool = pool\n", " \n", " def map(self, fn, data):\n", " return list(self.pool.map(fn, data))\n", " \n", " def filter(self, fn, data):\n", " r = list(self.pool.map(fn, data))\n", " return [x for i,x in enumerate(data) if r[i]]\n", "\n", " def reduce(self, fn, data):\n", " if len(data) == 0:\n", " return None\n", " if len(data) == 1:\n", " return data[0]\n", " if len(data) % 2 == 0:\n", " bt = batched2(data)\n", " return self.reduce(fn,list(self.pool.map(fn, bt)))\n", " else:\n", " bt = batched2(data[:-1])\n", " return self.reduce(fn,list(self.pool.map(fn, bt)) + [data[-1]])\n", "\n", "#Задача: находим колисчество символов с самой короткой непустой строке\n", "\n", "data = [\"mklsf\", \"\", \"woiejfwe\", \"km\", \"oiejwefw\", \"pujskdlfjiejsmd\", \"\", \"\", \"sdfe\"]\n", "\n", "#Подсчет символов\n", "def count_symbols(s):\n", " sleep(1)\n", " return len(s)\n", "\n", "#Фильтр пустых строк\n", "def fiter_empty(n):\n", " sleep(1)\n", " return n > 0\n", "\n", "#Поиск наиболее короткой строки\n", "def find_min(x):\n", " sleep(1)\n", " a,b = x\n", " return min(a,b)\n", "\n", "#Все замечания о работе с ThreadPoolExecutor и ProcessPoolExecutor уместны и тут\n", "\n", "n_worker = 3\n", "\n", "start = time()\n", "p = SimpleMapReducePool(ThreadPoolExecutor(max_workers=n_worker))\n", "result = p.reduce(find_min,p.filter(fiter_empty, p.map(count_symbols, data)))\n", "end = time()\n", "\n", "print(result, \" in \", end-start, \" sec\")" ] }, { "cell_type": "markdown", "id": "d8ea8950-5561-4074-ac8a-a3256687f3bf", "metadata": {}, "source": [ "## Запуск параллельных вычислений с использованием MPI\n", "\n", "MPI - программный интерфейс (API), который позволяет обмениваться сообщениями между несколькими процессами, выполняющими одну и туже задачу. Существует несколько реализаций.\n", "\n", "Для работы с MPI в Windows нам понадобятся:\n", "* пакет `mpi4py` из `pip`\n", "* установить Microsoft MPI: https://www.microsoft.com/en-us/download/details.aspx?id=57467\n", "\n", "Для работы с MPI в Linux нам понадобятся:\n", "* пакет `mpi4py` из `pip`\n", "* пакет `openmpi` (системный или из `pip`)\n", "\n", "Чтобы запустить процесс с использованием MPI следует использовать следующую команду:\n", "\n", " mpiexec -n 4 python file.py\n", "\n", "где `-n 4` - число процессов при локальном запуске или `-hostfile hosts.txt` - файл с перечислением доступных узлов для запуска на вычислительном кластере. Узлы должны быть доступны по SSH для входа от имени текущего пользователя без пароля и на них должна быть установлена совместимая версия `openmpi`.\n", "\n", "### Рассылка данных исполнителям с использованием MPI\n", "\n", "В этом примере процесс с рангом 0 рассылсает по одному сообщению всем остальным процессам, они его получают:" ] }, { "cell_type": "markdown", "id": "fdd75f8d-8654-4381-a26b-219f2e509559", "metadata": {}, "source": [ "```python\n", "from mpi4py import MPI\n", "\n", "comm = MPI.COMM_WORLD\n", "rank = comm.Get_rank()\n", "size = comm.Get_size()\n", "\n", "if rank == 0:\n", " data = [x+42 for x in range(size - 1)]\n", " print(\"Worker\", rank, \"send data\", data)\n", " for i in range(1, size):\n", " comm.send(data[i-1], dest=i, tag=11)\n", "else:\n", " d = comm.recv(source=0, tag=11)\n", " print(\"Worker\", rank, \"get data\", d)\n", "```" ] }, { "cell_type": "markdown", "id": "9ebcab56-14a6-4ed1-9cec-c0a37f51ad5f", "metadata": {}, "source": [ "```\n", "Worker 0 send data [42, 43, 44]\n", "Worker 1 get data 42\n", "Worker 3 get data 44\n", "Worker 2 get data 43\n", "```" ] }, { "cell_type": "markdown", "id": "2a0db6fe-9b40-4435-8379-673baf47479c", "metadata": {}, "source": [ "### Пакетное взаимодействие через MPI\n", "\n", "В этом примере процесс с рангом 0 рассылсает данные всем процессам (в том числе себе):" ] }, { "cell_type": "markdown", "id": "48b9794a-0209-45f5-98c8-0dbee96bf27e", "metadata": {}, "source": [ "```python\n", "from mpi4py import MPI\n", "import numpy as np\n", "\n", "comm = MPI.COMM_WORLD\n", "size = comm.Get_size()\n", "rank = comm.Get_rank()\n", "\n", "buffer_before = np.empty([size, 4], dtype='i')\n", "buffer_after = np.empty([size, 4], dtype='i')\n", "\n", "local_buf = np.empty(4, dtype='i')\n", "\n", "if rank == 0:\n", " for i in range(0,size):\n", " buffer_before[i,:] = (i+1)*42\n", " print(\"worker\", rank, \"send data:\\n\", buffer_before)\n", "\n", "comm.Scatter(buffer_before, local_buf, root=0)\n", "\n", "print(\"worker\", rank, \"gets\", local_buf)\n", "\n", "local_buf = local_buf // 2\n", "\n", "print(\"worker\", rank, \"send\", local_buf)\n", "\n", "comm.Gather(local_buf, buffer_after, root=0)\n", "\n", "if rank == 0:\n", " print(\"worker\", rank, \"get data:\\n\", buffer_after)\n", "```" ] }, { "cell_type": "markdown", "id": "9723da5e-6d01-460c-af96-1ca18d10e71e", "metadata": {}, "source": [ "```\n", "worker 0 send data:\n", " [[ 42 42 42 42]\n", " [ 84 84 84 84]\n", " [126 126 126 126]\n", " [168 168 168 168]]\n", "worker 0 gets [42 42 42 42]\n", "worker 2 gets [126 126 126 126]\n", "worker 1 gets [84 84 84 84]\n", "worker 0 send [21 21 21 21]\n", "worker 2 send [63 63 63 63]\n", "worker 1 send [42 42 42 42]\n", "worker 3 gets [168 168 168 168]\n", "worker 3 send [84 84 84 84]\n", "worker 0 get data:\n", " [[21 21 21 21]\n", " [42 42 42 42]\n", " [63 63 63 63]\n", " [84 84 84 84]]\n", " ```" ] }, { "cell_type": "markdown", "id": "c6f54d23-7394-4679-bd88-a0232aa96ae8", "metadata": {}, "source": [ "### Запуска выполнения функции в нескольких процессах через MPIPoolExecutor\n", "\n", "`MPIPoolExecutor` работает также, как и `ProcessPoolExecutor` рассмотренный ранее.\n", "\n", "Процесс в блоке `__main__` имеет `rank = 0`.\n", "\n", "Запуск данного кода следует производить командой:\n", " \n", " mpiexec -n 4 python -m mpi4py.futures file.py" ] }, { "cell_type": "markdown", "id": "fda485fb-ca3a-48de-9876-ad4c4452613b", "metadata": { "scrolled": true }, "source": [ "```python\n", "from mpi4py import MPI\n", "from mpi4py.futures import MPIPoolExecutor\n", "from time import sleep, time\n", "\n", "def work(i):\n", " comm = MPI.COMM_WORLD\n", " rank = comm.Get_rank()\n", " sleep(1)\n", " print(\"worker\", rank, \"done\")\n", " return i\n", "\n", "if __name__ == '__main__':\n", " data = list(range(8))\n", " results = []\n", " \n", " comm = MPI.COMM_WORLD\n", " rank = comm.Get_rank()\n", " \n", " start = time() \n", " with MPIPoolExecutor() as executor:\n", " s = executor.map(work, data)\n", " end = time() \n", " \n", " print(\"worker\", rank, \"done:\", list(s), \"in\", end-start, \"sec\")\n", "```" ] }, { "cell_type": "markdown", "id": "614a0e8a-e858-49bc-ba70-9c9a889456b1", "metadata": {}, "source": [ "```\n", "worker 1 done\n", "worker 3 done\n", "worker 2 done\n", "worker 1 done\n", "worker 3 done\n", "worker 2 done\n", "worker 3 done\n", "worker 2 done\n", "worker 0 done: [0, 1, 2, 3, 4, 5, 6, 7] in 3.0202248096466064 sec\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.13.7" } }, "nbformat": 4, "nbformat_minor": 5 }