Skip to content

Instantly share code, notes, and snippets.

@pentschev
Created August 5, 2019 15:34
Show Gist options
  • Save pentschev/7b348f8409ba35341a3f646093e61336 to your computer and use it in GitHub Desktop.
Save pentschev/7b348f8409ba35341a3f646093e61336 to your computer and use it in GitHub Desktop.
Benchmark Numba copy_to_host with NumPy pool
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import cupy\n",
"from numba import cuda\n",
"from functools import reduce\n",
"import operator"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.17.0'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a 1GB Numba device array"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"d_x = cuda.to_device(np.arange(128 * 1024**2, dtype='f8').reshape((1024 ** 2, 128)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a destination NumPy array with same device array properties (shape, dtype)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"120 ms ± 48.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"x = np.ones(d_x.shape, dtype=d_x.dtype)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"x = np.ones(d_x.shape, dtype=d_x.dtype)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Copy device array to a NumPy array with same properties"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"165 ms ± 4.22 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"d_x.copy_to_host(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Allocate NumPy host array and copy device array to it"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"283 ms ± 138 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"dst = np.ones(d_x.shape, dtype=d_x.dtype)\n",
"dst = d_x.copy_to_host(dst)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Copy device array to host (Numba handles all steps)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"241 ms ± 155 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"x = d_x.copy_to_host()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a 4GB 1D NumPy array to be used as pool"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"pool = np.ones(4*1024**3, dtype='u1') # 4GB pool"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Copy a 1D view of the device array to the pool"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"165 ms ± 35.9 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"%%timeit\n",
"d_x_view = d_x.reshape(reduce(operator.mul, d_x.shape))\n",
"pool_view = pool.view(dtype=d_x_view.dtype)[:d_x_view.shape[0]]\n",
"x = d_x_view.copy_to_host(pool_view)"
]
}
],
"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": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment