{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Zastosowanie indeksowania wielowymiarowego\n", "\n", "\n", "Zadanie: Oblicz warto\u015bci funkcji $\\sin(x^2+y^2)$ na siatce w zadanym obszarze.\n", "\n", "### Krok pierwszy\n", "\n", "Napiszemy j\u0105dro obliczaj\u0105ce warto\u015bci funkcji $\\sin(x^2)$ na zadanym wektorze danych. Jest to zadanie, kt\u00f3re mo\u017cna by wykona\u0107 u\u017cywaj\u0105c `gpuarray`, ale dla cel\u00f3w dydaktycznych wykonamy je w\u0142asnym kernelem." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pycuda.driver as cuda\n", "import pycuda.autoinit\n", "from pycuda.compiler import SourceModule\n", "\n", "mod = SourceModule(\"\"\"\n", " __global__ void sin1d(float *x,float *y)\n", " {\n", " int idx = threadIdx.x + blockDim.x*blockIdx.x;\n", " y[idx] = sinf(powf(x[idx],2.0f));\n", " }\n", " \"\"\")\n", "\n", "Nx = 128\n", "x = np.linspace(-3,3,Nx).astype(np.float32)\n", "y = np.empty_like(x)\n", "func = mod.get_function(\"sin1d\")\n", "func(cuda.In(x),cuda.Out(y),block=(Nx,1,1),grid=(1,1,1))\n", "plot(x,y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok drugi\n", "\n", "Nie b\u0119dziemy teraz przesy\u0142a\u0107 warto\u015bci $x$ do j\u0105dra, ale obliczymy je w locie, ze wzoru:\n", "\n", "$$ x = x_0 + i \\frac{\\Delta x}{N}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pycuda.driver as cuda\n", "import pycuda.autoinit\n", "from pycuda.compiler import SourceModule\n", "\n", "mod = SourceModule(\"\"\"\n", " __global__ void sin1da(float *y)\n", " {\n", " int idx = threadIdx.x + blockDim.x*blockIdx.x;\n", " float x = -3.0f+6.0f*float(idx)/blockDim.x;\n", " y[idx] = sinf(powf(x,2.0f));\n", " }\n", " \"\"\")\n", "\n", "Nx = 128\n", "x = np.linspace(-3,3,Nx).astype(np.float32)\n", "y = np.empty_like(x)\n", "func = mod.get_function(\"sin1da\")\n", "func(cuda.Out(y),block=(Nx,1,1),grid=(1,1,1))\n", "plot(x,y,'r')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nuP8HGlw9djW4/t0AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok trzeci\n", "\n", "Wykonamy w\u0142a\u015bciwe zadanie korzystaj\u0105c z wywo\u0142ania j\u0105dra, kt\u00f3re zawiera $N_x$ w\u0105tk\u00f3w w bloku i $N_y$ blok\u00f3w. \n", "\n", "Prosz\u0119 zwr\u00f3ci\u0107 szczeg\u00f3ln\u0105 uwag\u0119 na linie:\n", "\n", " int idx = threadIdx.x;\n", " int idy = blockIdx.x;\n", " \n", "zawieraj\u0105ce wykorzystanie odpowiednich indeks\u00f3w na CUDA, oraz spos\u00f3b obliczania globalnego indeksu tablicy warto\u015bci, kt\u00f3ra jest w formacie \"row-major\"!\n", "\n", " int gid = idx + blockDim.x*idy;" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pycuda.driver as cuda\n", "import pycuda.autoinit\n", "from pycuda.compiler import SourceModule\n", "\n", "mod = SourceModule(\"\"\"\n", " __global__ void sin2d(float *z)\n", " {\n", " int idx = threadIdx.x;\n", " int idy = blockIdx.x;\n", "\n", " int gid = idx + blockDim.x*idy;\n", "\n", " float x = -4.0f+6.0f*float(idx)/blockDim.x;\n", " float y = -3.0f+6.0f*float(idy)/gridDim.x;\n", " \n", " z[gid] = sinf(powf(x,2.0f)+powf(y,2.0f));\n", " }\n", " \"\"\")\n", "\n", "Nx = 128\n", "Ny = 64\n", "x = np.linspace(-4,2,Nx).astype(np.float32)\n", "y = np.linspace(-3,3,Ny).astype(np.float32)\n", "XX,YY = np.meshgrid(x,y)\n", "z = np.zeros(Nx*Ny).astype(np.float32)\n", "\n", "func = mod.get_function(\"sin2d\")\n", "func(cuda.Out(z),block=(Nx,1,1),grid=(Ny,1,1))\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 89 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por\u00f3wnajmy wyniki:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "contourf(XX,YY,z.reshape(Ny,Nx) )" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nRK5CYII=\n", "text": [ "" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "contourf(XX,YY,np.sin(XX**2+YY**2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 93, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nzSO1Nqd6cwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 93 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok czwarty\n", "\n", "Algorytm ten nie jest korzystny, gdy\u017c rozmiar bloku determinuje rozmiar siatki na, kt\u00f3rej pr\u00f3bkujemy funkcje. \n", "\n", "Optymalnie by\u0142o by wykonywa\u0107 operacje w blokach o zadanym rozmiarze, niezale\u017cnie od ilo\u015bci pr\u00f3bek danego obszaru. \n", "\n", "Poni\u017cszy przyk\u0142ad wykorzystuje dwuwymiarow\u0105 struktur\u0119 zar\u00f3wno bloku jak i gridu. Dzielimy w\u0105tki tak by w obr\u0119bie jednego bloku by\u0142y wewnatrz kwadratu o bokach 4x4.\n", "\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pycuda.driver as cuda\n", "import pycuda.autoinit\n", "from pycuda.compiler import SourceModule\n", "\n", "mod = SourceModule(\"\"\"\n", " __global__ void sin2da(float *z)\n", " {\n", " int ix = threadIdx.x + blockIdx.x * blockDim.x;\n", " int iy = threadIdx.y + blockIdx.y * blockDim.y;\n", " \n", " int gid = ix + iy * blockDim.x * gridDim.x;\n", "\n", " float x = -4.0f+6.0f*float(ix)/(blockDim.x*gridDim.x);\n", " float y = -3.0f+6.0f*float(iy)/(blockDim.y*gridDim.y);\n", " \n", " z[gid] = sinf(powf(x,2.0f)+powf(y,2.0f));\n", " }\n", " \"\"\")\n", "\n", "block_size = 4\n", "Nx = 32*block_size\n", "Ny = 32*block_size\n", "x = np.linspace(-4,2,Nx).astype(np.float32)\n", "y = np.linspace(-3,3,Ny).astype(np.float32)\n", "XX,YY = np.meshgrid(x,y)\n", "z = np.zeros(Nx*Ny).astype(np.float32)\n", "\n", "func = mod.get_function(\"sin2da\")\n", "func(cuda.Out(z),\\\n", " block=(block_size,block_size,1),\\\n", " grid=(Nx/block_size,Ny/block_size,1) )\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 114 }, { "cell_type": "code", "collapsed": false, "input": [ "contourf(XX,YY,z.reshape(Ny,Nx) )" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 115, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nRx11FIsWLeKvf/1r4/sPdV2hzZs3M2fOHE477TTXRQWjOh6+r9x+++2sW9eTZdR7zIsvvjgyrcWc\nOXN49FEP458zVtm7dy+7du3irLOa72mwIvCm8eLr16/n5ptvZtu2gzcxDN3OneWErvHw69evZ/36\n9WzYsIEvf/nLtePhY0ZmvP/69es5/PDDufLKK31XzxjZ+xn6Qr73In1ee+01LrvsMr7//e9z1FFH\nNb7PisC3b99e+/zTTz/Nc889x7JlywB44YUXOOOMM3jssceSGrHStH9VrrzySi644ALHtbFP1/7d\neeed3H///TzwwAOeamQX2fPXF0488cSRzvR9+/YxZ86cgDXKqPDGG29w6aWX8vGPf5yLL7649b1O\nUyhLlizh5Zdfnnl88skn8/jjj3Pccce5LNYre/bsYf78+UA/x8Nv3bqVb3/72zz00EMcccQRoavj\nlBT/O6zjzDPPZM+ePezdu5f3vOc93HXXXWzcOOFz2ibCcDjkmmuuYfHixVx77bVSH/DGySef3LtR\nKJdeeulwyZIlw2XLlg0vueSS4csvvxy6SlY55ZRThu9973uHy5cvHy5fvnz4+c9/PnSVrHLPPfcM\n58yZMzziiCOGs2fPHn74wx8OXSUr3H///cMFCxYM582bN7zppptCV8cqV1xxxfDd73738PDDDx/O\nmTNnePvtt4eukjV+97vfDQeDwXDZsmUz19yWLVsa3+98QYdMJpPJuMHLMMJMJpPJ2CcLPJPJZBIl\nCzyTyWQSJQs8k8lkEiULPJPJZBIlCzyTyWQS5f8DFlCx78s9mvMAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 115 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }