diff options
Diffstat (limited to 'notebook')
-rw-r--r-- | notebook/ldc_benchmark.ipynb | 454 |
1 files changed, 231 insertions, 223 deletions
diff --git a/notebook/ldc_benchmark.ipynb b/notebook/ldc_benchmark.ipynb index 2530f6f..0248e63 100644 --- a/notebook/ldc_benchmark.ipynb +++ b/notebook/ldc_benchmark.ipynb @@ -102,6 +102,36 @@ "metadata": {}, "outputs": [], "source": [ + "def values(data, index):\n", + " return set(map(lambda m: m[0][index], data))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{16, 32, 48, 64, 96, 128}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "values(ldc_3d_D3Q19_k2200, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ "def has(value, options):\n", " if options == None:\n", " return True\n", @@ -116,17 +146,18 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def mlups_for_size(measurement):\n", - " return (measurement[0][0]**2, numpy.average(measurement[1]))" + " dim = len(list(measurement[0][1]))\n", + " return (measurement[0][0]**dim, numpy.average(measurement[1]))" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -136,21 +167,31 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def mlups_per_size_overview_plot(data, title, **kwargs):\n", + " plt.figure(figsize=(10,8))\n", + " plt.grid()\n", + " plt.title(title)\n", + " plt.xscale('log')\n", + " plt.xlabel('Cells')\n", + " plt.ylabel('MLUPS')\n", + " scatter(map(mlups_for_size, subset(data, precision=['single'], optimization=[True], **kwargs)), label='single, CSE')\n", + " scatter(map(mlups_for_size, subset(data, precision=['double'], optimization=[True], **kwargs)), label='double, CSE')\n", + " scatter(map(mlups_for_size, subset(data, precision=['single'], optimization=[False], **kwargs)), label='single, not-CSE')\n", + " scatter(map(mlups_for_size, subset(data, precision=['double'], optimization=[False], **kwargs)), label='double, not-CSE')\n", + " plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "<matplotlib.legend.Legend at 0x7f36603a0080>" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { "image/png": "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ZX19ROHikIuzx/svFJ7XTcfwT4EpFJ7b1yhcGfzT+tQpFZtwul6Stk9E3EghUJywrZPj8yS72OJBCv9zfhNQQWE09BwKX7cyMAtxkpqJ4UySdkA2/TYvpfRkc9dSX9m06aUURqcOBT4C/gB8L6X0WjOWJgnDmSRJUq54zpkkSVKOGM4kSZJypKi/hLZr166pR48eTbKv1atX06FDfb9KSGoaHpfKK49N5VFzH5fTp09fllLaq671ijqc9ejRg7/85S9Nsq/y8nLKysqaZF9SfXlcKq88NpVHzX1cRsR/172W05qSJEm5YjiTJEnKEcOZJElSjhT1OWe1WbduHQsXLmTt2rU7td/OnTsze/bsndqntq1t27bsv//+tG7durlLkSSpyexy4WzhwoV06tSJHj16EBE7rd9Vq1bRqVOnndafti2lxPLly1m4cCE9e/Zs7nIkSWoyu9y05tq1a+nSpctODWZqehFBly5ddvoIqCRJebfLhTPAYLaL8HWUJJWiXTKc5dHll1/OG2+8sV3bzp8/n759+273visrK7nyyivp1asXffr04YQTTuCll14C4Oabb6ZPnz7079+fAQMGVLWXlZXRu3dvBgwYwIABAzj77LO3e/+SJKn+drlzzvLqZz/7WbPt+/LLL6dnz57MnTuXFi1a8M477zB79mxefPFFHn/8cWbMmEGbNm1YtmwZH330UdV2EydOZNCgQc1WtyRJpajkR84mv7KI437we3p+8wmO+8HvmfzKoh3qb/Xq1QwfPpzDDz+cvn378utf/xoojERt+jWDjh078u1vf5vDDz+cwYMH8/777wPw9ttvM3jwYI466iiuv/56OnbsuEX/GzZsYMyYMRx11FH079+fn/70p9us5+233+all17ipptuokWLwst90EEHMXz4cJYsWULXrl1p06YNAF27dqV79+479PglSdKOKelwNvmVRVz78KssWrGGBCxasYZrH351hwLak08+Sffu3Zk5cyavvfYaJ5988hbrrF69msGDBzNz5kxOOOEE7rnnHgBGjx7N6NGjmTZt2lZD0r333kvnzp2ZNm0a06ZN45577uHdd9/daj2vv/46AwYMoGXLllssO+mkk1iwYAGHHHIIX/7yl3nuuedqLL/wwgurpjXHjBnTkKdBkiRtp5IOZ+OemsOadRtqtK1Zt4FxT83Z7j779evHM888wze+8Q2ef/55OnfuvMU6u+22G6eeeioARx55JPPnzwfgxRdf5JxzzgHgggsuqLX/qVOn8otf/IIBAwZwzDHHsHz5cubOnbtdtXbs2JHp06dz9913s9dee3Heeedx3333VS2fOHEiFRUVVFRUMG7cuO3ahyRJapiSPuds8Yo1DWqvj0MOOYTp06fz29/+lmuvvZaTTjqJ66+/vsY6rVu3rroSsWXLlqxfv77e/aeUuPPOOxk2bFi91u/Tpw8zZ85k48aNVdOa1bVs2ZKysjLKysro168fEyZM4NJLL613PZIkaecq6ZGz7nu0a1B7fSxevJj27dvzxS9+kWuuuYYZM2bUe9vBgwfzm9/8BoBJkybVus6wYcP4yU9+wrp16wB46623WL16NQCf+tSntli/V69eDBo0iBtuuIGUEgBz587l0UcfZc6cOTVG3SoqKjjwwAPrXa8kSdr5SnrkbMyw3lz78Ks1pjbbtW7JmGG9t7vPV199lTFjxtCiRQtat27NT37yk3pve9ttt/HFL36RH//4xwwfPrzWKdHLL7+c+fPnM3DgQFJK7LXXXkyePJlly5ZVha/N/exnP+PrX/86Bx98MO3bt6dLly6MGzeOyspKvvKVr7BixQpatWrFwQcfzN1331213YUXXki7doWg2rVrV5555pkGPhuSJKmhYmsf6MVg0KBBadMVkJvMnj2bQw89tN59TH5lEeOemsPiFWvovkc7xgzrzRlH7LfFek3x800ffvgh7dq1IyKYNGkSv/rVr3j00Ufrte3jjz/OO++8w6hRoxq1xqbW0Nez1JSXl1NWVtbcZUhb8NhUHm06Luv72b+zRcT0lFKd31FV0iNnAGccsV+TvCD1MX36dEaOHElKiT322IPx48fXe9tNFxhIkqSt2/RNDZtmzTZ9UwOQmzxQ8uEsT44//nhmzpzZ3GVIkrTL2tY3NRjOJEmSmtjiFWtotfsrtNnrKaL1CtK6PfifD4axeMURzV1aFcOZJEkqGV33eZ01nR8mWhS+9SB2W0HbfR+mXfvdgOHNW1ympL9KQ5IklZY2ez9VFcw2iRbraLP3U81U0ZYcOZMkqRE115WBqt0/1n3QoPbm4MhZIxs7diw/+tGPtmvb++67j5EjR9a6rLYfRa+vdevW8c1vfpNPfvKT9O3bl6OPPprf/e53AIwfP55+/frRv39/+vbtW/VVHpdeeik9e/as+q3NY489drv3L0mlojF+w1k7Zp8O+zSovTk4claCrrvuOpYsWcJrr71GmzZteP/993nuuedYuHAhN998MzNmzKBz585UVlbywQcf/5/EuHHjOPvss5uxckkqLuOemsO6dn+hwz/VPPl83FO7OXrWTEYPHM3YP49l7Ya1VW1tW7Zl9MDRzVhVTY6czXoAbu0LY/co/DvrgR3u8uabb6Z37958/vOfZ86cj39EvaKigsGDB9O/f3/OPPNM/v73vwNQVlbGpi/TXbZsGT169KjaZsGCBZx88sn07t2b7373u7Xub9y4cRx11FH079+fG264YZu1ffjhh9xzzz3ceeedtGnTBoBu3bpx7rnnsnTpUjp16lQ1KtexY0d69uy53c+DJJW6pRv/TNt9H6bFbiuIgBbZyedLN/65uUsrWcMPGs7YY8eyb4d9CYJ9O+zL2GPHMvygfFwMAKUezmY9AFNGwcoFQCr8O2XUDgW06dOnM2nSJF555RUefvhhpk2bVrXs4osv5oc//CGzZs2iX79+Ww1b1b388stMnDiRiooKHnzwQTb/RYSpU6cyd+5cXn75ZSoqKpg+fTp//OMft9rfvHnz+Kd/+id23333LZYdfvjhdOvWjZ49e3LZZZcxZcqUGsvHjBlTNa154YUX1lm7JJW6dt2m1nryebtuU5upIkEhoE09eyqzLpnF1LOn5iqYQamHs2dvhHVraratW1No307PP/88Z555Ju3bt2f33XfntNNOA2DlypWsWLGCz372swBccskl2wxRm5x44ol06dKFdu3acdZZZ/HCCy/UWD516lSmTp3KEUccwcCBA3nzzTdr/Jh5Q7Rs2ZInn3yShx56iEMOOYSrr76asWPHVi0fN24cFRUVVFRUMHHixO3ahySVktRqRYPaJSj1c85WLmxYez1FRIPWb9WqFRs3bgRg7dq1NZZt3tfm91NKXHvttVx55ZX12tfBBx/MX//6163+VmhEcPTRR3P00Udz4oknctlll9UIaJKk+tu3wz4sWb2k1nZpa0p75Kzz/g1rr4cTTjiBRx55hDVr1rBq1aqqqcHOnTuz55578vzzzwNw//33V42i9ejRg+nTpwPw0EMP1ejv6aef5m9/+xtr1qxh8uTJHHfccTWWDxs2jPHjx1NZWQnAokWLWLp0KQBDhw5l0aKa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c6raKyoqGDx4MP379+fMM8/k73//O1AYRdr0ZbrLli2jR48eVdssWLCAk08+md69e/Pd73631v2NGzeOo446iv79+3PDDZv/lOmWevTowQ033MDAgQPp168fb775JgB/+9vfOOOMM+jfvz+DBw9m1qxZzJ8/n7vuuotbb72VAQMG8Pzzz9fo6+233+all17ipptuokWLwuF00EEHMXz4cJYsWULXrl1p06YNAF27dqV79+71fBYlbY/G+M1gSU2rpMPZyilTWHLd9axfvBhSYv3ixSy57vodCmjTp09n0qRJvPLKKzz88MNMmzatatksNS+nAAAeJklEQVTFF1/MD3/4Q2bNmkW/fv22Graqe/nll5k4cSIVFRU8+OCDbP6LCFOnTmXu3Lm8/PLLVFRUMH36dP74xz/W2W/Xrl2ZMWMG//qv/1o17XrDDTdwxBFHMGvWLL73ve9x8cUX06NHD6666iquvvpqKioqOP7442v08/rrrzNgwABatmy5xT5OOukkFixYwCGHHMKXv/xlnnvuuRrLL7zwwqppzTFjxtRZs6S6NcZvBktqWiUdzpbeehtpbc3h/7R2LUtvvW27+3z++ec588wzad++PbvvvjunnXYaACtXrmTFihV89rOfBeCSSy6pV4g68cQT6dKlC+3ateOss87ihRdeqLF86tSpTJ06lSOOOIKBAwfy5ptvMnfu3Dr7PeusswA48sgjmT9/PgAvvPACF110EQBDhgxh+fLlrFy5st6PfXMdO3Zk+vTp3H333ey1116cd9553HfffVXLN4XOiooKxo0bt937kfSxxvjNYElNq6TPOVu/ZEmD2usrIhq0fqtWrdi4cSMAazcLi5v3tfn9lBLXXnstV155ZYP2uWmqsWXLlqxfv76qr81tvr8NGzZw5JFHAnDaaadxySWXMHPmTDZu3Fg1rVldy5YtKSsro6ysjH79+jFhwgQuvfTSBtUqqf42nVdWn98MlpRPJT1y1mrffRvUXh8nnHACjzzyCGvWrGHVqlVMyaZIO3fuzJ577ll1ztb9999fNYrWo0cPpk+fDsBDDz1Uo7+nn36av/3tb6xZs4bJkydz3HHH1Vg+bNgwxo8fT2VlJQCLFi1i6dKlAAwdOpRFixY1qPaJEycChYsAunbtyu67706nTp1YtWoVUAhbm0a7brzxRnr16sWgQYO44YYb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\n", "text/plain": [ "<Figure size 720x576 with 1 Axes>" @@ -163,36 +204,16 @@ } ], "source": [ - "plt.figure(figsize=(10,8))\n", - "plt.grid()\n", - "plt.title('Performance of D2Q9 LDC @ K2200')\n", - "plt.xscale('log')\n", - "plt.xlabel('Cells')\n", - "plt.ylabel('MLUPS')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_k2200, layout=[32], precision=['single'], optimization=[True])), label='single, CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_k2200, layout=[32], precision=['double'], optimization=[True])), label='double, CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_k2200, layout=[32], precision=['single'], optimization=[False])), label='single, not-CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_k2200, layout=[32], precision=['double'], optimization=[False])), label='double, not-CSE')\n", - "plt.legend()" + "mlups_per_size_overview_plot(ldc_2d_k2200, 'Performance of D2Q9 LDC @ K2200', layout=[32])" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "<matplotlib.legend.Legend at 0x7f36600792e8>" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { "image/png": "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8MILXH/99bRqVfg12HfffRk1ahRLliyhR48etGvXDoAePXrQu3fvbfr8kiRp2xncajFl9iKuevBlFi1fQwIWLV/DVQ++vE3h7fHHH6d379689NJLvPLKKxx33HGb1Fm9ejVDhw7lpZde4phjjuGOO+4A4NJLL+XSSy9lxowZdQaou+66i65duzJjxgxmzJjBHXfcwdtvv11nf1599VVKSkpo3br1JttGjBjBggULOPDAA/n617/OM888U237OeecUzlVOmbMmIb8GCRJ0jYwuNViwhOvs2bdhmpla9ZtYMITr291mwMHDuTJJ5/kiiuu4Nlnn6Vr166b1Nlpp5044YQTADjssMN45513APj973/P6aefDsDZZ59da/vTpk3jnnvuoaSkhCOPPJIPP/yQefPmbVVfO3XqxMyZM7n99tvZbbfdOPPMM7n77rsrt0+ePJny8nLKy8uZMGHCVh1DkiQ1XNGCW0T0i4jyKl9/jYhvR8QuETE9IuZl37tn9SMibomI+RExJyIGV2lrdFZ/XkSMLlafKyxevqZB5VviwAMPZObMmQwcOJCrrrqK6667bpM6bdu2rVwx2bp1a9avX7/F7aeUuPXWWysD1dtvv82IESPqrN+/f39eeuklNm7cWOv21q1bU1payrXXXsuPf/xjfv3rX29xXyRJUnEULbillF5PKZWklEqAw4CPgYeAK4GnUkoHAE9l7wGOBw7Ivi4EbgOIiF2AscCRwBHA2IqwVyy9u3VoUPmWWLx4MR07duQrX/kKl19+ObNmzdrifYcOHVoZnO67775a64wcOZLbbruNdevWAfDGG2+wevVqAD71qU9tUn+//fZjyJAhjB07lpQSAPPmzePhhx/m9ddfrzZaV15ezt57773F/ZUkScXRWKtKhwNvppT+HBEnA6VZ+SSgDLgCOBm4JxVSxB8ioltE9MrqTk8pLQOIiOnAccAvitXZMSP7cdWDL1ebLu3QtjVjRvbb6jZffvllxowZQ6tWrWjbti233XbbFu9700038ZWvfIX/+I//YNSoUbVOs15wwQW88847DB48mJQSu+22G1OmTOGDDz6oDGY13XnnnXznO99h//33p2PHjuy6665MmDCBVatW8a1vfYvly5fTpk0b9t9/f26//fbK/c455xw6dCiE2B49evDkk0828KchSZK2RmMFt7P4e9DqmVJaApBSWhIRu2flewILquyzMCurq7xoTjm00PyEJ15n8fI19O7WgTEj+1WWb42RI0cycuTITcrLysoqX69atary9WmnnVZ5j7Q999yTP/zhD0QE9913X+WtOPr27csrr7wCQKtWrbjhhhu44YYbqrX/6KOP8o1vfKPWPnXp0qVyAURNzz//fK3lVfsrSVJLMmX2ou36t78Yoq7RmO12gIidgMVA/5TS+xGxPKXUrcr2j1JK3SPiMeD7KaXnsvKngH8BhgHtUkrXZ+VXAx+nlP6jxnEupDDFSs+ePQ+rOaXYtWtX9t9//+3++TZs2FDryszt6fnnn+fyyy8npUTXrl35z//8T/bbb7+iHrO5mz9/PitWrCjqMVatWlXrrVeUf57blstz23IV+9wuX7OORR+tYWOVXNQqgj27d6Bbh7ZFOy7A5z//+ZkppS26QWpjjLgdD8xKKb2fvX8/Inplo229gKVZ+UJgryr79aEQ+Bby96nVivKymgdJKd0O3A4wZMiQVFpaWm373Llzi/Iw+MZ4yHxdo3U7svbt23PooYcW9RhlZWXU/D1Sy+C5bbk8ty1Xsc/tUT/4LYuWbzoQs2e31vzvlcU7bkM1xu1Avkz169EeASpWho4GHq5Sfl62unQosCKbUn0CGBER3bNFCSOyMkmSpO2iGHeUKIaijrhFREfgWOCiKsU/AO6PiK8B7wKnZ+W/Ab4IzKewAvV8gJTSsoj4HjAjq3ddxUIFSZKk7aF3tw4sqiWkbcsdJYqhqMEtpfQxsGuNsg8prDKtWTcBtV5Fn1KaCEwsRh8lSZKKcUeJYvAh85IkaYdXjDtKFIPBrYmMGzeOTp06cfnllzd437vvvps//vGP/PjHP95kW6dOnardVqQh1q1bx9VXX82vf/1r2rVrR8eOHbn22ms5/vjjmThxIjfeeCMRwcaNGxk/fjwnn3wyX/3qV3nmmWcq7y3XsWPHOm8lIklSc3bKoXs2u6BWk8FNla6++mqWLFnCK6+8Qrt27Xj//fd55plnWLhwIePHj2fWrFl07dqVVatW8Ze//KVyvwkTJlTec06SJBWPD5mvy5z74cYBMK5b4fuc+7e5yfHjx9OvXz++8IUv8Prrf39gfXl5OUOHDmXQoEGceuqpfPTRRwCUlpbyxz/+EYAPPviAvn37Vu6zYMECjjvuOPr168e1115b6/EmTJjA4YcfzqBBgxg7duxm+/bxxx9zxx13cOutt9KuXTsAevbsyRlnnMHSpUvp3Llz5f1zOnXqxD777LPVPwdJkrR1DG61mXM/TL0EViwAUuH71Eu2KbzNnDmT++67j9mzZ/Pggw8yY8aMym3nnXceP/zhD5kzZw4DBw6sM4hV9eKLLzJ58mTKy8v51a9+VRnwKkybNo158+bx4osvUl5ezsyZM/nd735XZ3vz58/nH/7hH+jSpcsm2w455BB69uzJPvvsw/nnn8/UqVOrbR8zZgwlJSWUlJRwzjnn1Nt3SZK0dQxutXnqOlhXY0nwujWF8q307LPPcuqpp9KxY0e6dOnCSSedBMCKFStYvnw5n/vc5wAYPXr0ZgNWhWOPPZZdd92VDh068KUvfYnnnnuu2vZp06Yxbdo0Dj30UAYPHsxrr71W7cHxDdG6dWsef/xxHnjgAQ488EAuu+wyxo0bV7l9woQJlJeXU15ezuTJk7fqGJIkqX5e41abFQsbVr6FIqJB9du0acPGjRsBWLt27Wbbqvk+pcRVV13FRRddxJbYf//9effdd+t8EkREcMQRR3DEEUdw7LHHcv7551cLb5IkqfgccatN1z4NK98CxxxzDA899BBr1qxh5cqVldONXbt2pXv37jz77LMA3HvvvZWjb3379mXmzJkAPPDAA9Xamz59OsuWLWPNmjVMmTKFo446qtr2kSNHMnHixMoVposWLWLp0sLTxYYPH86iRYuq1e/YsSNf+9rXuOSSS/jkk08AWLJkCT//+c9ZvHgxs2bNqqxbXl7O3nvvvdU/C0lS05gyexFH/eC37HPlYxz1g98yZfai+ndSs+KIW22GX1O4pq3qdGnbDoXyrTR48GDOPPNMSkpK2HvvvTn66KMrt02aNImLL76Yjz/+mH333Zef/exnAFx++eWcccYZ3HvvvQwbNqxae5/97Gc599xzmT9/PmeffTZDhlR/Nu2IESOYO3cun/70p4HCgoKf//zn9OjRg/nz57PLLrts0sfrr7+ef/u3f+Pggw+mffv27Lzzzlx33XWsW7eOyy+/nMWLF9O+fXt22203fvKTn1TuN2bMGK6//vrK9y+++CI77bTTVv+sJEnb35TZi6rdYHbR8jVc9eDLAM3+Fhj6uyg8sKBlGTJkSKp5sf7cuXM56KCDtryROfcXrmlbsbAw0jb8Ghh0xibVGuMh89vTK6+8wsSJE/nRj37U1F3ZJg0+n1vBh1W3XJ7blstzW7fCQ9Q3faTTnt068L9XDqtlj+alJZ/biJiZUhpSf01H3Oo26Ixag1reDRgwIPehTZLUcHl5iLo2z2vcJEnaAdT1sPTm9hB1bZ7BTZLUongBfu3GjOxHh7atq5U1x4eoa/OcKpUktRjL16zjqqe8AL82eXmIujbP4CZJajHeX7GWNeuqTyatWbeBCU+8bkAhHw9R1+Y5VSpJajE+2bCx1nIvwFdLYXBrYhdccAF/+tOftmrfd955hwEDBmznHtVtypQpm+3re++9x1lnncV+++3HwQcfzBe/+EXeeOMNNm7cyCWXXMKAAQMYOHAghx9+OG+//TZQuMnwwIEDK591eskllzTWx5HUAu3UuvY/a16Ar5bCqdImdueddzZ1F7bYlClTOOGEEzj44IM32ZZS4tRTT2X06NHcd999QOEJC++//z4zZ85k8eLFzJkzh1atWrFw4UJ23nnnyn2ffvppevTo0WifQ1LL1bNrezq03VB5jRt4Ab5aFkfc6vDYW48x4oERDJo0iBEPjOCxtx7bpvZWr17NqFGjOOSQQxgwYAC//OUvASgtLaXiZsGdOnXiu9/9LocccghDhw7l/fffB+DNN99k6NChHH744VxzzTV06tRpk/Y3bNjAmDFjOPzwwxk0aBA//elP6+1TXcf785//zPDhwxk0aBDDhw/n3Xff5fnnn+eRRx5hzJgxlJSU8Oabb1Zr6+mnn6Zt27ZcfPHFlWUlJSUcffTRLFmyhF69etGqVeHXrU+fPnTv3n0rfoqStHndOrTl+18ayJ7dOhAUbi77/S8N9LoutRgGt1o89tZjjHt+HEtWLyGRWLJ6CeOeH7dN4e3xxx+nd+/evPTSS7zyyiscd9xxm9RZvXo1Q4cO5aWXXuKYY47hjjvuAODSSy/l0ksvZcaMGfTu3bvW9u+66y66du3KjBkzmDFjBnfccUfldGRd6jreN7/5Tc477zzmzJnDOeecwyWXXMJnPvMZTjrpJCZMmEB5eTn77bdftbZeeeUVDjvssFqPc8YZZzB16lRKSkr4zne+w+zZs6tt//znP185VXrjjTduts+SVJ9TDt2T/71yGG//YBT/e+UwQ5taFINbLW6edTNrN6ytVrZ2w1punnXzVrc5cOBAnnzySa644gqeffZZunbtukmdnXbaiRNOOAGAww47jHfeeQeA3//+95x++ukAnH322bW2P23aNO655x5KSko48sgj+fDDD5k3b95m+7S541Uc59xzz+W5555r8Oetqk+fPrz++ut8//vfp1WrVgwfPpynnnqqcvvTTz9NeXk55eXlXHbZZdt0LEna3jMmUnPiNW61eG/1ew0q3xIHHnggM2fO5De/+Q1XXXUVI0aM4Jprqj+0vm3btkQEAK1bt2b9+vVb3H5KiVtvvZWRI0du8T5beryKOlUtWLCAE088EYCLL76Y/v3788ADD9R5rHbt2nH88cdz/PHH07NnT6ZMmcLw4cO3uK+StCVWfLKC65+/vvJ/vitmTABG7TuqCXsmbR+OuNVij533aFD5lli8eDEdO3bkK1/5CpdffjmzZs3a4n2HDh3Kr3/9a4DKC/9rGjlyJLfddhvr1q0D4I033mD16tUAfOpTn2pQXz/zmc9UHmfy5Ml89rOfBaBz586sXLkSgL322qtylOziiy9m2LBh/O1vf6ucbgWYMWMGzzzzDLNmzWLx4sUAbNy4kTlz5rD33ns3qE+StCWWrl663WdMpObE4FaLSwdfSvvW7auVtW/dnksHX7rVbb788sscccQRlJSUMH78eP7t3/5ti/e96aab+NGPfsQRRxzBkiVLap1mveCCCzj44IMZPHgwAwYM4KKLLmL9+vV88MEHpJQa1NdbbrmFn/3sZwwaNIh7772Xm28u/AfvrLPOYsKECRx66KGbLE6ICB566CGmT5/OfvvtR//+/Rk3bhy9e/dm6dKlnHjiiQwYMIBBgwbRpk0bvvnNb1buW/Uat/POO69BfZWkqtZtXFdr+bbMmEjNSTT0j3oeDBkyJFWs1Kwwd+5cDjrooC1u47G3HuPmWTfz3ur32GPnPbh08KW1DrOvXLmSzp07b3OfN+fjjz+mQ4cORAT33Xcfv/jFL3j44Ye3aN9HH32Ut956q8XdH62h53NrlJWVUVpaWtRjqGl4bluuOx66g1v+essm5b127sW006Y1QY+0vbTkf7cRMTOlNGRL6nqNWx1G7Tuq2VwPMXPmTL75zW+SUqJbt25MnDhxi/etWHwgSTuC3Xfenfar21ebLt3WGROpOTG45cDRRx/NSy+91NTdkKRmr+tOXRn3mXFbNGMi5ZHBTZLUojSnGRNpe3NxgiRJUk4Y3CRJknLC4CZJkpQTBrcmMm7cOP793/99q/a9++67q90HraraHkBfLGVlZTz//PN1bl+1ahUXXXRR5X3djjnmGF544QUAxo8fT//+/Rk0aBAlJSWV5aWlpfTr16/yvm6nnXZao3wWSZLywMUJ2mplZWV06tSJz3zmM7Vuv+CCC9hnn32YN28erVq14q233mLu3Ln8/ve/59FHH2XWrFm0a9eODz74gE8++aRyv8mTJzNkyBbdzkaSpB2KI251WDF1KvOGDWfuQQczb9hwVkydus1tjh8/nn79+vGFL3yB119/vbK8vLycoUOHMmjQIE499VS1+TMoAAAgAElEQVQ++ugjoDD6VHEj4Q8++IC+fftW7rNgwQKOO+44+vXrx7XXXlvr8SZMmMDhhx/OoEGDGDt2bL3969u3L2PHjmXw4MEMHDiQ1157DYBly5ZxyimnMGjQIIYOHcqcOXN45513+MlPfsKNN95ISUkJzz77bLW23nzzTV544QWuv/56WrUq/Jrtu+++jBo1iiVLltCjRw/atWsHQI8ePejdu/cW/hQlSdpxGdxqsWLqVJZcfQ3rFy+GlFi/eDFLrr5mm8LbzJkzue+++5g9ezYPPvggM2bMqNx23nnn8cMf/pA5c+YwcODAOoNYVS+++CKTJ0+mvLycX/3qV9R8UsS0adOYN28eL774IuXl5cycOZPf/e539bbbo0cPZs2axT//8z9XTuWOHTuWQw89lDlz5nDDDTdw3nnn0bdvXy6++GIuu+wyysvLOfroo6u18+qrr1JSUkLr1q03OcaIESNYsGABBx54IF//+td55plnqm0/55xzKqdKx4wZU2+fJUnaURjcarH0xptIa6s/pDitXcvSG2/a6jafffZZTj31VDp27EiXLl046aSTAFixYgXLly/nc5/7HACjR4/eooB17LHHsuuuu9KhQwe+9KUv8dxzz1XbPm3aNKZNm8ahhx7K4MGDee2115g3b1697X7pS18C4LDDDuOdd94B4LnnnuPcc88FYNiwYXz44YesWLFiiz97TZ06dWLmzJncfvvt7Lbbbpx55pncfffdldsrAml5eTkTJkzY6uNIktTSeI1bLdYvWdKg8i0VEQ2q36ZNGzZu3AjA2hpBsmZbNd+nlLjqqqu46KKLGnTMiunL1q1bs379+sq2aqp5vA0bNnDYYYcBcNJJJzF69GheeuklNm7cWDlVWlXr1q0pLS2ltLSUgQMHMmnSJL761a82qK+SJO1oHHGrRZtevRpUviWOOeYYHnroIdasWcPKlSuZmk27du3ale7du1deI3bvvfdWjr717duXmTNnAvDAAw9Ua2/69OksW7aMNWvWMGXKFI466qhq20eOHMnEiRNZtWoVAIsWLWLp0qUADB8+nEWLFjWo75MnTwYKCxJ69OhBly5d6Ny5MytXrgQKQaxilOy6665jv/32Y8iQIYwdO7Yy+M2bN4+HH36Y119/vdroX3l5OXvvvfcW90eSpB2VI2612P2yb7Pk6muqTZdG+/bsftm3t7rNwYMHc+aZZ1JSUsLee+9d7ZqwSZMmcfHFF/Pxxx+z77778rOf/QyAyy+/nDPOOIN7772XYcOGVWvvs5/9LOeeey7z58/n7LPP3mQV5ogRI5g7dy6f/vSngcL05M9//nN69OjB/Pnz2WWXXba47+PGjeP8889n0KBBdOzYkUmTJgFw4oknctppp/Hwww9z6623bnKd25133sl3vvMd9t9/fzp27Miuu+7KhAkTWLVqFd/61rdYvnw5bdq0Yf/99+f222+v3O+cc86hQ4cOQOGauyeffHKL+ypJUksWtU2D5d2QIUNSzYv1586dy0EHHbTFbayYOpWlN97E+iVLaNOrF7tf9m26nnjiJvVWrlxJ586dt7nPjeWVV15h4sSJ/OhHP2rqrmyThp7PrVFWVkZpaWlRj6Gm4bltuTy3LVdLPrcRMTOltEX3wXLErQ5dTzyx1qCWdwMGDMh9aJMkaUflNW6SJEk5YXCTJEnKiR0quLXE6/l2RJ5HSdKOaocJbu3bt+fDDz/0j37OpZT48MMPad++fVN3RZKkRrfDLE7o06cPCxcu5C9/+ct2bXft2rWGiEbWvn17+vTp09TdkCSp0e0wwa1t27bss88+273dsrIyDj300O3eriRJUk1FnSqNiG4R8UBEvBYRcyPi0xGxS0RMj4h52ffuWd2IiFsiYn5EzImIwVXaGZ3VnxcRo4vZZ0mSpOaq2Ne43Qw8nlL6FHAIMBe4EngqpXQA8FT2HuB44IDs60LgNoCI2AUYCxwJHAGMrQh7kiRJO5KiBbeI6AIcA9wFkFL6JKW0HDgZmJRVmwSckr0+GbgnFfwB6BYRvYCRwPSU0rKU0kfAdOC4YvVbkiSpuSrmiNu+wF+An0XE7Ii4MyJ2BnqmlJYAZN93z+rvCSyosv/CrKyuckmSpB1KMRcntAEGA99KKb0QETfz92nR2kQtZWkz5dV3jriQwhQrPXv2pKysrMEd3hqrVq1qtGOpcXluWy7PbcvluW25PLcFxQxuC4GFKaUXsvcPUAhu70dEr5TSkmwqdGmV+ntV2b8PsDgrL61RXlbzYCml24HbofCQ+cZ6EG1Lfujtjs5z23J5blsuz23L5bktKNpUaUrpPWBBRPTLioYDfwIeASpWho4GHs5ePwKcl60uHQqsyKZSnwBGRET3bFHCiKxMkiRph1Ls+7h9C5gcETsBbwHnUwiL90fE14B3gdOzur8BvgjMBz7O6pJSWhYR3wNmZPWuSyktK3K/JUmSmp2iBreUUjkwpJZNw2upm4Bv1NHORGDi9u2dJElSvuwwzyqVJEnKO4ObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5UdTgFhHvRMTLEVEeEX/MynaJiOkRMS/73j0rj4i4JSLmR8SciBhcpZ3RWf15ETG6mH2WJElqrhpjxO3zKaWSlNKQ7P2VwFMppQOAp7L3AMcDB2RfFwK3QSHoAWOBI4EjgLEVYU+SJGlH0hRTpScDk7LXk4BTqpTfkwr+AHSLiF7ASGB6SmlZSukjYDpwXGN3WpIkqakVO7glYFpEzIyIC7OynimlJQDZ992z8j2BBVX2XZiV1VUuSZK0Q2lT5PaPSiktjojdgekR8dpm6kYtZWkz5dV3LgTDCwF69uxJWVnZVnS34VatWtVox1Lj8ty2XJ7blstz23J5bguKGtxSSouz70sj4iEK16i9HxG9UkpLsqnQpVn1hcBeVXbvAyzOyktrlJfVcqzbgdsBhgwZkkpLS2tWKYqysjIa61hqXJ7blstz23J5blsuz21B0aZKI2LniOhc8RoYAbwCPAJUrAwdDTycvX4EOC9bXToUWJFNpT4BjIiI7tmihBFZmSRJ0g6lmCNuPYGHIqLiOP+dUno8ImYA90fE14B3gdOz+r8BvgjMBz4GzgdIKS2LiO8BM7J616WUlhWx35IkSc1S0YJbSukt4JBayj8EhtdSnoBv1NHWRGDi9u6jJElSnvjkBEmSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScsLgJkmSlBMGN0mSpJwwuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJEmScqLowS0iWkfE7Ih4NHu/T0S8EBHzIuKXEbFTVt4uez8/2963ShtXZeWvR8TIYvdZkiSpOWqMEbdLgblV3v8QuDGldADwEfC1rPxrwEcppf2BG7N6RMTBwFlAf+A44L8ionUj9FuSJKlZKWpwi4g+wCjgzux9AMOAB7Iqk4BTstcnZ+/Jtg/P6p8M3JdS+ltK6W1gPnBEMfstSZLUHBV7xO0m4F+Ajdn7XYHlKaX12fuFwJ7Z6z2BBQDZ9hVZ/cryWvaRJEnaYbQpVsMRcQKwNKU0MyJKK4prqZrq2ba5faoe70LgQoCePXtSVlbW0C5vlVWrVjXasdS4PLctl+e25fLctlye24KiBTfgKOCkiPgi0B7oQmEErltEtMlG1foAi7P6C4G9gIUR0QboCiyrUl6h6j6VUkq3A7cDDBkyJJWWlhbjM22irKyMxjqWGpfntuXy3LZcntuWy3NbULSp0pTSVSmlPimlvhQWF/w2pXQO8DRwWlZtNPBw9vqR7D3Z9t+mlFJWfla26nQf4ADgxWL1W5Ikqbkq5ohbXa4A7ouI64HZwF1Z+V3AvRExn8JI21kAKaVXI+J+4E/AeuAbKaUNjd9tSZKkptUowS2lVAaUZa/fopZVoSmltcDpdew/HhhfvB5KkiQ1fz45QZIkKScMbpIkSTlhcJMkScoJg5skSVJONMWqUknSNpgyexETnnidxcvX0LtbB8aM7Mcph/pAGWlHYHCTpByZMnsRVz34MmvWFe6KtGj5Gq568GUAw5u0A3CqVJJyZMITr1eGtgpr1m1gwhOvN1GPJDUmg5sk5cji5WsaVC6pZTG4SVKO9O7WoUHlkloWg5sk5ciYkf3o0LZ1tbIObVszZmS/JuqRpMbk4gRJypFTDt2Tlz76Lb9++w42tv6IVhu684/7/B8XJkg7iAaNuEVE24g4NCJ2L1aHJEl1e+ytx3h08S2kNh8RAanNRzy6+BYee+uxpu6apEaw2eAWET+JiP7Z667AS8A9wOyI+HIj9E+SVMXNs25m7Ya11crWbljLzbNubqIeSWpM9Y24HZ1SejV7fT7wRkppIHAY8C9F7ZkkaRPvrX6vQeWSWpb6gtsnVV4fC0wBSCn5XwhJagJ77LxHg8oltSz1BbflEXFCRAwGjgIeB4iINoBrzyWpkV06+FLat25frax96/ZcOvjSJuqRpMZU36rSi4BbgD2Ab1cZaRsOeCWsJDWyUfuOAgrXur23+j322HkPLh18aWW5tFlz7oenroMVC6FrHxh+DQw6o6l7pQbYbHBLKb0BHBcRPVJKH1QpfwJ4otidkyRtatS+owxqarg598PUS2Bd9pSNFQsK78HwliP1rSo9MSL+AsyJiIUR8ZlG6pckSdqenrru76Gtwro1hXLlRn3XuI2nsLK0N/CPwPeL3yVJkrTdrVjYsHI1S/UFt/UppdcAUkovAJ2L3yVJkrTdde3TsHI1S/UtTtg9Iv5vXe9TSj8qTrckSdJ2Nfya6te4AbTtUChXbtQX3O6g+ihbzfeSJDUvrpysXcXPwJ9NrtW3qvTaxuqIJEnbbM1HrpzcnEFn+HPYnByE/s0Gt4i4pUZRAj4Ank4pPVe0XkmStDVWLql75WQz+wOsZiYnt0upb3HCzBpfs4BVwISI+HaR+yZJUsNs+KT2cldOqj45uV1KfVOlk2orj4ifAM8DNxWjU5IkbZXWO9Ve7spJ1Scnt0upb8StVimlNfXXkiSpkXXuVVgpWZUrJ7UlcnK7lAYHt4hoExHnA80rgkqS1KE7nHgLdN0LiML3E29pVtcoqZkafk0uQn99ixNWUliQUNUa4BkKD6CXJKl5ceWktkZObpdS3zVudd6zLSJ6b//uSJIkNZEchP6tusYt84ft1gtJkiTVa1uCW2y3XkiSJKle2xLcal77JklqDHPuhxsHwLhuhe9z7m/qHklqJPUtTriV2gNaAN2K0iNJUt1ycnd3ScVR30Pm/7iV2yRJxbC5u7sb3KQWb6uenCBJaiI5ubu7pOKob6r0kc1tTymdtH27I0narK59CtOjtZVLavHqmyr9NLAA+AXwAq4klaSmNfya6te4QbO8u7uk4qgvuO0BHAt8GTgbeAz4RUrp1WJ3TJJUi5zc3V1ScdR3jdsG4HHg8YhoRyHAlUXEdSmlWxujg5KkGnJwd3dJxVHfiBtZYBtFIbT1BW4BHixutyRJklRTfYsTJgEDgP8Brk0pvdIovZIkSdIm6htxOxdYDRwIXBJRuTYhgJRS6lLEvkmSJKmK+q5x25ZHYkmSJGk7MphJkiTlhMFNkiQpJwxukiRJOVG04BYR7SPixYh4KSJejYhrs/J9IuKFiJgXEb+MiJ2y8nbZ+/nZ9r5V2roqK389IkYWq8+SJEnNWTFH3P4GDEspHQKUAMdFxFDgh8CNKaUDgI+Ar2X1vwZ8lFLaH7gxq0dEHAycBfQHjgP+KyJaF7HfkiRJzVLRglsqWJW9bZt9JWAY8EBWPgk4JXt9cvaebPvwKNx/5GTgvpTS31JKbwPzgSOK1W9JkqTmqqjXuEVE64goB5YC04E3geUppfVZlYXAntnrPSk80J5s+wpg16rltewjSZK0w6j3kVfbInvWaUlEdAMeAg6qrVr2PerYVld5NRFxIXAhQM+ePSkrK9uaLjfYqlWrGu1Yalye25bLc9tyeW5bLs9tQVGDW4WU0vKIKAOGAt0iok02qtYHWJxVWwjsBSyMiDZAV2BZlfIKVfepeozbgdsBhgwZkkpLS4vzYWooKyujsY6lxuW5bbk8ty2X57bl8twWFHNV6W7ZSBsR0QH4AjAXeBo4Las2Gng4e/1I9p5s+29TSikrPytbdboPcADwYrH6LUmS1FwVc8StFzApWwHaCrg/pfRoRPwJuC8irgdmA3dl9e8C7o2I+RRG2s4CSCm9GhH3A38C1gPfyKZgJUmSdihFC24ppTnAobWUv0Utq0JTSmuB0+toazwwfnv3UZIkKU98coIkSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSWpRVkydyrxhw5l70MHMGzacFVOnNnWXpO2mTVN3QJKk7WXDihUsGTuOtHYtAOsXL2bJ1dcA0PXEE5uya9J24YibJKnFWP/++5WhrUJau5alN97URD2Sti+DmySpxUjr1tVavn7JkkbuiVQcBjdJUosRbdvWWt6mV69G7olUHAY3SVKL0aZnT6J9+2pl0b49u1/27SbqkbR9GdwkSS1G665d6fW962jTuzdE0KZ3b3p97zoXJqjFcFWpJKlF6XriiQY1tViOuEmSJOWEwU2SJCknDG6SJEk5YXCTJEnKCYObJElSThjcJClnfIi6tOPydiCSlCMrpk5lydXX+BB1aQfliJsk5cjSG2/yIerSDszgJkk5UtfD0n2IurRjMLhJUo7U9bB0H6Iu7RgMbpKUI7tf9m0foi7twFycIEk5UrEAYemNN7F+yRLa9OrF7pd924UJ0g7C4CZJOeND1KUdl1OlkiRJOWFwkyRJygmDmyRJUk4Y3CRJknLC4CZJkpQTBjdJkqScMLhJkiTlhMFNkiQpJ4oW3CJir4h4OiLmRsSrEXFpVr5LREyPiHnZ9+5ZeUTELRExPyLmRMTgKm2NzurPi4jRxeqzJElSc1bMEbf1wHdSSgcBQ4FvRMTBwJXAUymlA4CnsvcAxwMHZF8XArdBIegBY4EjgSOAsRVhT5IkaUdStOCWUlqSUpqVvV4JzAX2BE4GJmXVJgGnZK9PBu5JBX8AukVEL2AkMD2ltCyl9BEwHTiuWP2WJElqrhrlGreI6AscCrwA9EwpLYFCuAN2z6rtCSyostvCrKyuckmSpB1K0R8yHxGdgF8D304p/TUi6qxaS1naTHnN41xIYYqVnj17UlZWtlX9bahVq1Y12rHUuDy3LZfntuXy3LZcntuCoga3iGhLIbRNTik9mBW/HxG9UkpLsqnQpVn5QmCvKrv3ARZn5aU1ystqHiuldDtwO8CQIUNSaWlpzSpFUVZWRmMdS43Lc9tyeW5bLs9ty+W5LSjmqtIA7gLmppR+VGXTI0DFytDRwMNVys/LVpcOBVZkU6lPACMionu2KGFEViZJkrRDKeaI21HAucDLEVGelf0r8APg/oj4GvAucHq27TfAF4H5wMfA+QAppWUR8T1gRlbvupTSsiL2W5IkqVkqWnBLKT1H7denAQyvpX4CvlFHWxOBiduvd5IkSfnjkxMkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOFC24RcTEiFgaEa9UKdslIqZHxLzse/esPCLiloiYHxFzImJwlX1GZ/XnRcToYvVXkiSpuSvmiNvdwHE1yq4EnkopHQA8lb0HOB44IPu6ELgNCkEPGAscCRwBjK0Ie5IkSTuaNsVqOKX0u4joW6P4ZKA0ez0JKAOuyMrvSSkl4A8R0S0iemV1p6eUlgFExHQKYfAXxeq3pOZhyuxFTHjidRYvX0Pvbh0YM7Ifpxy6Z1N3S5KaVNGCWx16ppSWAKSUlkTE7ln5nsCCKvUWZmV1lUtqwabMXsSrP7mQH85+i+5/hY+6wDNv7wsX3254k7RDa+zgVpeopSxtpnzTBiIupDDNSs+ePSkrK9tunducVatWNdqx1Lg8t03nb+/OZ/AhX2TVIFiVlQ0O+OvL/0PZiv23uX3PbcvluW25PLcFjR3c3o+IXtloWy9gaVa+ENirSr0+wOKsvLRGeVltDaeUbgduBxgyZEgqLS2trdp2V1ZWRmMdS43Lc9t0njvin9n1r5uWf9gFPvvi3G1u33PbcnluWy7PbUFj3w7kEaBiZeho4OEq5edlq0uHAiuyKdUngBER0T1blDAiK5PUgnWvJbRtrlySdhRFG3GLiF9QGC3rERELKawO/QFwf0R8DXgXOD2r/hvgi8B84GPgfICU0rKI+B4wI6t3XcVCBUkt1/IusEstIW15l8bviyQ1J8VcVfrlOjYNr6VuAr5RRzsTgYnbsWuSmrl1/3gEf7v3Rdqt/3vZ39oUyiVpR+aTEyQ1O6VXTGL5uUewrAtsBJZ1geXnHkHpFZOaumuS1KSay6pSSaqm9IpJhbs8SpIqOeImSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmSZKUEwY3SZKknDC4SZIk5YTBTZIkKScMbpIkSTlhcJMkScoJg5skSVJOGNwkSZJywuAmNZEVU6cyb9hw5h50MPOGDWfF1KlN3SVJUjPXpqk7IO2IVkydysLvXkWrTzYAsH7xYhZ+9yoAup54YlN2TZLUjDniJjWBP39/XGVoq9Dqkw38+fvj/n979x9rdV3Hcfz5FhIsvECktAtmmohoYzqJXFN3aYW4OTW3QMpWizRbtmVbyxnzR6Nya3OZupSV0j+Jd80cJRv0Y0w0N9HpmGgWsTbZzUABb0xAkHd/nIO74D1wzuWe8z3fc56P7ezy/Xw/53tel/f93u/7fr/fs1NMIElSKdi4SQUYu+PthsYlSQIbN6kQb/Q0Ni5JEti4SYV44mLYe8QdpnvHVsYlSarFxk1db8OqB3n9jrM4ePtEXr/jLDaserDpr7l9+kU8vAC298BBKl8fXlAZlySpFt9Vqq62YdWDvPXEXbzzwnjeHOxlVw/s+c9dbADomdm0171y3jL6/3Qrd97wHNvHBqccSKbumMPCecua9pqSpPKzcVNX2/7E3fQ+PZ5xByrLHx6EfU+PZ4C7+eDi5p15u/qCacBP+NmaV/nfrj2cPOkkFl42szouSdLwbNzU1Sa+cMJ7Tdsh4w5Uxvcvbu5rX33BNBs1SVJDvMdNXW3SYGPjkiQVyTNuapr+pYvoXbuRyYOwswcG5s9m4bJHi451mJ09JzBl8OCw45IktRuPTmqK/qWLOPvxjUwZrPyQTRmEsx/fSP/SRUVHO8yBby5i3xF/vuwbWxmXJKndlKZxi4gFEfFqRGyOiFuKznPIzoEtPDV3FpvOmcVTc2e1XWNSlN61G4e9d6x37cZiAtXQt+Q2dt28mB0Tx3AQ2DFxDLtuXkzfktuKjiZJ0vuU4lJpRIwB7gc+D2wFNkTEqsx8uchc/UsXcXLvpUyp3g81ZRAmPL6Rfha13SXBVptc4x6xWuNF6ltyG9ioSZJKoCxn3OYCmzNzS2a+A6wErio4E71rNxJ5+Fg7nlUqws4aH91Ua1ySJB1bWRq3acBrQ5a3VscKVaazSq02MH/2sPeODcyfXUwgSZI6QGTmsWcVLCK+CFyWmd+oLn8FmJuZ3xky5wbgBoCpU6deuHLlyqbn2v33TRyccionbtt22PiBMTDhnPOa/vrtbufAFj4wuIex71LcmxIAAAZMSURBVFb+T/b3nMTk3jOLjlW33bt3M2HChKJjqAmsbeeytp2rk2s7b9685zNzTj1zS3GPG5UzbKcNWZ4ODAydkJnLgeUAc+bMyb6+vqaH6v/zLzn54KWcfu99743tGwv/uHo2V9z47aa/fvvrKzrAcVm3bh2t+DlS61nbzmVtO5e1rSjLpdINwIyIOCMiTgSuBVYVnImFyx5l76STeLP6QeFv9lSatm5/Y4IkSWqOUpxxy8wDEXETsAYYAzyUmZsKjgXA5N4zufjZV4qOIUmSukApGjeAzFwNrC46hyRJUlHKcqlUkiSp69m4SZIklYSNmyRJUknYuEmSJJWEjZskSVJJ2LhJkiSVhI2bJElSSdi4SZIklYSNmyRJUknYuEmSJJWEjZskSVJJ2LhJkiSVhI2bJElSSdi4SZIklYSNmyRJUknYuEmSJJWEjZskSVJJRGYWnWHURcR2YBfw1lGmTTzK+lrrhhv/CPBGoxmb6GjfVxHbbPS59cw/1hxr25ptWtvRY22tbau22chz651rbY/f6Zl5Sl0zM7MjH8Dyka6vtW64ceC5or/XRr7vVm+z0efWM9/atsc2rW171MHaWttmPbfeuda2tY9OvlT6h+NYX2vdsbbZDpqR8Xi22ehz65lvbdtjm9Z29Fhba9uqbTby3HrnWtsW6shLpa0UEc9l5pyic2j0WdvOZW07l7XtXNa2opPPuLXK8qIDqGmsbeeytp3L2nYua4tn3CRJkkrDM26SJEklYeMmSZJUEjZukiRJJWHjNsoiYlZEPBARv4uIbxWdR6MrIj4UEc9HxBVFZ9HoiYi+iFhf3Xf7is6j0RMRJ0TEjyPi3oj4atF5NHoi4pLqPvuriPhb0XlaxcatDhHxUERsi4iXjhhfEBGvRsTmiLgFIDNfycwbgYVA179tud01UtuqHwD9rU2pkWiwtgnsBsYDW1udVY1psLZXAdOA/Vjbttfg8XZ99Xj7R+A3ReQtgo1bfVYAC4YORMQY4H7gcuBcYHFEnFtddyXwFPCX1sbUCKygztpGxOeAl4H/tjqkRmQF9e+36zPzciqN+Z0tzqnGraD+2s4EnsnM7wFeBWl/K2jgeFv1JeCRVgUsmo1bHTLzSWDHEcNzgc2ZuSUz3wFWUvnLjsxclZmfAb7c2qRqVIO1nQdcROWXxPUR4f7TxhqpbWYerK7fCYxrYUyNQIP77VYqdQV4t3UpNRKNHm8j4mPAW5k52NqkxRlbdIASmwa8NmR5K/Dp6v0x11D55b+6gFw6fsPWNjNvAoiIrwFvDDnYqzxq7bfXAJcBk4D7igim4zZsbYF7gHsj4hLgySKC6bjVqi3AEuDhlicqkI3byMUwY5mZ64B1rY2iUTZsbd/7R+aK1kXRKKu13z4GPNbqMBpVtWr7NpWDu8qr5u/kzLy9xVkK56WekdsKnDZkeTowUFAWjS5r27msbeeytp3L2g5h4zZyG4AZEXFGRJwIXAusKjiTRoe17VzWtnNZ285lbYewcatDRDwCPAPMjIitEbEkMw8ANwFrgFeA/szcVGRONc7adi5r27msbeeytsfmh8xLkiSVhGfcJEmSSsLGTZIkqSRs3CRJkkrCxk2SJKkkbNwkSZJKwsZNkiSpJGzcJHW9iPhoRKyMiH9FxMsRsToizj7K/N3Vrx+PiJdal1RSt7Nxk9TVIiKA3wPrMvMTmXkucCswtdhkkvR+Nm6Sut08YH9mPnBoIDNfzMz1EfH9iNgQERsj4s6jbSQizouIZyPixer8GU1PLqnr2LhJ6nafBJ4/cjAi5gMzgLnA+cCFEXHpUbZzI3BPZp4PzKHywdiSNKrGFh1AktrU/OrjheryBCqN3JM15j8D/DAipgOPZeY/mx9RUrfxjJukbrcJuHCY8QB+mpnnVx9nZeava20kM38LXAnsAdZExGebE1dSN7Nxk9Tt/gqMi4jrDw1ExKeAQeDrETGhOjYtIk6ttZGIOBPYkpm/AFYBs5sbW1I38lKppK6WmRkRXwB+HhG3AHuBfwPfBXYBz1TeeMpu4DpgW41NLQKui4j9wOvAj5ocXVIXiswsOoMkSZLq4KVSSZKkkrBxkyRJKgkbN0mSpJKwcZMkSSoJGzdJkqSSsHGTJEkqCRs3SZKkkrBxkyRJKon/A4+80CPQ8mnIAAAAAElFTkSuQmCC\n", "text/plain": [ "<Figure size 720x576 with 1 Axes>" @@ -205,46 +226,16 @@ } ], "source": [ - "plt.figure(figsize=(10,8))\n", - "plt.grid()\n", - "plt.title('Performance of D2Q9 LDC @ Tesla P100')\n", - "plt.xscale('log')\n", - "plt.xlabel('Cells')\n", - "plt.ylabel('MLUPS')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_p100, layout=[32], precision=['single'], optimization=[True])), label='single, CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_p100, layout=[32], precision=['double'], optimization=[True])), label='double, CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_p100, layout=[32], precision=['single'], optimization=[False])), label='single, not-CSE')\n", - "scatter(map(mlups_for_size, subset(ldc_2d_p100, layout=[32], precision=['double'], optimization=[False])), label='double, not-CSE')\n", - "plt.legend()" + "mlups_per_size_overview_plot(ldc_2d_p100, 'Performance of D2Q9 LDC @ Tesla P100', layout=[32])" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def mlups_for_size_3d(measurement):\n", - " return (measurement[0][0]**3, numpy.average(measurement[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "<matplotlib.legend.Legend at 0x7f364c1217b8>" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { "image/png": "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 |