diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4d4f7e52891a0cb8477672fbaf14b29c067de0f9..58fb78251d04afb0e7f613aae237799237a010b9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -117,6 +117,20 @@ Python 3.6 POCL Twice With Cache: # except: # - tags +Python 3.6 POCL Examples: + script: + - export PY_EXE=python3.6 + - export PYOPENCL_TEST=portable + - export EXTRA_INSTALL="numpy mako pyvisfile matplotlib jupyter nbconvert" + - ". ./build-py-project-and-run-examples.sh" + tags: + - python3.6 + - pocl + - large-node + - ispc + except: + - tags + CentOS binary: script: - (cd build-helpers; ./make-linux-build-docker.sh --nodate) diff --git a/build-py-project-and-run-examples.sh b/build-py-project-and-run-examples.sh new file mode 100644 index 0000000000000000000000000000000000000000..e51a86d2085364ca142f5bfde3380a9fade0de01 --- /dev/null +++ b/build-py-project-and-run-examples.sh @@ -0,0 +1,37 @@ +#! /bin/bash + +set -e + +curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-py-project.sh +source build-py-project.sh + +function run_examples() +{ + PATTERN=$1 + CMDLINE=$2 + for i in $(find examples -name "$PATTERN" -print ); do + echo "-----------------------------------------------------------------------" + echo "RUNNING $i" + echo "-----------------------------------------------------------------------" + dn=$(dirname "$i") + bn=$(basename "$i") + (cd $dn; echo $CMDLINE "$bn"; $CMDLINE "$bn") + done +} + +function run_py_examples() +{ + run_examples "*.py" ${PY_EXE} +} +function run_ipynb_examples() +{ + run_examples "*.ipynb" "${PY_EXE} -m nbconvert --execute" +} +function run_floopy_examples() +{ + run_examples "*.floopy" "${PY_EXE} -m loopy" +} + +run_py_examples +run_ipynb_examples +run_floopy_examples diff --git a/examples/fortran/foo.floopy b/examples/fortran/foo.floopy deleted file mode 100644 index 6b8741e1150a05226f3aa9de849db8abb1915002..0000000000000000000000000000000000000000 --- a/examples/fortran/foo.floopy +++ /dev/null @@ -1,30 +0,0 @@ -subroutine fill(out, a, n) - implicit none - - real_type a, out(n) - integer n, i - - do i = 1, n - out(i) = a - end do - do i = 1, n - out(i) = out(i) * factor - end do -end - -!$loopy begin -! -! SOURCE = lp.c_preprocess(SOURCE, [ -! "factor 4.0", -! "real_type real*8", -! ]) -! fill, = lp.parse_fortran(SOURCE, FILENAME) -! fill = lp.split_iname(fill, "i", 128, -! outer_tag="g.0", inner_tag="l.0") -! fill = lp.split_iname(fill, "i_1", 128, -! outer_tag="g.0", inner_tag="l.0") -! RESULT = [fill] -! -!$loopy end - -! vim:filetype=floopy diff --git a/examples/fortran/ipython-integration-demo.ipynb b/examples/fortran/ipython-integration-demo.ipynb index c2b34f1d13f7b4971c0c2e88a0ae5013ed12ee23..7a5c8257bf80fdfcc3d3b978a7dca2d401c48271 100644 --- a/examples/fortran/ipython-integration-demo.ipynb +++ b/examples/fortran/ipython-integration-demo.ipynb @@ -1,190 +1,142 @@ { - "metadata": { - "name": "", - "signature": "sha256:c9f8334aa7aa4a5ad1437fa5871aafa52bbc9131271d9e90e7be47d22725cc94" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Loopy IPython Integration Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext loopy.ipython_ext" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Without transform code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%fortran_kernel\n", + "\n", + "subroutine fill(out, a, n)\n", + " implicit none\n", + "\n", + " real*8 a, out(n)\n", + " integer n, i\n", + "\n", + " do i = 1, n\n", + " out(i) = a\n", + " end do\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(fill)" + ] + }, { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Loopy IPython Integration Demo" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load_ext loopy.ipython_ext" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Without transform code" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%fortran_kernel\n", - "\n", - "subroutine fill(out, a, n)\n", - " implicit none\n", - "\n", - " real*8 a, out(n)\n", - " integer n, i\n", - "\n", - " do i = 1, n\n", - " out(i) = a\n", - " end do\n", - "end" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print(fill)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "---------------------------------------------------------------------------\n", - "KERNEL: fill\n", - "---------------------------------------------------------------------------\n", - "ARGUMENTS:\n", - "a: ValueArg, type: float64\n", - "n: ValueArg, type: int32\n", - "out: GlobalArg, type: float64, shape: (n), dim_tags: (N0:stride:1)\n", - "---------------------------------------------------------------------------\n", - "DOMAINS:\n", - "[n] -> { [i] : i >= 0 and i <= -1 + n }\n", - "---------------------------------------------------------------------------\n", - "INAME IMPLEMENTATION TAGS:\n", - "i: None\n", - "---------------------------------------------------------------------------\n", - "INSTRUCTIONS:\n", - "[i] out[i] <- a # insn0\n", - "---------------------------------------------------------------------------\n" - ] - } - ], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## With transform code" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "split_amount = 128" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%transformed_fortran_kernel\n", - "\n", - "subroutine tr_fill(out, a, n)\n", - " implicit none\n", - "\n", - " real*8 a, out(n)\n", - " integer n, i\n", - "\n", - " do i = 1, n\n", - " out(i) = a\n", - " end do\n", - "end\n", - "\n", - "!$loopy begin\n", - "!\n", - "! tr_fill, = lp.parse_fortran(SOURCE)\n", - "! tr_fill = lp.split_iname(tr_fill, \"i\", split_amount,\n", - "! outer_tag=\"g.0\", inner_tag=\"l.0\")\n", - "! RESULT = [tr_fill]\n", - "!\n", - "!$loopy end" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "print(tr_fill)" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "---------------------------------------------------------------------------\n", - "KERNEL: tr_fill\n", - "---------------------------------------------------------------------------\n", - "ARGUMENTS:\n", - "a: ValueArg, type: float64\n", - "n: ValueArg, type: int32\n", - "out: GlobalArg, type: float64, shape: (n), dim_tags: (N0:stride:1)\n", - "---------------------------------------------------------------------------\n", - "DOMAINS:\n", - "[n] -> { [i_outer, i_inner] : i_inner >= -128i_outer and i_inner <= -1 + n - 128i_outer and i_inner >= 0 and i_inner <= 127 }\n", - "---------------------------------------------------------------------------\n", - "INAME IMPLEMENTATION TAGS:\n", - "i_inner: l.0\n", - "i_outer: g.0\n", - "---------------------------------------------------------------------------\n", - "INSTRUCTIONS:\n", - "[i_inner,i_outer] out[i_inner + i_outer*128] <- a # insn0\n", - "---------------------------------------------------------------------------\n" - ] - } - ], - "prompt_number": 6 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## With transform code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "split_amount = 128" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%transformed_fortran_kernel\n", + "\n", + "subroutine tr_fill(out, a, n)\n", + " implicit none\n", + "\n", + " real*8 a, out(n)\n", + " integer n, i\n", + "\n", + " do i = 1, n\n", + " out(i) = a\n", + " end do\n", + "end\n", + "\n", + "!$loopy begin\n", + "!\n", + "! tr_fill, = lp.parse_fortran(SOURCE)\n", + "! tr_fill = lp.split_iname(tr_fill, \"i\", split_amount,\n", + "! outer_tag=\"g.0\", inner_tag=\"l.0\")\n", + "! RESULT = [tr_fill]\n", + "!\n", + "!$loopy end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(tr_fill)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/examples/fortran/matmul.floopy b/examples/fortran/matmul.floopy index 3352449d7bfcc406e5349f36c5cb7ebb3e3613b6..8ee05643b926f722a3419378c52d254e43617708 100644 --- a/examples/fortran/matmul.floopy +++ b/examples/fortran/matmul.floopy @@ -1,6 +1,6 @@ subroutine dgemm(m,n,l,alpha,a,b,c) implicit none - real*8 temp, a(m,l),b(l,n),c(m,n), alpha + real*8 a(m,l),b(l,n),c(m,n), alpha integer m,n,k,i,j,l do j = 1,n diff --git a/examples/fortran/tagging.floopy b/examples/fortran/tagging.floopy index 40b487528cdd788f26fb4b600869e4bf81f090a8..87aacba68ae2fc6f3b7052325fcd2378e9880e47 100644 --- a/examples/fortran/tagging.floopy +++ b/examples/fortran/tagging.floopy @@ -1,7 +1,7 @@ subroutine fill(out, a, n) implicit none - real*8 a, out(n) + real_type a, out(n) integer n, i !$loopy begin tagged: init @@ -9,17 +9,28 @@ subroutine fill(out, a, n) out(i) = a end do !$loopy end tagged: init + +!$loopy begin tagged: mult do i = 1, n - out(i) = out(i) * 2 + out(i) = out(i) * factor end do +!$loopy end tagged: mult end !$loopy begin +! +! SOURCE = lp.c_preprocess(SOURCE, [ +! "factor 4.0", +! "real_type real*8", +! ]) ! fill, = lp.parse_fortran(SOURCE, FILENAME) +! fill = lp.add_barrier(fill, "tag:init", "tag:mult", "gb1") ! fill = lp.split_iname(fill, "i", 128, ! outer_tag="g.0", inner_tag="l.0") ! fill = lp.split_iname(fill, "i_1", 128, ! outer_tag="g.0", inner_tag="l.0") ! RESULT = [fill] +! !$loopy end + ! vim:filetype=floopy diff --git a/examples/fortran/volumeKernelSimple.floopy b/examples/fortran/volumeKernelSimple.floopy deleted file mode 100644 index afc3321b8fa18ff532b3c2898dbaea8f99e3700c..0000000000000000000000000000000000000000 --- a/examples/fortran/volumeKernelSimple.floopy +++ /dev/null @@ -1,38 +0,0 @@ -subroutine volumeKernel(elements, Nfields, Ngeo, Ndim, Dop, geo, Q, rhsQ ) - - implicit none - - integer elements, Nfields, Ngeo, Ndim - - real*4 Dop(Nq,Nq) - real*4 Q(Nq,Nq,Nq,Nfields,elements) - real*4 geo(Nq,Nq,Nq,Ngeo,elements) - real*4 rhsQ(Nq,Nq,Nq,Nfields,elements) - - integer e,i,j,k,d,n,cnt - - real*4 u,v,w,p, dFdr, dFds, dFdt, divF - real*4 F(Nq,Ndim) - - - do e=1,elements - do i=1,Nq - - F(i,1) = 5 - F(i,2) = 7 - - end do - - end do - -end subroutine volumeKernel - -!$loopy begin -! -! volumeKernel, = lp.parse_fortran(SOURCE, FILENAME) -! volumeKernel = lp.fix_parameters(volumeKernel, -! Nq=5, Ndim=3) -! volumeKernel = lp.tag_inames(volumeKernel, dict(i="l.0")) -! RESULT = [volumeKernel] -! -!$loopy end diff --git a/examples/python/find-centers.py b/examples/python/find-centers.py index c5e5e916156fd44b5a37cdb3cd41718916461a06..1822d3b7990d27f14d04e3b86a1d3c2d0b5c26ee 100644 --- a/examples/python/find-centers.py +++ b/examples/python/find-centers.py @@ -26,7 +26,7 @@ knl = lp.make_kernel( <> post_dist_sq = if(matches, dist_sq, HUGE) end - <> min_dist_sq, <> min_ictr = argmin(ictr, post_dist_sq) + <> min_dist_sq, <> min_ictr = argmin(ictr, ictr, post_dist_sq) tgt_to_qbx_center[itgt] = if(min_dist_sq < HUGE, min_ictr, -1) end diff --git a/examples/python/global_barrier_removal.py b/examples/python/global_barrier_removal.py index b71c561195647b7e35bc5538cfd1d601e270f3c2..7ab049cd1906f703b0efc39808ff68a63b91ff37 100644 --- a/examples/python/global_barrier_removal.py +++ b/examples/python/global_barrier_removal.py @@ -6,14 +6,17 @@ import pyopencl.array knl = lp.make_kernel( "{ [i,k]: 0<=i<n and 0<=k<3 }", """ - c[k,i] = a[k, i + 1] - out[k,i] = c[k,i] - """) + for i, k + ... gbarrier + c[k,i] = a[k, i + 1] + ... gbarrier + out[k,i] = c[k,i] + end + """, seq_dependencies=True) # transform knl = lp.split_iname(knl, "i", 128, outer_tag="g.0", inner_tag="l.0") -from loopy.kernel.tools import add_dtypes -knl = add_dtypes(knl, +knl = lp.add_and_infer_dtypes(knl, {"a": np.float32, "c": np.float32, "out": np.float32, "n": np.int32}) # schedule diff --git a/examples/python/hello-loopy-lp.py b/examples/python/hello-loopy.loopy similarity index 100% rename from examples/python/hello-loopy-lp.py rename to examples/python/hello-loopy.loopy diff --git a/examples/python/rank-one.py b/examples/python/rank-one.py index 726c44dea927c7dd9f7305fe59b12a27bc820269..b22edfcfa6da39ae9de9b2bb9bc496d2c56c36b5 100644 --- a/examples/python/rank-one.py +++ b/examples/python/rank-one.py @@ -6,15 +6,16 @@ import loopy as lp ctx = cl.create_some_context() queue = cl.CommandQueue(ctx) -knl = lp.make_kernel(queue.device, - "{[i,j]: 0<=i,j<n}", +knl = lp.make_kernel( + "{[i, j]: 0<=i<n and 0<=j<n}", "c[i, j] = a[i]*b[j]", assumptions="n >= 16") a = np.arange(200, dtype=np.float32) b = np.arange(200, dtype=np.float32) -evt, (c,) = knl(queue, a=a, b=b, options="write_cl") +knl = lp.set_options(knl, write_code=True) +evt, (c,) = knl(queue, a=a, b=b) # SETUPEND orig_knl = knl @@ -26,7 +27,8 @@ knl = lp.split_iname(knl, "j", 16, outer_tag="g.1", inner_tag="l.1") # SPLITEND -evt, (c,) = knl(queue, a=a, b=b, options="write_cl") +knl = lp.set_options(knl, write_code=True) +evt, (c,) = knl(queue, a=a, b=b) split_knl = knl @@ -35,7 +37,8 @@ knl = lp.add_prefetch(knl, "a") knl = lp.add_prefetch(knl, "b") # PREFETCH1END -evt, (c,) = knl(queue, a=a, b=b, options="write_cl") +knl = lp.set_options(knl, write_code=True) +evt, (c,) = knl(queue, a=a, b=b) knl = split_knl @@ -44,7 +47,8 @@ knl = lp.add_prefetch(knl, "a", ["i_inner"]) knl = lp.add_prefetch(knl, "b", ["j_inner"]) # PREFETCH2END -evt, (c,) = knl(queue, a=a, b=b, options="write_cl") +knl = lp.set_options(knl, write_code=True) +evt, (c,) = knl(queue, a=a, b=b) knl = orig_knl @@ -68,4 +72,5 @@ knl = lp.split_iname(knl, "a_dim_0", 16, outer_tag="l.1", inner_tag="l.0") # PREFETCH3END -evt, (c,) = knl(queue, a=a, b=b, options="write_cl") +knl = lp.set_options(knl, write_code=True) +evt, (c,) = knl(queue, a=a, b=b) diff --git a/examples/python/sparse.py b/examples/python/sparse.py index bb143d62bfa39c7ba4b569dd5c85782050e3d6ee..a13ba34ae7329ef6a7a72a968a5783f9496fa05e 100644 --- a/examples/python/sparse.py +++ b/examples/python/sparse.py @@ -5,10 +5,12 @@ k = lp.make_kernel([ "{ [i] : 0 <= i < m }", "{ [j] : 0 <= j < length }"], """ - <> rowstart = rowstarts[i] - <> rowend = rowstarts[i] - <> length = rowend - rowstart - y[i] = sum(j, values[rowstart+j] * x[colindices[rowstart + j]]) + for i + <> rowstart = rowstarts[i] + <> rowend = rowstarts[i] + <> length = rowend - rowstart + y[i] = sum(j, values[rowstart+j] * x[colindices[rowstart + j]]) + end """) k = lp.add_and_infer_dtypes(k, { diff --git a/loopy/ipython_ext.py b/loopy/ipython_ext.py index 12fd0354267e86707cc91de0027319e3584a08f0..ec1b10f1f512e18079f44b94b298e876776cae35 100644 --- a/loopy/ipython_ext.py +++ b/loopy/ipython_ext.py @@ -9,7 +9,7 @@ import loopy as lp class LoopyMagics(Magics): @cell_magic def fortran_kernel(self, line, cell): - result = lp.parse_fortran(cell.encode()) + result = lp.parse_fortran(cell) for knl in result: self.shell.user_ns[knl.name] = knl @@ -17,7 +17,7 @@ class LoopyMagics(Magics): @cell_magic def transformed_fortran_kernel(self, line, cell): result = lp.parse_transformed_fortran( - cell.encode(), + cell, transform_code_context=self.shell.user_ns) for knl in result: