Skip to content

Instantly share code, notes, and snippets.

@antimon2
Last active July 16, 2021 10:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antimon2/dd23b1e62d5fcd08d91fd420d7ba996d to your computer and use it in GitHub Desktop.
Save antimon2/dd23b1e62d5fcd08d91fd420d7ba996d to your computer and use it in GitHub Desktop.
Mandelbrot.mt.cu.jl.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "original: https://twitter.com/dhotta_met/status/1415957677650243593"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:43:59.447Z",
"end_time": "2021-07-16T19:43:59.995000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "versioninfo()",
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": "Julia Version 1.6.1\nCommit 6aaedecc44 (2021-04-23 05:59 UTC)\nPlatform Info:\n OS: Linux (x86_64-pc-linux-gnu)\n CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz\n WORD_SIZE: 64\n LIBM: libopenlibm\n LLVM: libLLVM-11.0.1 (ORCJIT, skylake)\nEnvironment:\n JULIA_NUM_THREADS = 10\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.220Z",
"end_time": "2021-07-16T19:44:04.692000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "]activate .",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.221Z",
"end_time": "2021-07-16T19:44:08.106000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "using Plots\ngr(fmt=:png)",
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 3,
"data": {
"text/plain": "Plots.GRBackend()"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.222Z",
"end_time": "2021-07-16T19:44:09.376000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "replace_nan_inf(a) = isnan(a) ? oftype(a, Inf) : a",
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 4,
"data": {
"text/plain": "replace_nan_inf (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.223Z",
"end_time": "2021-07-16T19:44:09.947000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "N = 1024;\nx = range(-1.5f0, 1.5f0, length=N)\ny = range(-1.5f0, 1.5f0, length=N)",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 5,
"data": {
"text/plain": "-1.5f0:0.0029325513f0:1.5f0"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.224Z",
"end_time": "2021-07-16T19:44:10.070000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "z = x' .+ y*im;",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2021-07-16T18:08:54.513000+09:00",
"start_time": "2021-07-16T09:08:22.906Z"
}
},
"cell_type": "markdown",
"source": "### CPU, single thread"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.225Z",
"end_time": "2021-07-16T19:44:10.139000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "function mandelbrot(c)\n z = zero(c)\n normz = real(c)\n for i = 1:1000\n z = z * z + c\n normz = real(z * conj(z))\n normz > 4.0f0 && break\n end\n normz\nend",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": "mandelbrot (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.226Z",
"end_time": "2021-07-16T19:44:10.147000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# preallocate output array\nmandelbrot_set = Array{eltype(x)}(undef, size(z));",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.227Z",
"end_time": "2021-07-16T19:44:11.450000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\n@. mandelbrot_set = replace_nan_inf(mandelbrot(z))\n@time @. mandelbrot_set = replace_nan_inf(mandelbrot(z));",
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": " 0.590783 seconds (4 allocations: 64 bytes)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.229Z",
"end_time": "2021-07-16T19:44:11.518000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "mandelbrot_cpu(z) = mandelbrot_cpu!(Array{real(eltype(x))}(undef, size(z)), z)\nfunction mandelbrot_cpu!(mandelbrot_set, z)\n @. mandelbrot_set = replace_nan_inf(mandelbrot(z))\n mandelbrot_set\nend",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "mandelbrot_cpu! (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.230Z",
"end_time": "2021-07-16T19:44:12.734000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_cpu!(mandelbrot_set, z)\n@time mandelbrot_cpu!(mandelbrot_set, z);",
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": " 0.593360 seconds\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.231Z",
"end_time": "2021-07-16T19:44:21.085000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "heatmap(x, y, mandelbrot_set, clims=(0, 2), aspectratio=1)",
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 12,
"data": {
"image/png": "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HL4ej+fZZ59dunSp1+t99tln58+fz9uHDRs2b948AOjQoUNhYeGNN964YsWKG2+8cdiwYQUFBbW/LoLUMw4yId5TQJBEhwFjfJt6O6/4zjkGQsgYO3r0qNvtnj59+tGjR0+cOMHbr7766nPPPZcfv/nmm+eff/4bb7zRp0+f5cuX1/6iCFL/+NiSeE8BQZDYE4Oo0aysrNmzZ2vbb731VuU4IyNDN9wGQRAEOZOgp6FrFItuIwiCIDGDEkaJzajR0yJYBkEQBEGsEFWwTJzXCFEIEQRBkJgRRfBLRNfod9999/zzzx8/fnzUqFGTJ09WfXrw4MHXX399w4YNXq93wIABd955J6909tlnn73//vtKt6effjo7O1t3fBRCBEEQJHHZv3//4MGDZ86cec4559xxxx2MsSlTpogdVq9e/eOPP44ePdrlcv31r3/9/vvvly1bBgCbN2/etm3b+PHjeTexrosKFEIEQRAkZlD7lWXMLcKFCxcOGjTo3nvvBYDZs2c/8cQTKiEcPXr06NGj+XFubm5hYSFjjBACAB07dpw6dWrECaAQIgiCIDEjijVC8/7fffdd//79+XG/fv22bdtWVVWVlpam23nHjh0tW7bkKggARUVFN910U4sWLSZNmmSSv35mVlBFEARB4gIl1O7L3CIsLy9v3LgxP+aLfGVlZbo9S0tL//znPyvVqs8555zx48cPHz68oqLi3HPP3bx5s9El0CJEEARBYgYDymwWUWZAV61alZ+fLzbeeOONs2bNAoD09HRlC1t+kJmZqR3k4MGDhYWFd95559VXX81brrzySn5www03VFdXz507d/HixboTQCFEEARB4ky/fv2U8pycnJwcftC6detdu3bx4507d6anp2uDP48cOTJ06NBRo0Y9+uijuuMXFBSsWbPG6OroGkUQBEFiBl8jtPViQNPT09uHk5WVxQccO3bsO++8c+zYMQBYuHDh6NGj+RLgv//97x9++AEAjh8/Pnz48EGDBj355JPiTHbs2MEPDh8+vGzZsn79+hnNGS1CBEEQJGbwott2TzH5dOjQoYMHD+7UqVPTpk0rKys///xz3j5nzpzrr7++e/fuy5cv//bbb7dv375kyRL+0Y4dOxo1ajRu3P9v7/5Covj6OI7vmrpkJqaWbqlkgmRo1wn91USTIDU0zQRJEuoqRAjTLOyiyEIp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"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2021-07-16T18:08:54.513000+09:00",
"start_time": "2021-07-16T09:08:22.906Z"
}
},
"cell_type": "markdown",
"source": "### CPU, multi thread"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.232Z",
"end_time": "2021-07-16T19:44:21.087000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# preallocate output array\nmandelbrot_set_para = similar(mandelbrot_set);",
"execution_count": 13,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.233Z",
"end_time": "2021-07-16T19:44:21.129000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@show Threads.nthreads();",
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"text": "Threads.nthreads() = 10\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.234Z",
"end_time": "2021-07-16T19:44:21.450000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@time Threads.@threads for i in eachindex(z)\n @inbounds mandelbrot_set_para[i] = replace_nan_inf(mandelbrot(z[i]))\nend",
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": " 0.259152 seconds (5.33 M allocations: 85.536 MiB, 22.43% compilation time)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.235Z",
"end_time": "2021-07-16T19:44:21.522000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "mandelbrot_cpu_mt(z) = mandelbrot_cpu_mt!(Array{real(eltype(x))}(undef, size(z)), z)\nfunction mandelbrot_cpu_mt!(mandelbrot_set, z)\n Threads.@threads for i in eachindex(z)\n @inbounds mandelbrot_set[i] = replace_nan_inf(mandelbrot(z[i]))\n end\n mandelbrot_set\nend",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": "mandelbrot_cpu_mt! (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.236Z",
"end_time": "2021-07-16T19:44:21.945000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_cpu_mt!(mandelbrot_set_para, z)\n@time mandelbrot_cpu_mt!(mandelbrot_set_para, z);",
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"text": " 0.184957 seconds (61 allocations: 5.078 KiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.237Z",
"end_time": "2021-07-16T19:44:22.014000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "heatmap(x, y, mandelbrot_set_para, clims=(0, 2), aspectratio=1)",
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 18,
"data": {
"image/png": "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HL4ej+fZZ59dunSp1+t99tln58+fz9uHDRs2b948AOjQoUNhYeGNN964YsWKG2+8cdiwYQUFBbW/LoLUMw4yId5TQJBEhwFjfJt6O6/4zjkGQsgYO3r0qNvtnj59+tGjR0+cOMHbr7766nPPPZcfv/nmm+eff/4bb7zRp0+f5cuX1/6iCFL/+NiSeE8BQZDYE4Oo0aysrNmzZ2vbb731VuU4IyNDN9wGQRAEOZOgp6FrFItuIwiCIDGDEkaJzajR0yJYBkEQBEGsEFWwTJzXCFEIEQRBkJgRRfBLRNfod9999/zzzx8/fnzUqFGTJ09WfXrw4MHXX399w4YNXq93wIABd955J6909tlnn73//vtKt6effjo7O1t3fBRCBEEQJHHZv3//4MGDZ86cec4559xxxx2MsSlTpogdVq9e/eOPP44ePdrlcv31r3/9/vvvly1bBgCbN2/etm3b+PHjeTexrosKFEIEQRAkZlD7lWXMLcKFCxcOGjTo3nvvBYDZs2c/8cQTKiEcPXr06NGj+XFubm5hYSFjjBACAB07dpw6dWrECaAQIgiCIDEjijVC8/7fffdd//79+XG/fv22bdtWVVWVlpam23nHjh0tW7bkKggARUVFN910U4sWLSZNmmSSv35mVlBFEARB4gIl1O7L3CIsLy9v3LgxP+aLfGVlZbo9S0tL//znPyvVqs8555zx48cPHz68oqLi3HPP3bx5s9El0CJEEARBYgYDymwWUWZAV61alZ+fLzbeeOONs2bNAoD09HRlC1t+kJmZqR3k4MGDhYWFd95559VXX81brrzySn5www03VFdXz507d/HixboTQCFEEARB4ky/fv2U8pycnJwcftC6detdu3bx4507d6anp2uDP48cOTJ06NBRo0Y9+uijuuMXFBSsWbPG6OroGkUQBEFiBl8jtPViQNPT09uHk5WVxQccO3bsO++8c+zYMQBYuHDh6NGj+RLgv//97x9++AEAjh8/Pnz48EGDBj355JPiTHbs2MEPDh8+vGzZsn79+hnNGS1CBEEQJGbwott2TzH5dOjQoYMHD+7UqVPTpk0rKys///xz3j5nzpzrr7++e/fuy5cv//bbb7dv375kyRL+0Y4dOxo1ajRu3P9v7/5Covj6OI7vmrpkJqaWbqlkgmRo1wn91USTIDU0zQRJEuoqRAjTLOyiyEIp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"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.238Z",
"end_time": "2021-07-16T19:44:22.014000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# preallocate output array\nmandelbrot_set_para2 = similar(mandelbrot_set);",
"execution_count": 19,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.239Z",
"end_time": "2021-07-16T19:44:22.018000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "indices = LinearIndices(z);",
"execution_count": 20,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.240Z",
"end_time": "2021-07-16T19:44:22.197000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "blocksize = cld(length(indices), Threads.nthreads())",
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 21,
"data": {
"text/plain": "104858"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.241Z",
"end_time": "2021-07-16T19:44:22.652000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@time Threads.@threads for i in 1:Threads.nthreads()\n r = ((i - 1) * blocksize + 1):min(i * blocksize, length(indices))\n @inbounds mandelbrot_set_para2[indices[r]] .= replace_nan_inf.(mandelbrot.(z[indices[r]]))\nend",
"execution_count": 22,
"outputs": [
{
"output_type": "stream",
"text": " 0.437017 seconds (776.61 k allocations: 54.622 MiB, 2.36% compilation time)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.242Z",
"end_time": "2021-07-16T19:44:22.725000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "mandelbrot_cpu_mt2(z) = mandelbrot_cpu_mt2!(Array{real(eltype(x))}(undef, size(z)), z)\nfunction mandelbrot_cpu_mt2!(mandelbrot_set, z)\n indices = LinearIndices(z)\n l = length(indices)\n nt = Threads.nthreads()\n blocksize = cld(l, nt)\n Threads.@threads for i in 1:nt\n r = ((i - 1) * blocksize + 1):min(i * blocksize, l)\n @inbounds mandelbrot_set[indices[r]] .= replace_nan_inf.(mandelbrot.(z[indices[r]]))\n end\n mandelbrot_set\nend",
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 23,
"data": {
"text/plain": "mandelbrot_cpu_mt2! (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.243Z",
"end_time": "2021-07-16T19:44:23.172000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_cpu_mt2!(mandelbrot_set_para2, z)\n@time mandelbrot_cpu_mt2!(mandelbrot_set_para2, z);",
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"text": " 0.183881 seconds (100 allocations: 8.007 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.248Z",
"end_time": "2021-07-16T19:44:23.840000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "heatmap(x, y, mandelbrot_set_para2, clims=(0, 2), aspectratio=1)",
"execution_count": 28,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 28,
"data": {
"image/png": "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HL4ej+fZZ59dunSp1+t99tln58+fz9uHDRs2b948AOjQoUNhYeGNN964YsWKG2+8cdiwYQUFBbW/LoLUMw4yId5TQJBEhwFjfJt6O6/4zjkGQsgYO3r0qNvtnj59+tGjR0+cOMHbr7766nPPPZcfv/nmm+eff/4bb7zRp0+f5cuX1/6iCFL/+NiSeE8BQZDYE4Oo0aysrNmzZ2vbb731VuU4IyNDN9wGQRAEOZOgp6FrFItuIwiCIDGDEkaJzajR0yJYBkEQBEGsEFWwTJzXCFEIEQRBkJgRRfBLRNfod9999/zzzx8/fnzUqFGTJ09WfXrw4MHXX399w4YNXq93wIABd955J6909tlnn73//vtKt6effjo7O1t3fBRCBEEQJHHZv3//4MGDZ86cec4559xxxx2MsSlTpogdVq9e/eOPP44ePdrlcv31r3/9/vvvly1bBgCbN2/etm3b+PHjeTexrosKFEIEQRAkZlD7lWXMLcKFCxcOGjTo3nvvBYDZs2c/8cQTKiEcPXr06NGj+XFubm5hYSFjjBACAB07dpw6dWrECaAQIgiCIDEjijVC8/7fffdd//79+XG/fv22bdtWVVWVlpam23nHjh0tW7bkKggARUVFN910U4sWLSZNmmSSv35mVlBFEARB4gIl1O7L3CIsLy9v3LgxP+aLfGVlZbo9S0tL//znPyvVqs8555zx48cPHz68oqLi3HPP3bx5s9El0CJEEARBYgYDymwWUWZAV61alZ+fLzbeeOONs2bNAoD09HRlC1t+kJmZqR3k4MGDhYWFd95559VXX81brrzySn5www03VFdXz507d/HixboTQCFEEARB4ky/fv2U8pycnJwcftC6detdu3bx4507d6anp2uDP48cOTJ06NBRo0Y9+uijuuMXFBSsWbPG6OroGkUQBEFiBl8jtPViQNPT09uHk5WVxQccO3bsO++8c+zYMQBYuHDh6NGj+RLgv//97x9++AEAjh8/Pnz48EGDBj355JPiTHbs2MEPDh8+vGzZsn79+hnNGS1CBEEQJGbwott2TzH5dOjQoYMHD+7UqVPTpk0rKys///xz3j5nzpzrr7++e/fuy5cv//bbb7dv375kyRL+0Y4dOxo1ajRu3P9v7/5Covj6OI7vmrpkJqaWbqlkgmRo1wn91USTIDU0zQRJEuoqRAjTLOyiyEIp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"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.244Z",
"end_time": "2021-07-16T19:44:23.188000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# preallocate output array\nmandelbrot_set_para3 = similar(mandelbrot_set);",
"execution_count": 25,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.245Z",
"end_time": "2021-07-16T19:44:23.269000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "mandelbrot_cpu_mt3(z) = mandelbrot_cpu_mt3!(Array{real(eltype(x))}(undef, size(z)), z)\nfunction mandelbrot_cpu_mt3!(mandelbrot_set, z)\n indices = LinearIndices(z)\n l = length(indices)\n nt = Threads.nthreads()\n blocksize = cld(l, nt)\n @sync for i in 1:nt\n r = indices[((i - 1) * blocksize + 1):min(i * blocksize, l)]\n Threads.@spawn mandelbrot_set[r] .= replace_nan_inf.(mandelbrot.(z[r]))\n end\n mandelbrot_set\nend",
"execution_count": 26,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 26,
"data": {
"text/plain": "mandelbrot_cpu_mt3! (generic function with 1 method)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.247Z",
"end_time": "2021-07-16T19:44:23.754000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_cpu_mt3!(mandelbrot_set_para3, z)\n@time mandelbrot_cpu_mt3!(mandelbrot_set_para3, z);",
"execution_count": 27,
"outputs": [
{
"output_type": "stream",
"text": " 0.184995 seconds (135 allocations: 8.008 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.249Z",
"end_time": "2021-07-16T19:44:23.909000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "heatmap(x, y, mandelbrot_set_para3, clims=(0, 2), aspectratio=1)",
"execution_count": 29,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 29,
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydeXxTVfr/n3NvkrbpwtLSsm+1IruILCKICGVzwwVwAQUE3BVxHNxHGBf84jgi6jDKquC4jCu/ERUXmJGlFRERcSkgi9CWHVLa0iTn/P44yc3J3XJvmjaBPO9XXr5uTs499+RK7yfPc57nOYQxBgiCIAiSrEjxngCCIAiCxBMUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhoUQgRBECSpQSFEEARBkhpHvCeAIAiCIIaUl5evWLFi+/bt2dnZ1113XatWrbR9qqurFy5cuGvXrt69e1977bWEEN6+ZcuWt99+2+Vy3XTTTe3atTO6RGyE0OPxfP/99+Xl5YMHD27cuLG2w5o1aw4cOMCPMzMzhw8fHpPrIgiCIGc248ePz8nJ6dGjR0lJSadOndavX9+lSxdVn1GjRlFKL7/88r/85S9bt26dOXMmAGzcuPGSSy6ZMWPG8ePHe/Xq9f333+uKKAAQxlgtZ3nq1KmsrKwOHTps27Zt/fr1vXr10vYZPHiwLMtckPPy8mbNmlXLiyIIgiDJQFVVVVpaGj8ePXp0mzZtnnvuObHDxo0bCwsL9+/fn5aWtmXLlgEDBuzbty8jI2Ps2LFnn332X//6VwAYN25cq1atnnnmGd1LxMAidLlcR48edbvdWVlZJt2mTp167bXX1v5yCIIgSPKgqCAA1NTUpKenqzqsWbNmwIABvFu3bt3cbvf3338/YMCANWvW3HXXXbzPsGHDXnnlFaNLxEAICSFutztit/Xr1584caJjx44XXHBB7S+KIAiCJBWff/75//73v3/84x+q9tLS0iZNmihv8/Ly9u/f7/P5Dh48mJubyxtzc3NLS0uNRq6nYJnmzZsfOHDg2LFjjz766IABA9566y1lMVOEMfbyyy/v3r1bbJw8eXLbtm2jvrTf75dlOerT6xxyLN4zMIMxpvt/CrEIpVSSMDY7Sk6Df36sYbxnYEbMn34ul8vC/5ETDPy2hv311+2PPzZH1VhYWDhlyhTl7ebNm2+66aZly5Y1b95c1dPhcPj9oSt6vV6n0ylJkiRJPp+PN/p8PqfTaTSBehLCN954gx8cOnSoY8eOn3766YgRI7Td/H7/tGnTVCuILperNo+SkydPZmZmRn16XSM5v4j3FBAEiRLqHRPvKZgRl6cfZd8wOGrrlG3bvtu1a9cDDzwgNooRMVu2bBkxYsT8+fNHjhypPb158+abNm0KXJ3SsrKyFi1aSJLUtGnT/fv3d+7cGQD27dunVVCF+k6f4ME/v/76q64QAgAh5OGHH47hFZ1Op8kPgbhj74cTgiCJRCI/WyBOTz/K/Ax8tk5h4G/RosXo0aN1P/3ll19Gjhz597//fdSoUWJ7cXFx27Ztc3NzL7300oceeqi8vDwvL++rr75KTU0977zzAODyyy//97//XVhYyBh77733Lr/8cqMJ1KHTpqysbNeuXQBAKVViU48cObJ58+aCgoK6uy6CIAgSLxj4GbP7oiYDTpgwoaamZuHChYWFhYWFhYrLcOzYsV988QUA5Ofn33LLLQMGDJgyZcqNN9749NNPc/l/4IEHVqxYMWbMmBEjRuzdu3fy5MlGl4iNRXjPPfeUlZVVVVU99NBDjRs3fuWVV3JycubNm7dly5YVK1aUlpZecsklAwcOdDqdK1as6N+/v5E5iCAIgpzWUOZnzKZFyMxcY4sXL66srFTeNmrUiB+8//77Sl7giy++uG7dup07d95///3nnHMOb2zXrt22bds+//zzlJSUwsJCk6DOGOQRAsC6devEifbv3z81NbWkpOTEiRM9e/b0+/0bNmz46aefKKVdu3a98MILjcbx+XxpaWler7f2U1LweDyJvEboh+XxngKCIFEiw43xnoIZcXn6nfK9Q9khW6es+PiHfy078MEHH9TRlCISG4uwX79+2kbF/ynL8oUXXmiifwiCIAgSL7DWKIIgCBIzGPXZdo1SszXCegCFEEEQBIkZLIo1wniHz6MQIgiCIDGDgW0hBNNgmXoAhRBBEASJGYz6GLXrGo2zEGLxJwRBECSpQYsQQRAEiR3MD3Zdo4DBMgiCIMgZQ6wT6usBFEIEQRAkdjA/2FwjxGAZBEEQ5AyC+oDarA6GwTIIgiAIEkfQIkQQBEFiB/PZD5bxA8Rz+3QUQgRBECR2RLFGSFEIEQRBkDMGisEyCIIgSDITRR6h6ca89QAGyyAIgiBJDVqECIIgSOxgPmLTNUrQNYogCIKcOVBqOy8Q9yNEEARBzhgI9aNFiCAIgiQxzG/bIsRgGQRBEASJI2gRIgiCILEjijzCeNcaRSFEEARBYgahfnK6uUZRCBEEQZAYEkVCPVqECIIgyJkCodSuRUjibRFisAyCIAiS1KBFiCAIgsQOevqlT6AQIgiCIDGDMPuuUawsgyAIgpw5oEWIIAiCJDVRBMuYWoQHDhzYuHHjzz//fPHFF/fs2VPbYeHChYcOHVLetmvXbsyYMQAwZ84cGhy5e/fuw4cPN7oECiGCIAiSuIwaNQoAdu7c6XK5dIXwxIkTR48e5cfLli277rrruBA+/PDDt99+u9vtBoDKykqTS6AQIgiCILGDUdu7STBm8uG6desAoLCw0KjDfffdxw8OHz78wgsvTJo0Sfno0Ucfzc3NjXh9FEIEQRAkZpAotmGK0RrhG2+80aNHj06dOiktr732WkpKSv/+/fv27WtyIuYRIgiCILGD7z5h7xUbIVyyZIloDg4ePLi6unrv3r2XXnrpX/7yF5MT0SJEEARBYkdUFuHatWtVzs8rr7zyrrvusj5GcXHx9u3bx44dq7R8+umn/OCmm27q3bv33XffnZOTo3suCiGCIAgSZwoKCmbMmCG2tG/f3tYIixYtGj16dFZWlvaj8847z+l07t27F4UQQRAEqXMItR0sQxjNzc0dMmSI9VMOHjy4bdu2gQMH8rdVVVVvv/32xx9/rHSorKzk8aIAsHLlSkLIWWedZTQarhEiCIIgsYPR2K4RPvbYY+eff35xcfGcOXPOP//8L774AgDWr18/evRopc+7776bm5vbv39/peXDDz/s0KHDmDFjhg8fft1117388suZmZlGl0CLEEEQBIkd9i1C8/SJSZMm8VRCDneZDhw4kCsiZ+DAgRdddBEhRGkZO3Zsx44dd+7c6Xa7ly5dmpeXZ3IJFEIEQRAkZhDKbLtGTfu3a9euXbt2qsYGDRp069ZNedumTRtVB1mWe/To0aNHDysTQNcogiAIktSgRYggCILEDoZFtxEEQZBkxr5r1HyNsB6ImWv0xIkTv//+u0mH8vLyb7755sCBA7G6IoIgCJJw8Fqj9l6nvxBu2rSpY8eOjRo16tKli1GfpUuXdu7ceebMmZ06dXrjjTdqf1EEqX8cZEK8p4AgiQ6hfruvuLtGYyCEzZs3X7x48Zo1a4w6VFZW3nfffR9++OGqVas++OCDadOmVVVV1f66CFLP+NiSeE8BQZDYEwMhbNq0ad++fdPS0ow6fPHFF9nZ2TzVccCAAY0aNfrqq69qf10EQRAk4eBrhLZe8bYI6yNYZs+ePW3btlXetm3bds+ePUadGWOrVq0SW3r27NmwYcOor04pVTYpTkQwgQVBTlsS+tlSB08/SbLwwIpiP8J4rxHWhxBWV1e7XC7lbWpqqslmwYyxZ555Rmx55plnOnfuHPXVq6qqZFmO+vS6Ji0j3jNAECRazPc9jzsxf/q53e7IWhhN1GgSWIR5eXmHDx9W3h46dKhZs2ZGnSVJiq3jlDGWkZG4amMz3QZBkAQikZ8tEK+nXxQl1uJtEdaHY65Xr14//PCDx+MBAI/H88MPP/Tq1aserosgCIIgEYmBEHo8nmeffXbp0qVer/fZZ5+dP38+bx8xYsRLL70EAOecc86QIUPGjRv3ySefjBs3bujQoQUFBbW/LoIgCJJ4UGA2X3D6W4SMsaNHj7rd7unTpx89evTEiRO8/YorrlCKov7rX//q0aPH4sWLzzvvvDfffLP2F0UQBEESkSiiRuMdcxSDNcKsrKzZs2dr22+//XblOCMj44knnqj9tRAEQZCEJtbbMNUDWGsUQRAEiR1RpE/EWwgxiw1BEARJatAiRBAEQWIHtZ8OEe/0CRRCBEEQJHbgGiGCIAiS1DBm28KLtxDiGiGCRMk9TYvjPQUESTxOw/QJFEIEiRIn/vUgyBkBukYRJBrub14sAfy5RbEEMHtf73hPB0EShmhco3UzE8ugECKIbaY1K3YSIARkAhKJ9x8xgiQUFMCupzPem1mhECJIlHAVJPGeBoIkFozZD37BYBkEOd14obS3TEAmTCbw5N4+8Z4OgiQSNKpXXEGLEEEi81z+uj/t6AcAM9sU8R+7qcHtTp9ut+Hh3/vGb2oIgtQWFEIEicyfdvR7vHURP+ZxAFLQJVrtJ4+3Lpq1B+1CBAEAAGbfwov3OjsKIYJE5tFWARVU/mD9DACACB0kAiiHCBLYYdDeOXUyE+vgGiGC6PPXNhtmtikCgEdaFfkZ4S8a/lLaGYCfwSNBvUSQ5IXhGiGCnCn4GaEAD7UsBiBiEJzqb1YKdiYEAOCRVkVeSng75hciyUgUwmZqEe7bt+/bb78tKSm55JJLevbsqe2wZs2aDRs2KG+nTZuWkpICADU1Na+99tqWLVu6des2ZcoUl8tldAkUQgTR54k9fR5qWcwlUPm71oaF+wEAgBAABhKAnxHuNf2//aiCCBIDbrjhBkJISUlJamqqrhB+9tlnX3755aBBg/hbGizYNnHixD/++GPixIlLlixZt27d8uXLjS6BQogghjAWkEBF/8RfupSFQmYCKghACPwNJRBJZigBajO91jQdd82aNQBQWFho0mfgwIGzZ88WW3bt2vXee+/t27cvOzv78ssvb9GixVNPPdW2bVvd03GNEEH0eaB5MQ0mB3Nnj48BZUAZ+Bn4GfB1Qf6iDHwMKICfwQPNsRg3krwwRuy/anvRTZs2PfbYYwsWLDhx4gRvWbduXdeuXbOzswEgOzu7W7du69evNzodhRBB9CEkJIFc/xgExC8ghxT8NCSNoY/iPXMEiSf1HizTsmXLrl27pqamvvPOO506dSotLQWAsrKynJwcpU+TJk32799vNAK6RhFEh8dbFzFGuATyX6s0WDeKBt8GCDpI/QwkLp/1P10ESRwoROEaXbt2rcr5edlll917771Wzr7jjjv4wSOPPDJs2LC5c+fOnj3b5XL5fD6lT01NTWpqqtEIKIQIosOsPX3ub17MVZBrXsA65MfBbnyZUMkppAASAGNwZ16xBDCvHBcLEcQSBQUFM2bMEFvy8/OjGKdXr147duwAgBYtWuzdu1dp/+OPP1q0aGF0FgohguijqKASMqPSRY4/eEBIUBQJvIwSiCQrjEmM2lt0Y4zl5uYOGTLE+inl5eVbtmzhRqTH48nMzASAqqqq//znP2PHjgWAwYMH79+///vvv+/Ro8fmzZv37ds3ePBgo9FQCBFEn5DZp5FACuoN1yQCwIAxILgbBZLkRBE1arpG+Nhjj61cubKkpOTXX39dunTp7NmzhwwZUlRUNHny5AMHDgBAjx49WrVq1ahRo+Li4g4dOtxzzz0AkJWV9eSTT44YMWLQoEFff/31U089xcVSF8JqH68TO3w+X1pamtfrjeGYyo+FxMQPhqktSNy5p2kxY+ALNw15RIzq74abgwBAACQCCw+hRZgUyHBjvKdgRlyefjWLLmQHfrR1ysfbfG96hn3wwQe6n/7+++9HjhxR3rZv375Ro0Yej+ePP/7o2LEjABw5cuT777/3eDzt27fv1q2beG5JScnWrVu7dOlSUFBgMgG0CBHEEK58igoqiuhnQBmDoNVIACQg3BxEFUSSHEaB2bYIzfq3a9euXbt2qsbMzEyuggDQuHFjI7dnQUGBuQRyMH0CQQyZV95bdIcyAD/liYPMz8DHmJ8xP2O+0H/Bj8kTCHK6gRYhgkSAayEN5ggGxQ+UZQVCCGVMIiADyBIuEiLJDZPAZrCMeWWZegCFEEHM+MeB3lObFHNzkAVsQealzMuYn1EAIEAkQmRCZCDvHsdtmJCkhxK7rlGGQoggCc6rB3sDwITsQOE0HwMvY1XUx4BxFZQYkUD6wHNBXKeJIIkBI7YtvHiHbKIQIogllhzufVtu8bEaAAA/o5XkFAXmYLKTyWsqL47z5BAkYWCM2M4jtOtKjTUohAiij4NMON9944aThQDQNOOFBqQpAbkGKp2Q4pN8EkgUqAMcXjiVn7nssG/nhIbDXyiNf7yog0zwsSXxngWCnE6gECLJgkuaWkNfVTW+cNZaysj0Hf0AoLH7GQA4UvlQf/dXB+UDbTKGHITy/MxlAJBOcnzgA/ARkH3gAwAKFAB84CMgA0C2o/2Kit9WZP4GAFwjnZAy2N1mi+dk34bpc4IbMzmlScCYly2uu6+JKojEmWi2YaqbmVgGhRBJFhjzOslEILKXLlAaj9Q4vJQ4pck908Zmy20o0PzMZSAbjBDYhVcHIpzDNdILpz6t/A1k+NAjfZi5vSO0+9hzAWOG2RX/6PC/238dEMX3QpCEgjEMlkGQOsYpTRaVzOpZZCLfRoKwgJhlpT7e2NnOCSkUaOv0iw9CudLZRPCMMDqFgMx18SfYkZ+5o03GEAc4LnH/9zd52x+e23ifB5oXu2SWKjntXhRBEhDGJMYwfQJB6hIvXeAgE8CmD9DLFjvJRAAAQrpnrKggx5s4z4ag9QYGSkZrsU+aBJJqWG41+sC3W96TAhm90j/99uRwAPD4II0Rgn+LyJlBVNsw1c1UrIJ/fMjpiiJsBBzaxT8tXra4Q+ZbPvBVwHGlUaV/JspnccNdEqzWJA6lEkWuiEekQ/mZy5yQ0pm0apomua2MjiBIHYBCiJx++NiSgAoCAGMMvE5pkpcuUnVb3Gk1AEzcdnGKfFdLd1/xo4j6F/U+86oTuS6qRJFfncuhF05tYTuLKyv2lk+N7ooIklCwKBLq7VqQsQaFEDn9CKmgAmNOMlEVjVlelVLhk9pmLhZVUJRAlf7pih+1v14IAFIwdkYcUxRFRQ4BgAK4wF2Q+SYF2o62+eJk5JAZl3xHjf+VKCaGIHWPBHbXCAGFEEGiggVjrgn/K9LsBLj40G4f+GRwBvvrS6BW/0zEz8RSJEIJe9UIXBeVcwlIygS4IioxNbulvQBwZ15xQxd7aq9hwTbGqp3SJADgdjAPBcLECSQhiM4ijGtKPQohcqYxusGGLXQXz/YDy/qnkq4oXKNGpxCQxMElkLWKqDwEKEB+5jIJpJLyG3RHc0qTAaiyHSKXQxb3PCwECRLNNkzxDpbBbZiQMwJC+D/ma7I2bKY7tSpIgQoBolSRIgp+/hI/Umsk80fxUk5XxuTDilcUGgPT4xMOpDMCPN66SJyJg0wQVRAAgDFgjBAJzUEEiRq0CJHTEEKAMaKsKxACIHnpgmYZ89ykEW8TJVA5T1Q40UrTKp/RlSNaiqGo0fBBJBLyjgYXC/0gGIjcOhRDafIzlx3375sFIQcpIQ4IyTkDxS2MIAnE6Vd0OzYW4TfffNO5c2e32923b99ffvlF22HcuHH5QQoLC2NyUSRp8dJFQIjyIuCQJXd+5jITFTQxyELWoakxp7UUdTHqLw6uNRCVRpVp2EBuUZD5ZkHmm5qrxPvJgSAGMCrZftkOrokxMbAIa2pqRo8ePXv27HHjxj3zzDPjxo3buHGjqk9paen06dNHjBgBAE4nVtBAaouYLMGzA/mxrgQGW/RNQJXpplW7KArNcIiwHBhskZTLSUS0BUPWoWrhkJ8/JP1/X5wcQECKOq8DQeoHxojdkmks3r/rYqDDK1eudLvdN998syzLf/rTn3755ZctW7Zou+Xl5bVv3759+/atWrWq/UURhFOQ+aZKBQWjSm11gWqBULD/VDYcA7/yUl2RMmryEntqB9G9ujjP8Lch0/B3aXezjHlAHAASEMI9oqJf1CXfVrsbiSCxgecR2nqdCcEyJSUlXbt25cepqalnnXXWb7/9pu02ffr05s2bDxs2rKioSPupyNFwfD5f7SeJnHlMyC7Oz1ymqIWigvxTrSFoIkJa/VOuYi51Woz6iyOHuUbDZyJ6SiFcC92kUUt3H0JcohZy57CXLqrxz6/FvUSQpCYGrtGjR4+mp6crb7Oyso4cOaLq89BDD+Xn5zudzqVLlxYWFv70009GdiGltH379mLLu+++26ePYUJVRCoqKqI+tx5wZ8Z7Bqcnl2as+43s4scqd6iuBConqpYAhePwWjN6gmfLLSlEzQRTBkmo0BqBsNgZPivuLOWeUtFNquQaEpAdUrqPUsZ8QID7TR9peav1WSGxxePxxHsKZsT86ed2u2XZYHMWBUbA7ka7Z0BlmezsbNEXeuzYsSZNmqj6DBkyhB888sgjH3/88aeffjplyhTd0SRJOnr0aO1nJZKZmbhqE+XqU3KTn7lMcQqaG4KiCaicbqR/Gsemcd1R47BSQnRqykBA7YRCa0rEqxg1yvzKwiHvKi4T8uNmqd3TWPrWiquMJoDUJ4n8bOHEYYZRrBHGO/g5Bq7Rc845RxHCysrK7du3d+jQweySksTivjaKnIbcklN8Reb69plLlRZdFVR5F0FQQa0XNNhB9GGqAz4Z86teJpM06qyJUA1cUeUvFT2lEC7nytesIie1caQIkiBEsUYY91qjMRDCoUOHMsZefPHFioqKmTNn9ujRo1OnTgCwfPnyp556CgCOHTu2fPnyffv2lZeXz5kzZ+vWrcOGDav9dZFko8YPW+G3oFMxbFFQFW8CGhW0LoHK5YxkjwaTHExeYn9dRVRdXZRDcc6g0ULlW/O9qBAk0WBAeOCo9Ve8pxwLIXQ4HB999NE777zTtm3bLVu2LF++nLd7PB7Fyfn666/37t27R48eX3755WeffdamTZvaXxdJNtb6flZUkLfoLgrqxqHwDlYkUKt/JiJnhO4p4sjh8TKh6UEkLVS6tckYYvXGIQhiSmwqy/To0eObb75RNd52WyCeu2HDhp999llMLoSc2dyWWzz/QG9+vLLnJyO+G6l8dGnGOkIsqWDgLVObhqIEKsOqTEDl2EjwWKSoURFC1HsTBjYmZH4IriYGImIYBQCJBIJiglqoEz5DhTrdBZlvlnj0S5IiSLxglDCbwTJ2+8ccrDWKJBDzD/T+qs9HALC00+p9JzP+0eF/vL1X+qc8RtSWCqrcoRDJClRGDqvKxqj4svV1tCeKNqLKOoSgQoebrWq7UPjufgq0Ydqsu/OKbc0KQeoUu35Rxkjcg2Ww1iiSWFxSdOXiTqur/XKNX6qhEgC0zVwsS04wUEHVoqCRIahrBZqYgEyTGl+bL0VAFgckRKkdIynWoWIFQtA0DEws0MInGYoj5XZhtqN9AxeGniEJRDTBL/Eul4RCiCQcPir5qFTllyr9UvOMl9NIA/FTlS3I0VVBrS9U1xGqsv/Ch9XXPyumoeIXFccJrHEyCsZyyD2loptUzKygwd0NeX4hALx9bMeTEH2iLYLEmhinT+zatauoqGjXrl1Dhgzp2bOntsPmzZs//vjj3bt3t2zZ8pZbbmndujVvnzNnDqWBP9Xu3bsPHz7c6BLoGkUSDh8jXkpOUemElygqqIoR5Y1UE10CGo3UqqDikwyPZAnzfKrqy0ThINU9JazcWrBddJYKXyek5aovSMEvBpFSoD3TV3bKfM/KrBDktOOWW25ZuHDhvHnz1q1bp9vh1ltvraiouOiii8rLy88999zdu3fz9ocffthiSQG0CJGE4/ZfB/CDDplv8QO7KmhiC0Y0BFX6pztDiyVmxF23laEICW20xNu57RioIMP8kezCwLC8hY95TDrshBQrU0KQOocS25ViTPt/+eWXAGCybdG6det4vZubb775xx9//PDDD++9917+0d13352bmxvx+iiESIJyVdYGXk07ViqouyJoUQKj2/NBPEsRLcUvqsih6ClV3KRAQFcL+bDhDlIgINdAZRQzRJCYwxixu61SLVMJlapvjLGjR49mZ2crHz3//PNpaWn9+vUz3/4PXaNIgrKV7QSDVTrrKqgEZOoGhZp7LJVh1euRmtoxJi/VOIJhGrhKKJU+6CYNXUXPR6p1kHK4fYkgcSeOUaN///vfGWOjR4/mb0eNGtWoUaOampqbbrrp/vvvNzkRLUIk4WiYNivbEVZ4XRsmqhsso1XBwKcsZFMGW9TJhWKjanyTmmpGvlMlUkZ1rhIdCgAEJJV1CAwg6CUKmIY8WJSFUgwBQHGQUvBLwVBSAnLLzPl/eMw2Y9o06M3zvsa8Q6RuYSyaqNG1a9eqjLZLL7102rRp1sd46623/va3v3399dcpKYFlgnfffZcfXH/99d26dZsxY4aRmxSFEEk4GjsChYe0TlGjfEGwrIK6vlDrEmg9UkZ8q9JFJZUeNHLIPaWim5R3VnykADprhPy7pECG+axQBZGEpaCgYMaMGWKLec1qFe+///706dM///zzs88+W/tp586dXS7Xvn37UAiR0wMHmcCLhxmpoEJtVNCuBEYRNWMUKQMaOQwIG6NGWiiuF0LAQQqSsM0FDdas4TjIBH4hL11kND0EqSOi2aEeSG5urrJJkRXKyso2bdo0cuRIAFi5cuUdd9zxn//8p0uXLkqHEydOZGRkSJIEAO+9957D4dDVSA6uESLx5+684jvzim/PLQaA/AzDXB+OthSnQkxUUL22p8mXUFb7zPe9Xg4AACAASURBVCNoxG7apUHxQsJCprAcqFoyDK4XikVnGFDVjwO+KwUhEjAGjDnJRJMZIkhdwBhQRmy9zIVz+vTp+fn5a9eunTVrVn5+/sqVKwGguLh4woQJvMP48eOrq6vHjBmTn5+fn5//9NNPA8Ann3zSqlWrkSNH9u/ff8qUKQsWLBD3zVWBFiESf3wMAMDPYJB7jU/WjxTVBshEYQvqrgjqFpqxEjVqK61euzTIP1Wl0uvbhSzUQfkW4X5RbhQCBXDJtwEAAwY88hTAQSb42JKIU0WQmMCYZLvWqKkQPvjgg3fddZfyNi8vDwAGDx68YcMG3rJx40YlcR4AGjRoAADXXXddz549t2/fnpmZ2a1bt6ysLJNLoBAi8ecfB3rfnlssEdgj7wVrKqhCvaeuqQpqJRAEFTSXwCjKjSrHJOjYBGWdT1kdFNIHzbWQB84Ev7VfIqCkUnDOThv2a+UKcQ6ogkh9Eo1r1LR/bm6udm0vPT29fftASF3btm11TywoKCgoKLAyAXSNIgnBPw70/rTqJ+v9RXNQN1/QugqGbRZokDhhVFNG5f/UvsI6C4OoBlembeQjBQg3WMNzJ0ROkSoCDgKEAAES/53eECTxQYsQSRRkcCrHVpyiKrRZ86A176y5Q8MtRR3xs/6ljHLqVdZhwAo0sAtBqCyqMgoh3C/K/1tDX7U+QwSJLdHstRvvuvEohEhCIFZTExP+TFRQNAe1WfNgzRY0+ghAbR1q52ySXyhChPDOQItqmTCofMI5gRMCKYYMRAcpBLIpAIJ7Fqqu2DTjhbIKGwlYCBJDGAW7eYRx36QehRCJPxOyi8VqapxIMZlqFVQQVTDUP3YqaFH/dPurMgghaB3qmobKp+IBP52YLmpkksjFFRGkroj1GmE9gEKImOGUJtVpLtqCc/57tMa5vma3qj1Mk4wjRcNOEZYGVZkSRipokD5hVwIjekrFhEL9hHrFU6r7FkigJCkloBiF/NsplbgpgAw89dCO6xZBYg2zvw1T3MFgmeSibeZi652dZCJj1EEmOMiEOprP5F8uAgBtcW0O1RO80Kd6TlERlV7qrgtqPgpJpiqmNPwsKrwiou4ZFp6jZ78qk1T5gcUJa61h8fiqrA0WJoYgCABahMnGLs/EphkvAAABubTibotnkRiVxNXlgZ0XzM/cYfSpkTlINcoBpk5RKx5R87SK0EV05xmp6Gj4uYH6MmJxmcAIJIKDVGUUGpHpwN+4SHxgTLK/+0Sc/7niX0sS0Tzj5dz05ymjfubzsVO56c+b9/eyxTwK38t07MhYmYm8GErEgmq6aPMljJyigcZaqaDa/rOyVa9Bn8BQYnEZzZfSzNDCDVF4/Uhv650RJIZQSuy+bBfpjjVoESYRXlbFWFhMpkK6a8bJmmdTHfdQ5hPbiZRGQEqR7xIb3a5mFacMbTjrvHT2N3f91l93PuZ1ZCw6RVVaYqSC1iRQGFxP9oxCe0wqjgaHDWVN8IFUcaSBj1iYcckLkFIGQuwoAO7EhCQCzHbwS7yzJ9AiTCa4ClLm9dNTfnqKMi9vd8m3ef0el3yHSgUDZ2lywytrSiXidshZKoG0Px/C1yx1t961hW6+ROAq1lQwfGLKCKq1PcO6o0YT002uDx9HLedGvlz+1Rijuj8dECRB4MEydl/xnTMKYRJxqHIGZV7GAlp4rOpxl3yHS77D4j8D1QOdP69THfekOqYBQIbrIbvzubvkQjGJXhdzczDQRz/JT0dWdY0/VUu4CoZO1BadsavZWjkUL6StLKOacMTqbqqteme2KXo+f52tGSJIcoJCmFxQ5qPMS5mvxn/cJd8hfhLpFULzNKepjnsqap6xOxmnNEl/knpb7+qiZ0gZZlaE3hqvCxqpoHiu3sQi3j39EQR91dFCkzDXiNySU2xYhA1B6pJodqhHixCpT05Uz/Kcesrr9wQbdHTOgLCeJqahRS7PWNc+fagwuqFfNMz4i4U5qHprSwXDr2P97oGJHIoXNd8KWDmmQBnTVzp+QxYe6u2S4h2KhyQldvdgoozEfY0Qg2WSjqAhaPD4VvnfiPZZGgjxgGDcP4Ti+2mqYxpjvjRX7rGqx82nsaKiX0HmLjCy4YQwmWCLViH0zUHdSFEjp6hFFTSwAvWIcANDdw+CN1CoGkPVN1YoIhPoHKy4pn91YYfeR3f1NeqDIHVHzHefqAdQCJMIQwk0WXwyfKwHHuia8iiUEEe190jEyTRIfSLHeVbYpbj4GScJ6BZUM5y4noGlsmJNVNDYELRz97SfhseLgqCFIOxfr4oUVcJHtcNTRuVIOYUIUq/YjxqFeAsh+k6SgsyUR1zybWo/HqOBl3XU/cMMJnG5K9UxLSvVzCjMdZ4tjGI4B6OaatrcQV1zMNhZJXs6JqP4dbQT0O9g9+6pTwn879BeIjxSNJqVvisy10dxFoIkJ2gRJgWnfIfVTXaS4SA8Hy5wbrg3T0uN74TRaAPcX/OcN4t+UbuYpBiq+uh/pO8R1aig5THVNbIZDbetpXAfaeiWirW2IdxTan6hjz0XmHRDkLojmsoydVm7ygpoEZ6xKDVCdbL9bCbDKX0MBgmZNaJRSIic5rxfd7T/VQ4yyaM3nwborQ6anWLTHIysghpD0Ho2ofkgqolpUg8j3BwJE+qRBICy06+yDArhGQsvEJrquIeBkCYf/vy1mwynfqCbaWFAY3QdpO0zl2pHNr6ofnFRUUpFv6h1Uy9KFQyfdhQ3UDNa6KIsvIVPySD70IxB7jXWZ4UgMSSa9Il4zxmF8IzFyxb72BLKakJNpiZIEBoxjzDsXD0tVN4CgM9fpb2GE1KE6+mZhsY70VtEu9GShVOMbojSw8pviMg3UO/HhL7URbwDkiZ8lIDsAEeOM+XOvGLzcxGkTjgN8whxjfBMxiXfFnoTWQXNn7nKp5rtYcNWvAA0K1sZrodU6fbabXitYLTyF3Ectamql8Cn7a/+KII+RVRc3sFkwU+12kqZhV0mFPhQPHfiV891Fs9CEATQIkxODBLDLaKnB2J5lDDjxm/deahbUMbcL6pNNrduRBotuemPUFsVFHtqhrJjAuoiERmESJkB7q+jGARBYgJltnPq0SJE6gS38wEf9YTeWzaGwmAMAIBo/42GjBvTOEYa3HiP8t0teOuI9LXqIMpauEB1MfGLGt0Bvc5a96+dG8iCCx/6NzDcsA5Y1aE7ZpQyL7bzOy/efwLyDs84wykhSN0TxQ71uEaI1AmV3jmhN4brZLqmDwu9VC0Gp4ebNSa6EuBn6TfTucdggVCEaWxHsGQO2hDR8E6a26V/AzXnmlWx0YEErMCALSiBzP2iDjLBSSZaGQFB6gIGxO4L4p0+gRbhmUmooLb1CikAemqn+TTMvqG6v6V0zURlpdAJKUqAjN0dhaJYIDQlsmzb+BlhfvdAewOpnlWtf0tVSEIfSVhHdEKKjy2JeDqC1B2MEWrTIrTbP+agRXgGkua8386qFQCAgc1n0FPbpmcUqlD5+mojYEYLhMFjw5FrFYZq/jPC4t1T9zScT2DJ06CyNkciUjBGRiYgEZB/8Yy2Og0EQYKgEJ6B+OlJbaNpkRSbLnprj3IjIhZUU/e3HAWjzbezm+QXmmOgydrptb6BqqiZ4EzMflIoRqQSL5oCaQ1Sn7A3EwSJNdHkTqBFiESNS5pq8Imd/612H+K1OIsn10t604tYUyaGqCtxW1C7WP6MqMVZ3OwDAEJkiUgEZInIijm4zXPN8eonopkMgsSOKKJGabyjZXCN8PTDKU1ijPLCMYGwCEK8dJHQRW3QRF4dDIfphXER1YI2Y8HlLqpUy9TmFAbPDRkxdtcFa4+ttHrhNAtnGeiZpRuoPkVZKdRfJgxExxBJAokrHwkcSDI495z8CgDjRZH4E802TBgsg9iGMa0mOclEL1scxVA6bQbBzAw0161jahcIox3NYuaDSX69yVlif2s3MPyXhNFoYdkR3CkaMAclicgyOLlTNPyXEILEjSiCZcyF87fffisqKvrll18uvfTSfv366fZZvXr1G2+84XA4Jk+e3KtXL95YWVk5d+7cH3/8sWvXrvfee6/b7Ta6RGxco99+++2YMWOGDx/+8ssvM71n6+HDh++5557CwsJ77733yJHIm9UhRoiR8aoHrlOaBLoltsOI8Bw3eojrfxr6f22mMcrj22Q7Wc2F6ttqjAY7PyOsfGqCcusUc1BRQRmc2zzXRDcsgiQ+06ZNe+edd15//fXvvvtOt8PatWuvvPLKvn37du7cefDgwT/99BNvHz9+/Jo1a6655pr//ve/48ePN7lEDCzC0tLSwsLCv/71r507d77jjjsA4M4771T1GTt2bNOmTWfOnPnyyy9fd911n3/+ee2vm8woz1N+ELAzGHNKkwhxWR4lmoeyiV2oyprQzQrvm74qMRemYyK9tnUuZBQqLfq+ZQguEBIiy8QpE6cMTu4ULfHcEO18EST2RJNQb/p388knnwBAYWGhUYfnn39++vTpU6ZMAYCSkpJ58+bNnz9/+/btn3zySWlpacOGDYcMGdK0adPt27efddZZuiPE4Jm0aNGigQMH3n333Zdccsns2bPnzp2r6rB169b169e/+uqr/fr1e+2119auXbtt27baXzcJ4eag9mmr//y1maBtOE5UMI1RyJ/jO+CHWF0idC1ruRMRz60famMUEiLJxMFVUAYHqiCSgERVcbtWay5FRUUDBw7kxwMHDtywYQNv7Nq1a8OGDQGgQYMG3bt3LyoqMhohBkK4adMmxW/br1+/kpISj8ej6tC9e3fun3W73d27d9+0aVPtr5s8KDsLQky1qv4hRGpOOkR9ul2RO2MgIPFIGQkkB0mVwemAlJ2em7GaGpKAMCDU/iv6yzFWXl6enZ3N3zZp0qS0tBQAysrKlEYAyMnJ4e26xMA1Wl5e3qhRI37cuHFjPoPMzEzdDrxPWVmZ0WiU0vPOO09smTdvXvfu3aOe3smTJ4lOscdEIS3Dak8HmVDPsSoxRwKpghyv5SD1H3RqkXr4jUKInAIZqH+JQ0VFRbynYEbMn35ut1uSIphPjEUIftE7B1avXn3++eeLbddee+2DDz4Y8VRCSGpqak1NYL+56upqbnSlpaV5vV6lm9KuSwyEMCMjo6oqsOdcZWUlAIgqyDtUV1crbysrK1UdRCRJeu2118SWDh06ZGRYlgsNjLHanF7XWLdxfGzJ6V5DkgLNYA1qqYUSSImphQRIXWshY/5TUNEmc6EDUlAOE4FEfrZAwj/9RM4999znnntObGnRooXFc1u0aLFnz56ePXsCwJ49e/iJLVq02L17t9Jn7969LVu2NBohBkLYunXrnTt38uOdO3empaU1adLEqAPv06ZNG5MB+fdBFMTqkfXwtK07GKP72a9ZpGl0pxMiJ6d3lAFlzA/EQYH6WDX3C7TPXIp7TSAJCI2q1mjDhg1tPfn3799fXFw8atQoALj66quXLVt21VVXUUrffPPNa665BgCGDBly8ODBDRs29O3bt6io6MCBA4MHDzYaLQZrhNddd9177713+PBhAHj11VdHjx4tyzIAvPPOO3wtcMiQIRUVFTxS9LPPPquqqrrkkktqf90khGcKah2k+i5TElaCywoxdL2qLsoYZUAZ+PMhei+34bXEnYks72SrPbd+iPomM0YZo37m8zOvH7x+8PnBW5D5ZmynhyC1RNzAxuLLnOnTp+fn569du3bWrFn5+fkrV64EgI0bN06dGiitdd999/3yyy/9+vXr1atXVVUVDx9NT09/7rnnLr/88ssuu+yyyy577rnn0tPTjS4RA4tw0KBBV1xxRadOnfLy8rxe72effcbb586de9VVV5133nkpKSn//Oc/b7jhhnbt2u3ateu1115zuSyH+CN6GChfoL5M2Mb0ZqOQKDIoDJ7jqo3xeOJgcMs9IY+CJqo5S0CqfQZFRHtdffe06zfGwsx/STDm94M3OJYkgZSfuayNv/VXlRdFO2sEiSUMYrz7xIMPPnjXXaH06Ly8PAAoLCxU0gqbNGmyefPmb7/9Vpbl888/n1tiADB58uSRI0du27atU6dOzZs3N7kE0c1/j4KysrKjR4926NBBWUqtqamRZVmZU0VFxa5du9q1a2ciyz6fT7XCWXs8Ho/JkmTc8cNyu6forxQKVdZCQhixxJrNlHDj57gghEQCnvTND4hMQJKIgxBJIs7j1U/kZy6DYNUYGiw5LW5Pr+xHKG5PH9xWUDgr0O4XjkN9wlvCCnAL/tWwXSzUpa6tFKizcwN1fkNob2BACEM3UCJOnnwiSU6JOCSeREgcBGQljwJ9pPFChhvjPQUz4vL0+98ND574bXfkfgIbjv2xtWvOBx98UEdTikjM/EJNmzbt2LGjGFDkcrkUFQSAjIyMLl26mKggYhVCvGwxKD5AInvZ4igrbOlFlBEgut7X+o9Z5QWmYzeaxX/twW76vuXIg+jeKEsqqIdqSw3GKGN+yigDP2V+Cn4KlIEffaQIEjVYa/T0g2uely5wSVNr6Kt6XaSA4UIkbtaE+/0kKwUzI8ueoTmoAy86w+dQ/2GfhEh1lThv4F6u3Y8Gg3vI/NzDTIGSYKFz/qIAJCEjaZEkJLpgmTqajEUSstoVYg0DFQRKK22MQoiuXRj5LPucqJ5l9JFkbPxJUcWzqDbtC/9I1vaMMJqJURhdnlb4zwjTy4VQ3MUqozAQiJS5LJqZIEhM4XmE9l7xzpBGITwDccgNtY0R/Hu2nuZhnbX/hIwMmoDJws1BXbeniffSimPTenxspNPV3lENtdNCTX8De9rsToaWPIFyBykAPNSy2N5MECTWRFFZJu4RdCiEZyDVvhdCbyw+ysHy01xPBc39ohzdmEzdTXpNLy4rZ4VnTVjKoNAopY2rR1BZ63fP2s+I0JYd+vsY86giyoCKsUX/Pr7dKU2yGjaMIHVAFOkTMQrZjB4UwjOTGv98bWNkg8ncTRr5IR66kNbfeLLmWX6QwRqYz0KykwsYXUCNDe+oKLERrWobdw9s/YzQItYWUH5kUKDAGGM+W0MhSJKDQnhm4nY+oOvf0zzK9f4B8Ee29hWGZsxg3L/ufMTr/nZqtZWvUEs/p2oci4nzOt5RM6K+e2bjm39xVdSPsnexEj7aPKO/ly6wMHkEqRN4sIytl+3apLEGhfDMpNI7p8b/Sui9oRZCVP8GTEbT6UaIVFHzjNJa5f2bql+sNC80IJHBQPyMvr5e54i/JMDwx0QEIvyMsCjbDMIWCzkOSBng/tr+lBAkNvD9CDFYBkkUwhyksXmaS/oqKDzHxcH5EpfiFBVG0bkcDxxVzY17PiXNEqC4TMj7mISJBk8MH9nAAas/Qvjdi8kNDI2j/79Gsl4ujjJ/MI+CAsD/KgdZPBFBYk5UwTJxFkLMIzzjkXSzBvUqiimPYG1/U9NKo4K8JIrJnPzgJSATkBn4racVRl0FTXWiZpzALVLSDYUOwt0LJmUaT8bGDdSTWx1zMApbmYG/febSLnB2tktefLi33dMRpJZQZjsvEINlkDrEQSYwWhV6rzKJdCwbjqR5geGJxk48btBUeudoP3KB4cZggRkQHevQFrreUWOjMLKDF0DnBhqfEuEGasY0NGfNvwLVKxRAQD7qr0YVRBCLoBCesfBN7b1sMRHtfiJZfprroNbO0FAqczACv3hGa0c2vqjaOxq8pKTqE9E7GvFyyuQNA0St/pgwvK6RCoZPIPr/Rxz0jiLxAtMnkATCx5bwjQxP+V9Sf6b3NDd/2up0MFNBCQAY82vjYjgD3F+bLBOaTwPCl/ci6q5KHSMahZa00OYN1OkQ6ReJKoOQkMhLhtTGNs8IUlecjmuEKIRJQYojW91kEFFp9FKfG66CurgcWUYfKfaKSX0ZW9mEuiOYK4eVsBrTymo2bqCmn3pY7c8I1UwizpmjLFtekbnevCeC1BG2Q0YTIGoUg2WSAs+ppwAg1TGNspqw6A+OxYLUBgXANMaW5JDSxHwJXXo7ztrg+y04kESFqtxh1wSJAeVhNWEtRGYsEGjDg1x4H9362sEOgfFVfYSN70OhMXqBM8pXrpMbKKpgmMkb1a/Vjz0XRHEWgtQeaqWov+aU+IIWYRJR7Xuhxv+KTvgGt/A0zjrTjwxVkDGfQ06LOJnlR3vb9Y7aqr6taxSqZiu81YmaMbALIRY3UDJQwdBkxOo8Jn7R6CqSIwgighZh0lHjf8Ul36E2bhQiP1jFEBW1CoaVOTXl8ox1EuGGYMjaE0dmQCUiU6YYgupugiUHJkYh72Zg4YFgJkawC0Gdui7p/5CNcAN1XJ2CCmp+XmjuNgHZfFmUApVBBoAn225wy3T6jn6m80GQWBNFpZh4B8ugECYXWamPM+Z3yplevwcATFPfVBguVvHncrXvRVszWVHRzyktaJ1+SXD0CN7RQDciURbWTTcNUeULFRu1by1qIWhE1M7dA5MbKHbQWn66tcUlkIzqcXM7+5ac4hZukhrLjY0RxBK4HyGS0DTNeEEmKRJxylJKiqNRmjNXKMMmRXoFEKM/CJEIkap9L1b7XsxwPWR3Pl66yHqJGRWi51NbZUa3m6oRQMf5Ge4jDfuaSk/jyjJR3kClAxGyJwkRu+lrntFtAYCFh3q7JIZ/3kj9Q+2/4m0QokWYTPjoKUIkCZwM/EAcXDNq/K+45Nsi/iTSBPdLjFHRCowYHaNl7llrG9LGR6RDYokZldXFvaNiyAw3Ck2nGiFqBsKsQBO7EIxMQxBuiMViN9obqJlbmApquwU3ZjL8P6VaXn10V18rE0OQ2MJrjdo7BS1CpN6QiFMmTpk4JOKUiFMmgZ9BNf75Nf5XavyvANAa/yvBtSj9BAC3q9kp/0t+v8dPK3jOftRkp9R8e3J4LY3CYH9DkVAZhXpWoIldCKrwGR0B00uWMMmgCB9E3xYEIVhGNAcDtQXwzxZBYgpahEmEg6T42ClCJAKhABARXqRbTMB3kokA4GWLVT29bLGDTOAJ+1Ez7idL1U/MjcJwAy6AyigUMy7Asl0IoT3/wgKLFBnTWpzBq+sLlUZEw3RXpYLiR9pzuTpKRCLAD6z6ThGkrmH20yHi7hrFP54kYn/FnSlShktyO0hKqpR14OR08/5OMpHXP9K1/GqpggpD3WdBuK0TSKg3rTIjCYKhu229WHRNwaJdGLY4p141VNt24svkI40VKInja1VQSZkQzUFCJIvm4HUNi6x0Q5CYw5j9nPp4zxktwuTCCSk7PTdb7U0ILwIYK83TpXW6X6o03IBCzKPQJterEPPrQyOos+kj24Vio3hK6DoA+nt6mCU26EsyGKig6iMxCMhK7Mxbx/qYd0CQOiKKqFFcI0TqFRsqCOCli3xsicVNYqNjUcc1KRL1gxciGYVSmHKEynDrx4WGR5BG9DdqwjjDGkFtGgZmZLK/hF4fnaFCa4oaFdSZZPj/CNEvqowmgaRbtQ5B6hNm/xVf0CJEIuCli+pu8Ek/DwSAaXBhQeab5kah9ljdTSi6BiFDMMx8tGIXqhpBiAtVxEm7KmnlN6VR4TQjFVTFyEAwfVBnZJDEHw1OSIk4GQRBFFAIkYSgGipc4DbKo9Aei1EzKnlTpdjrBs6AgRZCUPZUblIIT5MQ1UhPFEG3pzAl/YBVrQrq51GAZF5ZTbvLFYLUG+gaRZAo2euZyg9Unj0j76jSUwp3ewbPMguc0fWRmrtJIejG1C7OcVen0St8wpLoC7WogkpNNZU5qPKLIkiCgAn1CBI9PaWC72gJPxaNQglkCn5t1AwErT3RLlTsPFXgjGIXAgCPnQEA3h+CVp2RacinpDIQRXS9tVaSKDRmn5kKKqeozEHuFxUXCJ3SZAjaqdrUFwSpU5j9WqMohAgCd+YVUwYNXcRR7fCBT3SQ8g5cCwPH4VoootLCQGO4Foa36LhJIah5mgVCw/RBKzl86kQOrXdUTwWDXz+YayGmUhhcNJvm7gHKgAEAgTh7nJAkJIo8woj9t23b9uKLL544ceLKK68cO3as6tOffvrpjTfeEFtuvfXWdu3arVmzZuXKlUrjjBkzGjVqpDs+ukaR+EODPwh/9Vyn+igsqAR0tER0kIY+EjILQeMjDW9Ru0kB1Eabtjqabu6geuZGKYYa76hBNmG4Ozc4PUlIpeB59KqEy83V7/OkF46TTKxlASAEiS/l5eUDBgxo2bLlVVdd9ac//UmleQDgcrkaBTl48ODcuXMbNmwIABs2bPj666+VjyTJ8K8VLUIk/jhI6CehA9RGoZGDVDndSuCMuV0Iem5SPrjYJ9AS/vvVYnqJNkw0eCyLHbQqqCwNmv8m4H5RCaQa/3ynNElJUUbXKFLPRFFrFEz7L168uF+/fo8++igAeL3e//u//xs/frzYoaCgYMaMGfz4nnvuufrqqxXLr3v37spHJqAQIvFnXnlv5XhHxadtMoaYdNZdLORErYXKsBBUJnGnQwh3h5qIomqeOo3GEggGKij2iWgOlnhu4LPlp9dp6guC6EJZyMdj/RQTioqKLrroIn580UUXjRs3rrq6OjU1VduzpqbmX//619tvv620bNq06Y477mjZsuX48eNbtWpldAl0jSKJhY8tCahUpKJrkuhODMmDTu68ro9U0RsLxdXAyBGqBIJqX2Hdwk9X5dSLc9OqoLI0KAnzDC8voK675mNLvHQRqiASF1iso0bLysoaN27Mj3NychhjZWVluj3ff//9jIyMiy++mL9t167dZZdd1q1bt5KSks6dO2/bts3oEmgRIgnHTs/NHTLfiuggBU09bgAw8ZECAI8jhZDDM2Qagl6MjDaDvjZ1diIl1IctCqo8okGBD6VMKMGiwQHlHZ5xUc8NQWIFrzVq7xQgq1evPv/888XGq6+++uGHHwYAt9t96tQp3lhdXQ0A6enpuuMsWrRo0qRJylrgmDFj+MFtt91GKf3b3/62Wl6FrwAAH/9JREFUcOFC3RNRCJFE5FfPdWKtGRMt5FjxkSrjgKB8inyCnhyCRhEhUga9Cp0d5/UWC3XdoaBRQd1BsKwacgZw7rnnPvfcc2KL4sls1arVnj17+PHu3bvT0tKys7O1I+zdu3f16tULFizQHb9z586rV682ujq6RpEEpQtpD+FPfwVxt0JJFWyi8ZEGg1BCqQgmnlIId5aKI4RaTDPojRLqVS7TUMio4KSFMC+urFVB0SkqhWdQGBUiR5B6JrqE+oYNG/YMJzc3lw94zTXX/Pvf/66oqACAJUuWXH311dzm++STT37++WflugsXLhw8eHDr1q2VltLSUn7g8XjeeeedXr16Gc0ZLUIkQfngRN8Ombt0HaQQzCxUBZGK1dcgaBeG2oUoGK1pCEGx0VqHoIl8iW5X+kCjcS6HJGi2rgoqw0pCiiH/1AVuK1NCkLqGMTF/x+opJlx66aWvv/56t27dWrZsuWfPni+//JK3z5w58/rrr+/YsSMAMMbeeOON2bNnq048depUbm7ujz/+2LdvX5PwURRCJOH4Z4f/Vfklj1e+LLP9x57tVKksaqqFAKC7XggAKjcpAIirhhBJDhVMisuYoBdioy+BYKqC4tJg8CCggl0hfzsr65LxwdaKq6xPDEHqAgaE2qzkYK6bkiS9++67P//887Fjx84777yUlEBN+U8++SQtLS0wAmMbN25s0KCBeGJRURE/q127diYho4BCiCQgMmEOiaXKrCHQEs8NfLEwohaCpuiMyjRURcEopiEYyyGEuxyNdFGFUUBN+J6CYYt8oMmmMFJBsQ/HAY4PPRcY304EqVeiSJ+wYkFyy09EXCmUJElbNcbpdHbr1s3KBHCNEEk4nBJNkWiqTNMdFABKPDcEkyjUCRUQvl4I4TkVIGiPmHsQOBDW8FQLh+FrhLLyUs2TaPag16ZYaE8X+yjXVQxBc48oCEuDijmoLceDIIgtUAiRxOKrPh/dvO1il0TTZH+aI2CNNaSNxVhKu1qoKsNmlC+olUMTVbP4Cp0bPqAogSp3qJgpwW1BSQmcEVSQj3PYt/PuvOJobzaCxJ4oduXFotsIEsYlRVcCwM3bLhYbvz053CXf1srdP7T4Z+AjBQBhyRBA8YUGy7DxAbWeUhDiaAJ9wnefEDFyiironhWWF6GXU6g1BEVRFwNkeDc/eI9VPW4+EwSpZ5j9/QjtrinGnNgIod/vf/fdd7dv396jR49LL71U22HNmjUHDhzgx5mZmcOHD4/JdZHkocY//xL3f3fLe0BRtaAWAhe/4A4V2iVD3kGMghGDaMAgfV7ULRoeJmorrV5V9sVEAiGSCipFZHi3XZ6J1qeBIPUDs7bmpz4nrsRGCCdMmPDrr7+OGjVq+vTpxcXFM2fOVHWYNWuWLMvt2rUDgLy8PBRCJApap6W6qtuWSLsgXAshKH5GWii2qOSQ6u+4pC4ooxIz0EijgranaszAW1MJBAsqiHVkkMSE1sE2THVNDISwpKTkvffe++OPPxo3bjxq1Kg+ffrcf//9WVlZqm5Tp0699tpra385JGlZcrg3AIxu4NhEt4OxFgKAKpQUgpkVEO4pBcE0BEGEtIoImoIyRoInYl5WRtImFOqVCEAVRJC6JgZC+NVXX/Xu3ZsXRe3UqVOTJk3Wr18/bNgwVbd169adOHGiQ4cOF154Ye0viiQtR33eS9LOXn1KnV8IoiEYvmQI4aYhGHhKwVgRQU/VrKPKO5TCo1IhkiEIwrogAJwnnZXquIfSagCgrMbHlkQ9MQSJPfZ3qDffhqkeiIEQ7t+/v1mzZsrbpk2b7t+/X9WnZcuWhw8f3rBhw2OPPXbhhRe+/fbbhOh/c8bYAw88ILZMnjy5bdu2UU/v1KlTLpcr6tPrGkdKvGdwuvHFyQEAcGmG7zeyS9RC4DW1w7UQwt2kAKArhxBJEYN9bLhwtEn3Wv1T9bSigqXVP3xEv2HMx6dJiPRE66In9vSxPjEkhijFoBOTmD/9XC6X0aNb4Ux2jeoWOZ0zZ86kSZNkWfb7Q14jv98vy+rfzkuXLuUHhw4d6tix46effjpixAija6nyIl0ul8nOwhGRJKk2pyOJyX8q+gH0a5k5PwUytKGkEAyfgaCbFATTEDRyCJoMelG0aFQFZVSDBEcw1D8Il0DQU8EdnnEu+RvGfCD4aZ/6459PSf8kJLXG/4qt6SG1J8GfLXF5+kWTUF83M7GOVSH8/ffftY28vE2zZs1WrVqlNJaVlTVv3txonJycnB49evz6669GQkgI4VtvxAqn0+l0OmM4YGzBSsm14Q/PbV0yPqgiJ0FYMoSgaQh25BAMFBH09MwuqmR8IwkEPUMQwlTwNkUFGTAAIECAMSAkAX5VJyOJ/GyBOD39osgLjLsQWv0Lz9KD3+KhQ4du3LiR75T4/fffHz9+/IILLgCA0tLSnTt3AgCllAXDaY8cObJ58+azzz67Tr4Nkkw4pUlOafJvlSvb0Ta8JVRHRlOKTDSzRB3iL/EjVSa+UVkZc3TPFcdXXVecpMoQJCBLIAWiY1jA7cQ0j44a/3xbM0QQRCEGa4Rt2rSZNGnS4MGDR44c+c477zz22GN818SXXnppy5YtK1asKC0tHTRo0IABA1wu1//7f/9vwIABJn5RBLGCU5oEANwN89+qNyQptUVabxCyI0xMQ9DkS4gGImhsxGBjNMEyeiuFet5RY3eoGJ5qa5ESQeICi6rWaHyjZWKTR/jyyy9//vnnJSUlb731FjcHAWDChAkejwcAmjVrtnTp0m3btvl8vvHjx/fr1y8mF0WSFqc0SUzZZcTnp5U7POOaZcxzk0YgZkcIAaUgyCEIzlII95eCniKGrhVJiozWEXX1DwwkEIIqeNy/71Clzt4xBIjWKESQRCC6bZjOBCEEgKFDhw4dOlRsKSgo4AeSJF1wwQWKQCJIbWEMBPcgYQCEOqXJXrrgmqwNW9hOKu7EFDQNIdwQ1BqIoFFEDhUiU6zHy0h66RYmEgjhhiAA7PCMe7x1Ufj39gnbGcY54hxBdKGx3oapHkjokCcEsQID/hOUAsB7J/p2I+33VRWLa2wQLHKtVOsOrdWBrLzEj3SXEm29+LmqAcXLCY2BlzLbbJrLFwVnhedF+NgSAAkIASWEnRAAYIw6yIS6vs8IYgUWDBy19YovKITIaY/KNnrvRN9q34slnhscQYeHGLEStsWEoHYgiKIwsqQrjQbTUHcWlwDFkcM/Ugv2Ds+4XhkNH2lVpHcR8NIFXroIALgceukiL1uM1iGC1AbcfQI5XVE//TXrEhNz2lT4pGXHtsngBFWVUY2/FMTYGUELaXiGi0XXqKQXWRMuuurker6c2Ya2AoCXy3ubj6/KGvSyxVZmhSD1QCJsq2QXFELk9MPLFjtJ+MYLhATsJIG8tFN5ALv2TkyR72rp7hvoqJFD0CgiGIhiFOhEjYaHw/CWaqjY65lqfVjMnUcSlihcnXEPhkYhRE4/+HqYUmPTJd+mm0U3Mbip4Sn/S/xgdIMNSsFupZsSUKOgJF0YoYodNe+s3oZJuLQEUonnhvGNihu64JFWRU/txUppyGkPWoQIUk+Ilaat5JI7pUksUD6UeNnirhkfVZOT1KiUjEYXVaPZUr7gKWGWJQP/Ts/N/LihC1JlcBJ46exv7vqtf8TvgiCJTBR5hHEPlkEhRE4/otlvIXwF8ceKK6c2Kf755MkDcrkPeAFrtZmoHFvZcUkXbQ6+BNJFKWctPBS2BJjuAJfMHBJDFUSQuIBRo0hSwEMrCRAIJja8erD3/yoHjW3UbkyDs/ecXN2E5qkCWLQvk/FN+vM41c6Qv8Mz7veKz5ceVi/vzd7Xe9aePtkp3ph+YwSJD1HkTtje0T7WoBAiyYKXLfayxV66QGyctadP8zSvly7YcLLwsH/3Uf/eHZ5xZad+7MTa87XD8HQLHbVTaR7/7yHv9gudZ+/wjNvhGTe2YX6J54aPPReAqS17+68D6uiLI0h9wqJ6xRd0jSLJzt0lgZ2ij1Q+xA9O1jwLAACGtQAvzVi3Cb4rrbibv+2V/um3J4cbdX5yrzYpHkHOWKKpNVo3M7EOCiGCWGV8o2IvY6coo4zls8793F/KIDlAygR3vKeGIInC6bgNEwohgkTmlpxif/CPVQJwEOIGFwUGABIQCeDyjHUrKrCaPIKclqAQIkgEpjYpVo4JgETAIUliUoUEIBNyVdaGVIn86xjmAiJJTTQ71MfbJMRgGQQx4/bcYgCQAAgAISARIhPiIOCQJCch/OWQJN7IAG5qXBxxTAQ5g2HBnZhsveILWoQIYsjtucUSAb6xhfCbkRAAmQBloWKnEuHGIha/RpIdZr9kWrx1EIUQQYxxEKAQqO3NN4mAwDGhACT498v1TwqYjPGYKIIkDHVRa/SHH36YO3fu0aNHr7rqqptuukn1KWPsoYceUt5ecMEFV155JT/+8ssvFyxYQCmdOHHi8OGGod3oGkUQfabkFBMCEgR2VFKOZRLYTtApEQchTonIBJzBPQZlAlNy0DuKIDGjrKzs4osv7tix46RJkx5//PHFi3X2Wnn22WebNm3avn379u3b5+Tk8MaNGzdeffXVw4cPHzVq1PXXX//NN98YXQItQgTRJ90JwH+rskCMDAWQASQImYkhG5EAoFGIIMC3yY6ls3PRokUXXXTRAw88AACVlZVPPfXUxIkTtd1uvvnmRo0aiS3z5s279dZbb775ZgAoKSmZO3du//76VQzRIkQQfRQ5CxmCQdNQJuAIf0kQsBR5TwRJWpj9EmvmrtRvv/12wIBA3aX+/fv/+OOPVVVV2m6PPPLIPffc8+6777Jg7I3qxG+//dboEiiECKJPMP4loHxSsIXLId9yngQPuF808CnAnXnFd+ehgxRJRqIJGTUVwrKyssaNG/Pj7Oxs3qLqM2XKlJ49e7Zp0+bPf/7z7bffzhvLy8vFE0tLS40uga5RBNHhidZFEhAgQBnIwcBROfjLUVnbl0PhMwA8nBRAIjCvNMIW8whypkLtR41SgFWrVuXn54uNN91001/+8hcASE9Pr66u5o3cFszIyBB7EkJeffVVfjxy5MhOnTo9+eSTOTk5brdbPFF1lggKIYLo8MSePn9uUSyxgIdUkcOANAJAMAuYhC8TEsA1QgSxTb9+/ebPD9tYlBt/ANCqVatdu3bx4127drndbiUcRktBQYHD4SgvL8/JyVGd2KpVK6Oz0DWKIPowFowUVQJHIeQaVbyjgWPBa4p/VEgyE8UaIQNIT09vH06DBg34gKNHj3733XdPnDgBAIsWLbrmmmsIIQDw0Ucfbd26FQAOHjyoWH6vvvpqgwYNzjrrLH7i0qVL/X4/pXTJkiWjR482mjNahAiiz5z9vR9sUUy5t5MBBANHFSgLM/4U7+j/7UO/KJK8RBE1at5/+PDhF154YdeuXZs1a3bo0KFVq1bx9qeffvr666/v0qXL119/PXXq1HPOOefo0aMVFRXLly9PSUkBgKlTp37wwQddu3Z1OBxut/uuu+4yugQKIYIYQgFkAowBBCVQdIoGfKGaZcIHmhcDwJz9KIdIMkIhxrVGJUlatmzZjh07jh071r17d4cjIFurVq1yuVwAMGbMmMGDB+/YsSMrK6t9+/a8EQDS09PXrFmzbds2SmmXLl2IceEnFEIE0Wdmm6JUGbw08OcjiX+rmj8o5U+MO1QRJGmpo22YVKE0AJCVlaUcZ2dnK2uKIoSQzp07RxwchRBB9JGASQRm/dHnkVZFADxMRl/iJBL4QyYAT/6Bu08gyGkGCiGC6PPY7r784Km9fR5tVQQAMlG7cERhlAjM2oMqiCQ7jDFqczsJFu/tJzDADUEik+mkT+7to9SXkYVCMxIBB4EqP0EVRBAI5hHafcUXtAgRJDIzdl4AEDD4HmxRnCoHfsA+geKHIOEwxuJu4dkFLUIEscfsfb2f2NOn0k+8DLjLFEEQBXYaWoQohAhim2nNihkDPyUMUAsR5LQHXaMIEg2BnZgokaXTzAuEIHUKZYDBMghy5vNCaW/gpaQA/BTTBhEkBIvqFV/QIkSQaPjb/t7TmhW/gOVjECQcBozGtMRaPYBCiCBR8gLutYQgGmg0eYR1NBeroGsUQRAESWrQIkQQBEFiRsx3n6gHUAgRBEGQmMHs5wXG2zOKQoggCILEDmo/WMZu/5iDQoggCILEDGbf1Rl3ixCDZRAEQZCkJmZCePz48d9//92kQ1lZ2Zo1a8rLy2N1RQRBECTRoEDtvli8q43GQAi/++67Dh06NG7cuEuXLkZ9lixZ0qVLl6effrpz586vv/567S+KIAiCJCA8od7W60xwjbZo0eL111//73//a9ShsrLyvvvu++ijjz777LMPP/xw2rRpVVVVtb8ugiAIkmjYVcEogmtiTgyEsGnTpn369ElNTTXqsGrVqpycnAsvvBAA+vfv37hx4y+//LL210UQBEESDZ5HaOsV93CZ+oga3bt3b9u2bZW3bdu23bt3r1FnxtiqVavElp49ezZs2DDqq1NKKY37dlfGYLgSgpy2JPSzpQ6efpJ0Zj6wLAnh1q1bH3/8cW373LlzW7VqFfH06upql8ulvE1JSamsrDTqzBh75plnxJZnnnmmc+fOVuapS1VVlSzLUZ9e16RlxHsGCIJEi8mjLBGI+dPP7XZH1EIGjNoMfom7a9SSEDZr1mzChAnadouGWl5e3uHDh5W3hw4datasmVFnSZK++uorK8NahDGWkZG4auOP9wQQBImaRH62QJyefpQwSmzmEdrsH3MsCWF2dvYVV1wR9TV69+49depUj8eTmZl54sSJLVu29OrVK+rREARBkISFAbVrEca91mgMHL4ej+fZZ59dunSp1+t99tln58+fz9uHDRs2b948AOjQoUNhYeGNN964YsWKG2+8cdiwYQUFBbW/LoLUMw4yId5TQJBEhwFjfJt6O6/4zjkGQsgYO3r0qNvtnj59+tGjR0+cOMHbr7766nPPPZcfv/nmm+eff/4bb7zRp0+f5cuX1/6iCFL/+NiSeE8BQZDYE4Oo0aysrNmzZ2vbb731VuU4IyNDN9wGQRAEOZOgp6FrFItuIwiCIDGDEkaJzajR0yJYBkEQBEGsEFWwTJzXCFEIEQRBkJgRRfBLRNfod9999/zzzx8/fnzUqFGTJ09WfXrw4MHXX399w4YNXq93wIABd955J6909tlnn73//vtKt6effjo7O1t3fBRCBEEQJHHZv3//4MGDZ86cec4559xxxx2MsSlTpogdVq9e/eOPP44ePdrlcv31r3/9/vvvly1bBgCbN2/etm3b+PHjeTexrosKFEIEQRAkZlD7lWXMLcKFCxcOGjTo3nvvBYDZs2c/8cQTKiEcPXr06NGj+XFubm5hYSFjjBACAB07dpw6dWrECaAQIgiCIDEjijVC8/7fffdd//79+XG/fv22bdtWVVWVlpam23nHjh0tW7bkKggARUVFN910U4sWLSZNmmSSv35mVlBFEARB4gIl1O7L3CIsLy9v3LgxP+aLfGVlZbo9S0tL//znPyvVqs8555zx48cPHz68oqLi3HPP3bx5s9El0CJEEARBYgYDymwWUWZAV61alZ+fLzbeeOONs2bNAoD09HRlC1t+kJmZqR3k4MGDhYWFd95559VXX81brrzySn5www03VFdXz507d/HixboTQCFEEARB4ky/fv2U8pycnJwcftC6detdu3bx4507d6anp2uDP48cOTJ06NBRo0Y9+uijuuMXFBSsWbPG6OroGkUQBEFiBl8jtPViQNPT09uHk5WVxQccO3bsO++8c+zYMQBYuHDh6NGj+RLgv//97x9++AEAjh8/Pnz48EGDBj355JPiTHbs2MEPDh8+vGzZsn79+hnNGS1CBEEQJGbwott2TzH5dOjQoYMHD+7UqVPTpk0rKys///xz3j5nzpzrr7++e/fuy5cv//bbb7dv375kyRL+0Y4dOxo1ajRu3P9v7/5Covj6OI7vmrpkJqaWbqlkgmRo1wn91USTIDU0zQRJEuoqRAjTLOyiyEIp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"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2021-07-16T18:08:54.513000+09:00",
"start_time": "2021-07-16T09:08:22.906Z"
}
},
"cell_type": "markdown",
"source": "### GPU (CUDA.jl)"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.250Z",
"end_time": "2021-07-16T19:44:26.185000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "using CUDA",
"execution_count": 30,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.251Z",
"end_time": "2021-07-16T19:44:29.709000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "zgpu = cu(z); # transfer input to device",
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"text": "┌ Warning: The NVIDIA driver on this system only supports up to CUDA 10.2.0.\n│ For performance reasons, it is recommended to upgrade to a driver that supports CUDA 11.2 or higher.\n└ @ CUDA /home/antimon2/.julia/packages/CUDA/lwSps/src/initialization.jl:42\n",
"name": "stderr"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.252Z",
"end_time": "2021-07-16T19:44:40.476000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_set_gpu = replace_nan_inf.(collect(mandelbrot.(zgpu)))\n@time mandelbrot_set_gpu = replace_nan_inf.(collect(mandelbrot.(zgpu)));",
"execution_count": 32,
"outputs": [
{
"output_type": "stream",
"text": " 0.002845 seconds (1.38 k allocations: 8.022 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.253Z",
"end_time": "2021-07-16T19:44:42.431000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_set_gpu = collect((replace_nan_inf∘mandelbrot).(zgpu))\n@time mandelbrot_set_gpu = collect((replace_nan_inf∘mandelbrot).(zgpu));",
"execution_count": 33,
"outputs": [
{
"output_type": "stream",
"text": " 0.001796 seconds (1.26 k allocations: 4.021 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.254Z",
"end_time": "2021-07-16T19:44:42.446000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_set_gpu = collect((replace_nan_inf∘mandelbrot).(zgpu))\n@time mandelbrot_set_gpu = collect((replace_nan_inf∘mandelbrot).(zgpu));",
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"text": " 0.003181 seconds (1.26 k allocations: 4.020 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.255Z",
"end_time": "2021-07-16T19:44:42.538000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "mandelbrot_gpu(z) = mandelbrot_gpu(cu(z))\nfunction mandelbrot_gpu(zgpu::CuArray)\n collect((replace_nan_inf∘mandelbrot).(zgpu))\nend",
"execution_count": 35,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 35,
"data": {
"text/plain": "mandelbrot_gpu (generic function with 2 methods)"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.256Z",
"end_time": "2021-07-16T19:44:42.571000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "# call twice to avoid counting compilation time\nmandelbrot_gpu(zgpu)\n@time mandelbrot_gpu(zgpu);",
"execution_count": 36,
"outputs": [
{
"output_type": "stream",
"text": " 0.002963 seconds (1.26 k allocations: 4.020 MiB)\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.257Z",
"end_time": "2021-07-16T19:44:53.112000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "heatmap(x, y, mandelbrot_set_gpu, clims=(0, 2), aspectratio=1)",
"execution_count": 37,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 37,
"data": {
"image/png": "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+eXQn4+k/lvV/UEpf2LCoQpAylJP2zBpQmmIqFGjRspxbm6usqaohjHWvXv3qINDCAEwRiIuMZr1+4AH2xcRiTAZY4mTWOgPmRE99jt2nwDgOANCCIAxD28fKA4e3zngofZFRORiWheOWhglRrN2QAVBqsM5lx1uJ8ETvf0EAtwAiE6OR35s5wClvoxLVWhGYuRmVBVkUEEAKJxH6PSVWGARAhCdGVvPJAoZfPe1LU53hX7APgrxAyASznnCLTynwCIEwBmzd/V/dMeAyiDzcxIuUwCAAj8OLUIIIQCOmda6mHMKyowTtBCA4x64RgGIhdBOTDJzSceZFwiAekXmhGAZAE58ni3tT6KUFFFQRtogALXwmF6JBRYhALHwl939p7UufhblYwCIhBOX41pirQGAEAIQI89iryUAdMix5BHW01zsAtcoAACAlAYWIQAAgLgR990nGgAIIQAAgLjBnecFJtozCiEEAAAQP2TnwTJO+8cdCCEAAIC4wZ27OhNuESJYBgAAQEoTNyE8fPjwb7/9ZtGhrKxsxYoV5eXl8boiAACAZEMm2emLJ7raaByE8Ntvv+3SpUuzZs169Ohh1mfRokU9evR44oknunfv/uqrr9b9ogAAAJIQkVDv6HUiuEbbtm376quv/ve//zXrUFlZeffdd3/wwQeffPLJ+++/P23atKqqqrpfFwAAQLLhVAVjCK6JO3EQwlatWg0YMCA9Pd2sw/Lly5s3b37WWWcR0eDBg5s1a/b555/X/boAAACSDZFH6OiV8HCZhoga3blzZ8eOHZW3HTt23Llzp1lnzvny5cvVLX379m3SpEnMV5dlWZYTvt2VOQhXAuC4JamfLfXw9JOkE/OBZUsIN27c+Mgjj+jb586d2759+6inV1dXe71e5W1aWlplZaVZZ875k08+qW558sknu3fvbmeehlRVVblcrphPr28yshM9AwBArFg8ypKBuD/9MjMzo2ohJy47DH5JuGvUlhC2bt16woQJ+nabhlrLli3379+vvN23b1/r1q3NOkuS9MUXX9gZ1iac8+zs5FWbYKInAACImWR+tlCCnn4y4zJzmEfosH/csSWEubm5l1xySczX6N+//9SpU30+X05OzpEjRzZs2NCvX7+YRwMAAJC0cJKdWoQJrzUaB4evz+d76qmnFi9e7Pf7n3rqqRdffFG0X3DBBfPm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"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.260Z",
"end_time": "2021-07-16T19:44:53.118000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "using BenchmarkTools",
"execution_count": 38,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.262Z",
"end_time": "2021-07-16T19:45:09.122000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu!($mandelbrot_set, $z)",
"execution_count": 39,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 39,
"data": {
"text/plain": "BechmarkTools.Trial: 9 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m599.965 ms\u001b[22m\u001b[39m … \u001b[35m602.747 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m601.858 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m601.556 ms\u001b[22m\u001b[39m ± \u001b[32m825.236 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n\n \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \n \u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[34m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n 600 ms\u001b[90m Histogram: frequency by time\u001b[39m 603 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m0 bytes\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m0\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.264Z",
"end_time": "2021-07-16T19:45:20.888000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt!($mandelbrot_set_para, $z)",
"execution_count": 40,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 40,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m180.281 ms\u001b[22m\u001b[39m … \u001b[35m185.247 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m182.218 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m182.173 ms\u001b[22m\u001b[39m ± \u001b[32m 1.132 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n\n \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[32m█\u001b[39m\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n \u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m█\u001b[39m▇\u001b[32m█\u001b[39m\u001b[34m▇\u001b[39m\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m \u001b[39m▁\n 180 ms\u001b[90m Histogram: frequency by time\u001b[39m 185 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m4.69 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m57\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.266Z",
"end_time": "2021-07-16T19:45:32.637000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt2!($mandelbrot_set_para, $z)",
"execution_count": 41,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 41,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m180.404 ms\u001b[22m\u001b[39m … \u001b[35m189.360 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m183.399 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m183.823 ms\u001b[22m\u001b[39m ± \u001b[32m 2.425 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n\n \u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m \u001b[39m \u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \n \u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n 180 ms\u001b[90m Histogram: frequency by time\u001b[39m 189 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m8.01 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m97\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.268Z",
"end_time": "2021-07-16T19:45:44.466000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt3!($mandelbrot_set_para, $z)",
"execution_count": 42,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 42,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m178.795 ms\u001b[22m\u001b[39m … \u001b[35m191.436 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m183.427 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m184.840 ms\u001b[22m\u001b[39m ± \u001b[32m 3.338 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n\n \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m█\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n \u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[34m▇\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[32m▇\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m \u001b[39m▁\n 179 ms\u001b[90m Histogram: frequency by time\u001b[39m 191 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m8.01 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m126\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.270Z",
"end_time": "2021-07-16T19:45:55.766000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_gpu($zgpu)",
"execution_count": 43,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 43,
"data": {
"text/plain": "BechmarkTools.Trial: 4287 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m1.033 ms\u001b[22m\u001b[39m … \u001b[35m 3.795 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 51.39%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m1.092 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m1.161 ms\u001b[22m\u001b[39m ± \u001b[32m230.398 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m5.64% ± 15.06%\n\n \u001b[39m \u001b[39m▂\u001b[39m█\u001b[34m▄\u001b[39m\u001b[39m▃\u001b[32m▃\u001b[39m\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n \u001b[39m▆\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[32m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▆\u001b[39m▆\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▅\u001b[39m▃\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▅\u001b[39m▆\u001b[39m▇\u001b[39m█\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▄\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▅\u001b[39m▂\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▂\u001b[39m▄\u001b[39m \u001b[39m█\n 130 ms\u001b[90m \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m 2.35 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m4.00 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m96\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.273Z",
"end_time": "2021-07-16T19:46:09.387000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu($z)",
"execution_count": 44,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 44,
"data": {
"text/plain": "BechmarkTools.Trial: 9 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m589.939 ms\u001b[22m\u001b[39m … \u001b[35m594.724 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m591.969 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m592.082 ms\u001b[22m\u001b[39m ± \u001b[32m 1.746 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.00% ± 0.00%\n\n \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[34m▁\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \n \u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n 590 ms\u001b[90m Histogram: frequency by time\u001b[39m 595 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m4.00 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m10\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.275Z",
"end_time": "2021-07-16T19:46:21.043000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt($z)",
"execution_count": 45,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 45,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m178.163 ms\u001b[22m\u001b[39m … \u001b[35m184.186 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 1.05%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m181.188 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m180.868 ms\u001b[22m\u001b[39m ± \u001b[32m 1.329 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.04% ± 0.20%\n\n \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[34m▃\u001b[39m\u001b[39m▃\u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n \u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[32m▇\u001b[39m\u001b[39m▁\u001b[39m▇\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m \u001b[39m▁\n 178 ms\u001b[90m Histogram: frequency by time\u001b[39m 184 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m4.01 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m67\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.276Z",
"end_time": "2021-07-16T19:46:32.772000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt2($z)",
"execution_count": 46,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 46,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m179.256 ms\u001b[22m\u001b[39m … \u001b[35m187.109 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m182.222 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m182.268 ms\u001b[22m\u001b[39m ± \u001b[32m 1.726 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.04% ± 0.21%\n\n \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m▃\u001b[34m \u001b[39m\u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n \u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▇\u001b[39m█\u001b[34m▇\u001b[39m\u001b[32m▇\u001b[39m\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m \u001b[39m▁\n 179 ms\u001b[90m Histogram: frequency by time\u001b[39m 187 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m12.01 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m107\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.277Z",
"end_time": "2021-07-16T19:46:44.623000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_cpu_mt3($z)",
"execution_count": 47,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 47,
"data": {
"text/plain": "BechmarkTools.Trial: 28 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m180.058 ms\u001b[22m\u001b[39m … \u001b[35m190.753 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m183.526 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m184.158 ms\u001b[22m\u001b[39m ± \u001b[32m 2.916 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m0.04% ± 0.21%\n\n \u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m \u001b[39m▁\u001b[34m▁\u001b[39m\u001b[39m█\u001b[39m \u001b[39m▁\u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m \n \u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n 180 ms\u001b[90m Histogram: frequency by time\u001b[39m 191 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m12.01 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m136\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-07-16T10:44:05.278Z",
"end_time": "2021-07-16T19:46:55.928000+09:00"
},
"trusted": true
},
"cell_type": "code",
"source": "@benchmark mandelbrot_gpu($z)",
"execution_count": 48,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 48,
"data": {
"text/plain": "BechmarkTools.Trial: 2609 samples with 1 evaluations.\n Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m1.761 ms\u001b[22m\u001b[39m … \u001b[35m 4.143 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 49.48%\n Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m1.810 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m1.911 ms\u001b[22m\u001b[39m ± \u001b[32m303.916 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m4.43% ± 12.48%\n\n \u001b[39m▆\u001b[39m█\u001b[34m▆\u001b[39m\u001b[39m▆\u001b[39m▄\u001b[39m▂\u001b[32m▁\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\n \u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m█\u001b[32m█\u001b[39m\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m▇\u001b[39m▆\u001b[39m▇\u001b[39m▅\u001b[39m▆\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▆\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▁\u001b[39m▄\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▆\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m \u001b[39m█\n 1.76 ms\u001b[90m \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m 3.17 ms \u001b[0m\u001b[1m<\u001b[22m\n\n Memory estimate\u001b[90m: \u001b[39m\u001b[33m4.00 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m170\u001b[39m."
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "julia-(10-threads)-1.6",
"display_name": "Julia (10 threads) 1.6.2",
"language": "julia"
},
"language_info": {
"file_extension": ".jl",
"name": "julia",
"mimetype": "application/julia",
"version": "1.6.1"
},
"gist": {
"id": "",
"data": {
"description": "Mandelbrot.mt.cu.jl.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
[compat]
julia = "1.6.1"
[deps]
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment