Skip to content

Instantly share code, notes, and snippets.

@jcrist
Created August 16, 2019 15:39
Show Gist options
  • Save jcrist/d9f6e6ec35a655348459ccbb26811350 to your computer and use it in GitHub Desktop.
Save jcrist/d9f6e6ec35a655348459ccbb26811350 to your computer and use it in GitHub Desktop.
Benchmarking matmul implementations on small matrices
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matrix Multiplications"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"a = np.random.normal(size=(3, 3))\n",
"b = np.random.normal(size=(3, 3))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.61785409, -0.43972078, 0.52660514],\n",
" [ 0.21376266, 0.17617051, 2.8461124 ],\n",
" [ 0.19882498, -2.43285968, 3.2805902 ]])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a.dot(b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Benchmarking"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from timeit import default_timer\n",
"\n",
"def make_bench(method):\n",
" @nb.jit(nopython=True, fastmath=True)\n",
" def inner(a, b, out, n):\n",
" for _ in range(n):\n",
" method(a, b, out)\n",
" \n",
" def bench(a, b, out, n=1000000):\n",
" # Precompile\n",
" inner(a, b, out, 100)\n",
" \n",
" start = default_timer()\n",
" inner(a, b, out, n)\n",
" end = default_timer()\n",
" return (end - start) / n\n",
" \n",
" return bench"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import numba as nb"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"@nb.jit(nopython=True, fastmath=True)\n",
"def blas_matmul(a, b, out):\n",
" return np.dot(a, b, out)\n",
"\n",
"bench_blas = make_bench(blas_matmul)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"236.9579539999993"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"out = np.zeros((3, 3))\n",
"\n",
"bench_blas(a, b, out) * 1e9"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Naive implementation"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"import numba as nb\n",
"\n",
"def naive_base(a, b, out):\n",
" m = a.shape[1]\n",
" assert b.shape[0] == m\n",
" \n",
" for i in range(a.shape[0]):\n",
" for j in range(b.shape[1]):\n",
" t = 0\n",
" for k in range(m):\n",
" t += a[i, k] * b[k, j]\n",
" out[i, j] = t\n",
" \n",
"naive = nb.jit(nopython=True)(naive_base)\n",
"naive_fastmath = nb.jit(nopython=True, fastmath=True)(naive_base)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.61785409, -0.43972078, 0.52660514],\n",
" [ 0.21376266, 0.17617051, 2.8461124 ],\n",
" [ 0.19882498, -2.43285968, 3.2805902 ]])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"out = np.zeros((3, 3))\n",
"\n",
"naive(a, b, out)\n",
"\n",
"out"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"bench_naive = make_bench(naive)\n",
"bench_naive_fastmath = make_bench(naive_fastmath)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"27.11377199999987"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bench_naive(a, b, out) * 1e9"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Specialized Implementation"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"\n",
"\n",
"def get_filename(_iter=itertools.count()):\n",
" return '<numba-generated-%d>' % next(_iter)\n",
"\n",
"\n",
"def generate_matmul_code(a_shape, b_shape):\n",
" n, m = a_shape\n",
" assert b_shape[0] == m\n",
" p = b_shape[1]\n",
"\n",
" lines = [f\"def matmul_{n}x{m}_{m}x{p}(a, b, out):\"]\n",
" for i in range(n):\n",
" for j in range(p):\n",
" expr = \" + \".join(f\"a[{i},{k}] * b[{k},{j}]\" for k in range(m))\n",
" lines.append(f\" out[{i},{j}] = {expr}\")\n",
" return \"\\n\".join(lines)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"def matmul_3x3_3x3(a, b, out):\n",
" out[0,0] = a[0,0] * b[0,0] + a[0,1] * b[1,0] + a[0,2] * b[2,0]\n",
" out[0,1] = a[0,0] * b[0,1] + a[0,1] * b[1,1] + a[0,2] * b[2,1]\n",
" out[0,2] = a[0,0] * b[0,2] + a[0,1] * b[1,2] + a[0,2] * b[2,2]\n",
" out[1,0] = a[1,0] * b[0,0] + a[1,1] * b[1,0] + a[1,2] * b[2,0]\n",
" out[1,1] = a[1,0] * b[0,1] + a[1,1] * b[1,1] + a[1,2] * b[2,1]\n",
" out[1,2] = a[1,0] * b[0,2] + a[1,1] * b[1,2] + a[1,2] * b[2,2]\n",
" out[2,0] = a[2,0] * b[0,0] + a[2,1] * b[1,0] + a[2,2] * b[2,0]\n",
" out[2,1] = a[2,0] * b[0,1] + a[2,1] * b[1,1] + a[2,2] * b[2,1]\n",
" out[2,2] = a[2,0] * b[0,2] + a[2,1] * b[1,2] + a[2,2] * b[2,2]\n"
]
}
],
"source": [
"print(generate_matmul_code((3, 3), (3, 3)))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def generate_matmul(a_shape, b_shape):\n",
" code = generate_matmul_code(a_shape, b_shape)\n",
" namespace = {}\n",
" funclocals = {}\n",
" exec(compile(code, get_filename(), 'exec'), namespace, funclocals)\n",
" func = list(funclocals.values())[0]\n",
" return nb.jit(nopython=True)(func), nb.jit(nopython=True, fastmath=True)(func)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"specialized, specialized_fastmath = generate_matmul((3, 3), (3, 3))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.61785409, -0.43972078, 0.52660514],\n",
" [ 0.21376266, 0.17617051, 2.8461124 ],\n",
" [ 0.19882498, -2.43285968, 3.2805902 ]])"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"out = np.zeros((3, 3))\n",
"\n",
"specialized(a, b, out)\n",
"\n",
"out"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"bench_specialized = make_bench(specialized)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"18.81342850000003"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bench_specialized(a, b, out, 10000000) * 1e9"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Comparison across size"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"def make_args(n):\n",
" a = np.random.normal(size=(n, n)).astype('f4')\n",
" b = np.random.normal(size=(n, n)).astype('f4')\n",
" out = np.empty((n, n), dtype='f4')\n",
" return a, b, out\n",
"\n",
"\n",
"def bench(start, end):\n",
" results = []\n",
" for n in range(start, end + 1):\n",
" print(\"n = %d\" % n)\n",
" a, b, out = make_args(n)\n",
" \n",
" specialized, specialized_fastmath = generate_matmul((n, n), (n, n))\n",
" bench_specialized = make_bench(specialized)\n",
" bench_specialized_fastmath = make_bench(specialized_fastmath)\n",
"\n",
" \n",
" if n <= 3:\n",
" rounds = 10_000_000\n",
" elif n <= 5:\n",
" rounds = 1_000_000\n",
" elif n <= 8:\n",
" rounds = 500_000\n",
" else:\n",
" rounds = 50_000\n",
"\n",
" t1 = bench_blas(a, b, out, rounds)\n",
" t2 = bench_naive(a, b, out, rounds)\n",
" t3 = bench_naive_fastmath(a, b, out, rounds)\n",
" t4 = bench_specialized(a, b, out, rounds)\n",
" t5 = bench_specialized_fastmath(a, b, out, rounds)\n",
" \n",
" results.append((n, t1, t2, t3, t4, t5))\n",
" \n",
" return pd.DataFrame.from_records(\n",
" results,\n",
" columns=[\"n\", \"OpenBlas\", \"Naive\", \"Naive Fastmath\", \"Specialized\", \"Specialized Fastmath\"]\n",
" ).set_index(\"n\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"n = 2\n",
"n = 3\n",
"n = 4\n",
"n = 5\n",
"n = 6\n",
"n = 7\n",
"n = 8\n",
"n = 9\n",
"n = 10\n",
"n = 11\n",
"n = 12\n"
]
}
],
"source": [
"df = bench(2, 12)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x12c4e4518>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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kUcICAhgx44d2NvbM3DgQBYvXkzv3r2JiYmhWbNmfPbZZ4wYMYJZs2Yxbtw4AKZMmcKiRYu4cOECHTt2xMPD4672DB48mPHjxwPw+uuvs3r1ap5//nkmTpzIuXPncHBwICoqyopXSNO0giQlNYWR20YSlxzH3A5zKWlfMk/l6J5TIaeUynT2V9rxdu3aUaFCBUqUKEH37t3Zvn07GzZsYP/+/Xh5eeHh4cGGDRs4e/YsAMWKFaNz584AeHp6cv78+fQy04b1rl69SkxMDEuXLr2r3k2bNuHj44OrqysbN24kODgYADc3N1599VUWLVpE0aL630Sa9qCacXgG+y7vY6zPWGo71s5zOfqvhBVl18OxlUaNGvHLL7/ccezWrVuEhoZiZ2d3V+ASEZRS9OnTh//+9793lWdvb5+ex87OjuTk5EzT+Pr6snXr1juG6OLj4xk4cCCBgYFUr14df3//9Od51qxZw9atW1m1ahWffPIJwcHBOkhp2gNmd/hufjj0A11qd6Frna73VJbuORVybdu2JTY2loULFwKQkpLC+++/T9++fSlZsiR///03ERERxMXFsXLlSp566inatm3L8uXLuXr1KgARERFcuGD5ivZKKXbu3Ent2nf+qygtEDk5OREdHZ0+gy81NZXQ0FDatGnDl19+SVRUFNHR0db4+pqmFRDX464zausoapatyVife5+QZVFwEhFfETkhIqdFZFQm50VEphrnD4tIk5zyikh5EflbRE4Zr+XMzo020p8QkQ5mxz1F5IhxbqoY/8QXkZYickBEkkWkp1n6NiISZPYTLyLdjHPzReSc2bm7b6AUAiLCihUr+Pnnn3FxcaFu3boUL16czz//HICnn36a119/HQ8PD3r06EHTpk1p2LAhn376Ke3bt8fNzY127doRHh6eY11TpkzBw8ODxo0bk5yczMCBA+847+joyFtvvYWrqyvdunXDy8sLMAXM1157DVdXV5544gmGDRuGo6Oj9S+Gpmn5IiU1hZFbRxKTFMPkVpPzfJ/pDkqpbH8AO+AMUAsoBhwCGmZI0wlYCwjQDNiTU17gS2CU8X4U8IXxvqGRzgGoaeS3M87tBZob9awFOhrHnQE3YCHQM4vvUR6IAEoan+dnlTarH09PT5VRSEjIXccKinnz5qlBgwbldzO0TBTk3xtNy63pB6erxvMbqxWnVmR6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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.plot.line(title=\"Matmul timings\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x12e2ac080>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df['theory'] = 1e-9 * df.index ** 3\n",
"\n",
"df.plot.line(title=\"Matmul timings\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"System info:\n",
"--------------------------------------------------------------------------------\n",
"__Time Stamp__\n",
"2019-08-16 15:38:11.854266\n",
"\n",
"__Hardware Information__\n",
"Machine : x86_64\n",
"CPU Name : haswell\n",
"CPU count : 8\n",
"CPU Features : \n",
"64bit aes avx avx2 bmi bmi2 cmov cx16 f16c fma fsgsbase invpcid lzcnt mmx movbe\n",
"pclmul popcnt rdrnd rtm sahf sse sse2 sse3 sse4.1 sse4.2 ssse3 xsave xsaveopt\n",
"\n",
"__OS Information__\n",
"Platform : Darwin-17.2.0-x86_64-i386-64bit\n",
"Release : 17.2.0\n",
"System Name : Darwin\n",
"Version : Darwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root:xnu-4570.20.62~3/RELEASE_X86_64\n",
"OS specific info : 10.13.1 x86_64\n",
"\n",
"__Python Information__\n",
"Python Compiler : Clang 4.0.1 (tags/RELEASE_401/final)\n",
"Python Implementation : CPython\n",
"Python Version : 3.7.3\n",
"Python Locale : en_US UTF-8\n",
"\n",
"__LLVM information__\n",
"LLVM version : 8.0.0\n",
"\n",
"__CUDA Information__\n",
"Error: CUDA device intialisation problem. Message:Error at driver init: \n",
"[3] Call to cuInit results in CUDA_ERROR_NOT_INITIALIZED:\n",
"Error class: <class 'numba.cuda.cudadrv.error.CudaSupportError'>\n",
"\n",
"__ROC Information__\n",
"ROC available : False\n",
"Error initialising ROC due to : No ROC toolchains found.\n",
"No HSA Agents found, encountered exception when searching:\n",
"Error at driver init: \n",
"\n",
"HSA is not currently supported on this platform (darwin).\n",
":\n",
"\n",
"__SVML Information__\n",
"SVML state, config.USING_SVML : False\n",
"SVML library found and loaded : False\n",
"llvmlite using SVML patched LLVM : True\n",
"SVML operational : False\n",
"\n",
"__Threading Layer Information__\n",
"TBB Threading layer available : False\n",
"+--> Disabled due to : Unknown import problem.\n",
"OpenMP Threading layer available : False\n",
"+--> Disabled due to : Unknown import problem.\n",
"Workqueue Threading layer available : True\n",
"\n",
"__Numba Environment Variable Information__\n",
"None set.\n",
"\n",
"__Conda Information__\n",
"conda_build_version : not installed\n",
"conda_env_version : 4.6.14\n",
"platform : osx-64\n",
"python_version : 3.7.3.final.0\n",
"root_writable : True\n",
"\n",
"__Current Conda Env__\n",
"appnope 0.1.0 py37_0 \n",
"attrs 19.1.0 py37_1 \n",
"backcall 0.1.0 py37_0 \n",
"bleach 3.1.0 py37_0 \n",
"blis 0.2.4 pypi_0 pypi\n",
"bokeh 1.3.4 pypi_0 pypi\n",
"bzip2 1.0.8 h01d97ff_0 conda-forge\n",
"ca-certificates 2019.5.15 1 \n",
"certifi 2019.6.16 py37_1 \n",
"cycler 0.10.0 py_1 conda-forge\n",
"dbus 1.13.6 h90a0687_0 \n",
"decorator 4.4.0 py37_1 \n",
"defusedxml 0.6.0 py_0 \n",
"entrypoints 0.3 py37_0 \n",
"expat 2.2.6 h0a44026_0 \n",
"fastcache 1.1.0 py37h01d97ff_0 conda-forge\n",
"flake8 3.7.7 py37_0 \n",
"freetype 2.10.0 h24853df_1 conda-forge\n",
"gettext 0.19.8.1 h15daf44_3 \n",
"glib 2.56.2 hd9629dc_0 \n",
"gmp 6.1.2 h0a44026_1000 conda-forge\n",
"gmpy2 2.1.0b1 py37h1744cca_0 conda-forge\n",
"icu 58.2 h4b95b61_1 \n",
"ipykernel 5.1.1 py37h39e3cac_0 \n",
"ipython 7.7.0 py37h39e3cac_0 \n",
"ipython_genutils 0.2.0 py37_0 \n",
"ipywidgets 7.5.1 py_0 \n",
"jedi 0.13.3 py37_0 \n",
"jinja2 2.10.1 py37_0 \n",
"jpeg 9b he5867d9_2 \n",
"jsonschema 3.0.1 py37_0 \n",
"jupyter 1.0.0 py37_7 \n",
"jupyter_client 5.3.1 py_0 \n",
"jupyter_console 6.0.0 py37_0 \n",
"jupyter_core 4.5.0 py_0 \n",
"kiwisolver 1.1.0 py37h770b8ee_0 conda-forge\n",
"libblas 3.8.0 12_openblas conda-forge\n",
"libcblas 3.8.0 12_openblas conda-forge\n",
"libcxx 8.0.0 4 conda-forge\n",
"libcxxabi 8.0.0 4 conda-forge\n",
"libffi 3.2.1 h6de7cb9_1006 conda-forge\n",
"libgfortran 4.0.0 1 conda-forge\n",
"libiconv 1.15 hdd342a3_7 \n",
"liblapack 3.8.0 12_openblas conda-forge\n",
"libopenblas 0.3.7 h4bb4525_0 conda-forge\n",
"libpng 1.6.37 h2573ce8_0 conda-forge\n",
"libsodium 1.0.16 h3efe00b_0 \n",
"llvm-openmp 8.0.0 h770b8ee_1 conda-forge\n",
"llvmlite 0.29.0 py37h3fea490_1 conda-forge\n",
"markupsafe 1.1.1 py37h1de35cc_0 \n",
"matplotlib 3.1.1 py37_1 conda-forge\n",
"matplotlib-base 3.1.1 py37h3a684a6_1 conda-forge\n",
"mccabe 0.6.1 py37_1 \n",
"mistune 0.8.4 py37h1de35cc_0 \n",
"mpc 1.1.0 h3aece09_1006 conda-forge\n",
"mpfr 4.0.2 h0a95893_0 conda-forge\n",
"mpmath 1.1.0 py_0 conda-forge\n",
"nbconvert 5.5.0 py_0 \n",
"nbformat 4.4.0 py37_0 \n",
"ncurses 6.1 h0a44026_1002 conda-forge\n",
"notebook 6.0.0 py37_0 \n",
"numba 0.45.1 py37h86efe34_0 conda-forge\n",
"numpy 1.17.0 py37h6b0580a_0 conda-forge\n",
"openssl 1.1.1c h1de35cc_1 \n",
"packaging 19.1 pypi_0 pypi\n",
"pandas 0.25.0 py37h86efe34_0 conda-forge\n",
"pandoc 2.2.3.2 0 \n",
"pandocfilters 1.4.2 py37_1 \n",
"parso 0.5.0 py_0 \n",
"pcre 8.43 h0a44026_0 \n",
"pexpect 4.7.0 py37_0 \n",
"pickleshare 0.7.5 py37_0 \n",
"pillow 6.1.0 pypi_0 pypi\n",
"pip 19.2.2 py37_0 conda-forge\n",
"prometheus_client 0.7.1 py_0 \n",
"prompt_toolkit 2.0.9 py37_0 \n",
"ptyprocess 0.6.0 py37_0 \n",
"pycodestyle 2.5.0 py37_0 \n",
"pyflakes 2.1.1 py37_0 \n",
"pygments 2.4.2 py_0 \n",
"pyparsing 2.4.2 py_0 conda-forge\n",
"pyqt 5.9.2 py37h655552a_2 \n",
"pyrsistent 0.14.11 py37h1de35cc_0 \n",
"python 3.7.3 h93065d6_1 conda-forge\n",
"python-dateutil 2.8.0 py_0 conda-forge\n",
"pytz 2019.2 py_0 conda-forge\n",
"pyyaml 5.1.2 pypi_0 pypi\n",
"pyzmq 18.0.0 py37h0a44026_0 \n",
"qt 5.9.7 h468cd18_1 \n",
"qtconsole 4.5.2 py_0 \n",
"readline 8.0 hcfe32e1_0 conda-forge\n",
"scipy 1.3.1 py37h7e0e109_1 conda-forge\n",
"send2trash 1.5.0 py37_0 \n",
"setuptools 41.0.1 py37_0 conda-forge\n",
"sip 4.19.8 py37h0a44026_0 \n",
"six 1.12.0 py37_0 \n",
"sqlite 3.29.0 hb7d70f7_0 conda-forge\n",
"sympy 1.4 py37_0 conda-forge\n",
"terminado 0.8.2 py37_0 \n",
"testpath 0.4.2 py37_0 \n",
"tk 8.6.9 h2573ce8_1002 conda-forge\n",
"tornado 6.0.3 py37h01d97ff_0 conda-forge\n",
"traitlets 4.3.2 py37_0 \n",
"wcwidth 0.1.7 py37_0 \n",
"webencodings 0.5.1 py37_1 \n",
"wheel 0.33.4 py37_0 conda-forge\n",
"widgetsnbextension 3.5.0 py37_0 \n",
"xz 5.2.4 h1de35cc_1001 conda-forge\n",
"zeromq 4.3.1 h0a44026_3 \n",
"zlib 1.2.11 h01d97ff_1005 conda-forge\n",
"--------------------------------------------------------------------------------\n",
"If requested, please copy and paste the information between\n",
"the dashed (----) lines, or from a given specific section as\n",
"appropriate.\n",
"\n",
"=============================================================\n",
"IMPORTANT: Please ensure that you are happy with sharing the\n",
"contents of the information present, any information that you\n",
"wish to keep private you should remove before sharing.\n",
"=============================================================\n",
"\n"
]
}
],
"source": [
"!numba -s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment