Skip to content

Instantly share code, notes, and snippets.

@FrancescAlted
Created April 17, 2014 18:20
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 FrancescAlted/11002751 to your computer and use it in GitHub Desktop.
Save FrancescAlted/11002751 to your computer and use it in GitHub Desktop.
Optimal blocksize
{
"metadata": {
"name": "",
"signature": "sha256:82e5b24036955db348e69e8d773df9940f1cc361f8dff79db3f0b5602fd6cf67"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from time import time\n",
" \n",
"N = 10*1000*1000\n",
"x = np.linspace(1, 10, N) "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def inplace(block_size=20000):\n",
" \"\"\"Blocked evaluation of polynomial.\"\"\"\n",
" y = np.empty(len(x))\n",
" for k in range(len(x) // block_size + 1):\n",
" b, e = k * block_size, (k+1) * block_size\n",
" y[b:e] = x[b:e]\n",
" y[b:e] *= .25\n",
" y[b:e] += .75\n",
" y[b:e] *= x[b:e]\n",
" y[b:e] -= 1.5\n",
" y[b:e] *= x[b:e]\n",
" y[b:e] -= 2\n",
" \n",
" return y\n",
" \n",
"def bench():\n",
" \"\"\"Illustrate CPU vs memory trade-off.\n",
" \n",
" Break up a computation in chunks and benchmark. Small blocks fit into\n",
" cache easily, but the NumPy overhead and the outer Python for-loop\n",
" takes long to execute. With large blocks, the overhead for NumPy and\n",
" the for-loop is negligible, but the blocks no longer fit into cache,\n",
" resulting in delays.\n",
" \n",
" Returns\n",
" -------\n",
" block_sizes : list\n",
" Size of the different data chunks.\n",
" times : list\n",
" Execution times.\n",
" \n",
" \"\"\"\n",
" times = []\n",
" blocks = np.round(np.logspace(3, 7, num=50))\n",
" for b in blocks:\n",
" t = time()\n",
" inplace(block_size=int(b))\n",
" times.append(time()-t)\n",
" #print 'Block size: %d Execution time: %.2f' % (b, times[-1])\n",
" \n",
" return blocks, times"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib.pyplot as plt\n",
" \n",
"blocks, times = bench()\n",
"plt.semilogx(blocks, times, 'o-')\n",
"plt.xlabel('Block size [b]')\n",
"plt.ylabel('Execution time [s]')\n",
"plt.title('CPU vs Memory Benchmark')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x322aed0>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment