diff --git a/.gitignore b/.gitignore index d87144f7b08fd5dfc9a080d26dc0f8a6ce30e500..e6e71f76dcd63c724222ebde183b518055c9f270 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ coverage_report/ # macOS **/.DS_Store +*.uuid diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f333e761d5568ba256c3d5c48a2c6dfd6f4660b5..f1ac3470f59d15a8ede4ad7a90b2601138376e66 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,7 +21,7 @@ tests-and-coverage: - mkdir -p ~/.config/matplotlib - echo "backend:template" > ~/.config/matplotlib/matplotlibrc - mkdir public - - py.test -v -n $NUM_CORES --cov-report html --cov-report term --cov=. -m "not longrun" --html test-report/index.html --junitxml=report.xml + - py.test -v -n $NUM_CORES --cov-report html --cov-report xml --cov-report term --cov=. -m "not longrun" --html test-report/index.html --junitxml=report.xml - python3 -m coverage xml tags: - docker @@ -84,21 +84,21 @@ latest-python: # Minimal tests in windows environment -minimal-windows: - stage: test - except: - variables: - - $ENABLE_NIGHTLY_BUILDS - tags: - - win - script: - - export NUM_CORES=$(nproc --all) - - source /cygdrive/c/Users/build/Miniconda3/Scripts/activate - - source activate pystencils - - pip install joblib - - pip list - - python -c "import numpy" - - py.test -v -m "not (notebook or longrun)" +#minimal-windows: +# stage: test +# except: +# variables: +# - $ENABLE_NIGHTLY_BUILDS +# tags: +# - win +# script: +# - export NUM_CORES=$(nproc --all) +# - source /cygdrive/c/Users/build/Miniconda3/Scripts/activate +# - source activate pystencils +# - pip install joblib +# - pip list +# - python -c "import numpy" +# - py.test -v -m "not (notebook or longrun)" ubuntu: stage: test @@ -143,7 +143,7 @@ ubuntu: - sed -i 's/--doctest-modules //g' pytest.ini - env - pip3 list - - pytest-3 -v -n $NUM_CORES --junitxml=report.xml pystencils_tests/test_*vec*.py pystencils_tests/test_random.py + - pytest-3 -v -n $NUM_CORES --junitxml=report.xml pystencils_tests/test_*vec*.py pystencils_tests/test_random.py pystencils_tests/test_half_precision.py tags: - docker - AVX @@ -156,7 +156,7 @@ arm64v8: extends: .multiarch_template image: i10git.cs.fau.de:5005/pycodegen/pycodegen/arm64 variables: - PYSTENCILS_SIMD: "neon" + QEMU_CPU: "cortex-a76" before_script: - *multiarch_before_script - sed -i s/march=native/march=armv8-a/g ~/.config/pystencils/config.json @@ -164,18 +164,15 @@ arm64v8: ppc64le: extends: .multiarch_template image: i10git.cs.fau.de:5005/pycodegen/pycodegen/ppc64le - variables: - PYSTENCILS_SIMD: "vsx" before_script: - *multiarch_before_script - sed -i s/mcpu=native/mcpu=power8/g ~/.config/pystencils/config.json arm64v9: # SVE support is still unreliable in GCC 11 (incorrect code for fixed-width vectors, internal compiler errors). + # For half precision Clang is necessary extends: .multiarch_template image: i10git.cs.fau.de:5005/pycodegen/pycodegen/arm64 - variables: - PYSTENCILS_SIMD: "sve128,sve256,sve512,sve" before_script: - *multiarch_before_script - sed -i s/march=native/march=armv8-a+sve/g ~/.config/pystencils/config.json @@ -187,6 +184,7 @@ riscv64: extends: .multiarch_template image: i10git.cs.fau.de:5005/pycodegen/pycodegen/riscv64 variables: + # explicitly set SIMD as detection does not appear to work on QEMU PYSTENCILS_SIMD: "rvv" QEMU_CPU: "rv64,v=true" before_script: diff --git a/README.md b/README.md index 5ab85add40e41c78615ee91e2da5c54f08c8d4af..a46fc85be936a488ebc616e6d0984834144e9fbb 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ pip install pystencils[interactive] Without `[interactive]` you get a minimal version with very little dependencies. All options: -- `gpu`: use this if an NVIDIA GPU is available and CUDA is installed +- `gpu`: use this if an NVIDIA or AMD GPU is available and CUDA or ROCm is installed - `alltrafos`: pulls in additional dependencies for loop simplification e.g. libisl - `bench_db`: functionality to store benchmark result in object databases - `interactive`: installs dependencies to work in Jupyter including image I/O, plotting etc. @@ -63,7 +63,7 @@ Options can be combined e.g. pip install pystencils[interactive, gpu, doc] ``` -pystencils is also fully compatible with Windows machines. If working with visual studio and pycuda makes sure to run example files first to ensure that pycuda can find the compiler's executable. +pystencils is also fully compatible with Windows machines. If working with visual studio and cupy makes sure to run example files first to ensure that cupy can find the compiler's executable. Documentation ------------- diff --git a/binder/environment.yml b/binder/environment.yml index 5a58aeafe4d3af7f4fd3e3c35109e92f4671011a..950158a30fdc594f79e7c34d7b55a0b86306a011 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -7,7 +7,7 @@ # conda env create -f conda_environment_user.yml # . activate pystencils # -# If you have CUDA installed and want to use your GPU, uncomment the last line to install pycuda +# If you have CUDA or ROCm installed and want to use your GPU, uncomment the last line to install cupy # # ---------------------------------------------------------------------------------------------------------------------- @@ -32,4 +32,4 @@ dependencies: - ipy_table # HTML tables for jupyter notebooks - pyevtk # VTK output for serial simulations - blitzdb # file-based No-SQL database to store simulation results - #- pycuda # add this if you have CUDA installed + #- cupy # add this if you have CUDA or ROCm installed diff --git a/conftest.py b/conftest.py index 3c140f19efdea93fcd5f6b94c7f706b7a1c77ef2..040ddf59505d29d1235a91279006ad34e6bcb8db 100644 --- a/conftest.py +++ b/conftest.py @@ -46,10 +46,10 @@ add_path_to_ignore('_local_tmp') try: - import pycuda + import cupy except ImportError: - collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils_tests/test_cudagpu.py")] - add_path_to_ignore('pystencils/gpucuda') + collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils_tests/test_gpu.py")] + add_path_to_ignore('pystencils/gpu') try: import waLBerla @@ -65,6 +65,7 @@ try: except ImportError: add_path_to_ignore('pystencils/runhelper') collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils_tests/test_parameterstudy.py")] + collect_ignore += [os.path.join(SCRIPT_FOLDER, "pystencils_tests/test_json_serializer.py")] try: import islpy diff --git a/doc/conf.py b/doc/conf.py old mode 100644 new mode 100755 index c230cc945b3e58403af84146081aea79e83ca6c7..c493f806640eba010d1afee128b9bcd3ee5add3e --- a/doc/conf.py +++ b/doc/conf.py @@ -33,7 +33,7 @@ version = re.sub(r'(\d+\.\d+)\.\d+(.*)', r'\1\2', pystencils.__version__) version = re.sub(r'(\.dev\d+).*?$', r'\1', version) # The full version, including alpha/beta/rc tags. release = pystencils.__version__ -language = None +language = 'en' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '**.ipynb_checkpoints'] default_role = 'any' pygments_style = 'sphinx' diff --git a/doc/notebooks/01_tutorial_getting_started.ipynb b/doc/notebooks/01_tutorial_getting_started.ipynb index bceef66c5679fd502dc94337e2794b6b1ef2b20b..b326e17df7059bf16776920d056b74a078643fb4 100644 --- a/doc/notebooks/01_tutorial_getting_started.ipynb +++ b/doc/notebooks/01_tutorial_getting_started.ipynb @@ -70,7 +70,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "4.92 ms ± 124 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + "4.78 ms ± 9.53 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -120,7 +120,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "<Figure size 300x300 with 1 Axes>" ] @@ -179,7 +179,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1.01 ms ± 24.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" + "987 µs ± 5.12 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" ] } ], @@ -260,7 +260,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle x^{2} \\left(x + y + 5\\right) + x^{2}$" ], @@ -293,7 +293,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI0AAAAXCAYAAAA2o8yAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAABJ0AAASdAHeZh94AAAFBklEQVR4nO2aa4hVVRTHf44WTRmFREhkDyrsg5qVpkmKPSYrCUUrSLImNDKUNDNzylr9yVJTa7AwJCKtvpQivSYzNEJMC6V8ZGVYDRRYJo6iaC+dPqx983rmzuPM3feRzB+Gzex99tr/tc66e6299unU2NhIBzqQBl3ymSxpInA/cEHo2g7MMrO6PHkVFJJqgFFAT+BP4HOgxsy+LimxMkFr9qnIU/4vwAzgSqAf8AnwjqQ+ecotNIYCi4BBwHXAP8BqSd1KSaqMMJQW7NMpdniStBf3ysVRBRcQkroC+4GRZvZ+qfmUG5L2ySs8JQR3Bu4AugLrY8ktEk7Hd929pSbSVkgaDEzBd4NuOPdtQK2ZfRh5uePsk7fTSOoNbABOAQ7g3rgtX7lFRi2wGY/dZQ9JM4GngT3AB8Au4Czgcjy0xHaaWrLsE2On2QH0Bc4ERgOvSxqaNqmUVA28BlxrZp9G4NXWdecBQ4DBZnakSGtW005dJd2OO8xqYJSZHUiMnxSJZkZeE/t0STzwMVAFjDazFVn9nXAl7wHmmtmMzJiZ/QXsDP9uktQf3zbHxyTfGtrDXdIC4C785e1MiETSw8B8YJqZLcgx3hPYCnxhZkMiq9QEkiqAucAhYEzSYQDM7O8c81LbJozntE/y9PQIcBSYFXKUDOYHwa8kBedABR6qio1U3CUt5JhBvmlG5rrQDmxm/EWgMzApH+IpMAi4EA8/DZKGS3pU0mRJV7cwL/V7bck+x+00ZrZF0htB0FhgiaTHgKnA28CEhOA5QB3wM54sjcFj6vDW9Y+LNNwlLcINMhLYK6l7GDpoZgezxH4JHAYGJNcLYaIKWGhmW+NrlBP9Q/tb4NY7wWktcJuZ/Z7d34732qJ9ctVpZgJ/AE9JmgQ8A6wCxprZ0cSz3YE38bxmTVDqZjNb2SYTxEdbuT+AO/kaPInM/E3LFha2+o1AD0nnZPolnQY8D+wGniyYNk1xdmgnAJXADbgevXA9hwDLmpmb5r22aJ+cdRpJs/GiHfjxucrMDqVWsRlIqgfOTzFlqZlVt1F2VO6SngVqyMoHJM0FpgP3mtmSVubXE0lXSc9xLNRcYWZbssYqge+Bc4FBZrYhx/wotmnu9JS9vY2L6TABtfhpKxt9gRHAUqA+MbY5hezY3D8L7QBghaRLgYfwMsPSNsyvJZ6uDaH9MdthAMzssKRVwDjgqsAviSi2aeI0ku7EE6Rf8fAzGd+uosHManOsW40bckl7j9wF4r4eaORYMvwSnvxONLNWy+mRdd0R2n3NjGecqjLHmtFsc1xOI+kW3Pu3A32A74Dx4ddV1igUdzNrAL4F+kkaA1wPLDazr/Kk3B6sxe+BLpF0co7xXqGtz+6MbZv/nEbSNcBy/BLyxpCBP4HvRnPaI7xYKAL3dcCpwGK8CjszgszUMLM9wFvAGSQScElVwDD8juijrP7otqkIgi/Dy9H78eRoVyC5HNgEjAh3HWWHInHP5DVd8cvYUt5RTcWLqY9LWitpvqRlwErgCHCfme2DwtmmQtLF+NGrERhmZj8knqkJ7by0wguNInL/KbQbgVfzlJUXzGw3npS/APQAHsQ/X6jDS/3LoLC2if5pxIkISe/hBcuBZrax1HxKjXw/wjrhEZLfW4GXOxzGEe17mhMJks7Dr0QuAu7GTx3TS0qqjNDhNLlxEzAbr4e8C0wpQIHzf4uOnKYDqfEvcwBygSAVIEgAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI0AAAAXCAYAAAA2o8yAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAFB0lEQVR4nO2ae4hVVRTGfzMaVho9oDAoCyqUKBky85HKpExWEloplGBNaEYpWOKj6fXx0cPMNC0rJohG6q+yoTQrRSOitLDS1Cihx1SC0UsFsadOf+xz5c6ZM3Pn3nvuvZPMB8Nm9j577W+ts+7aa699qlpbW+lBD/JB72Im254F3A6cG3V9ATwsaV2RvEoK2w3A9cBA4C/gI6BB0q6KEusmyGWf6iLl7wEWApcAlwLvAq/bHlyk3FKjFngWGAmMBf4FNto+rZKkuhFq6cQ+VWlvT7Z/J3hlY6qCSwjb/YADwCRJayvNp7shbp+itqeY4F7AFKAfsDktuWXCSYSou6/SRLoK2+OA2cAI4FTgN2AnsELSWykv18Y+RTuN7YuBLcDxwEHgOkk7i5VbZqwAthP06Paw/Tgwn5AerAF+BU4HhhC2lrSdpo190og0u4Ea4GRgMrDKdm2+SaXteuBF4ApJ76XAq6vrLgNGAaMkHS7TmvUUqKvt2wgOswqYKenv2PhxKdHMyGtnn96xBzYAdcBkSa9l9VcRlLwFWCzpnsxYRPrr6N9PbQ8F7gamp0k+FwrhbvtJ4EbCy/s2QeZcYCkwT9LShPGBwA7gY0ljUlapHWz3AR4BfiDBYQAk/ZMwL2/bROOJ9omfnuYDR4CHohwlgyciwc/HBSegGuiT45lSIC/utlcANwFjJX3VgcwPo3Z4B+NPA70IuUU5UEfYhpqBI7Yn2F5oe47tEZ3My/u9dmafNpFG0ue2X4oETQOabN8LzAVeAe6ICX4MWAf8SEiWphL21Am59U8X+XC3/Uz0zCRgn+3+0dBBSQezxH4G/AEMi69newrhJT4laUf6GiViaNT+CWwDLopxep8QTX7J7i/gvXZqn6Q6zQMRKdmeTQiH64Fpko7Enu0PvEzIazZFSl0t6e0umSB9dJX7nQQn3wTszfqbly0sCvVbgbNtn5npt90XWAb8DDxYMm3a44yonQ+0AqMJegwGNgBjgFc7mJvPe+3UPol1GtuLgEy42gzUSTqUt4odwHYLcE4eU1ZJqu+i7FS5234UaABukNQc9S0GFgC3SmrKMb+FlHS13QjMJFRpB0lqyRo7kfDjPQsYKandSTAt23R0esoOb9PTdJgIy4FTYn01wETCqaAlNrY9D9lpc8/kNcOAZtuDCIn+FgLXXFhOerruj9pt2Q4DIOmQ7fWEA8hlJJcPUrFNO6exPZWQIP1E2H7mENvzioWk5Qnr1hMM2VTokbtE3DcTtoJMMrySkPzOkpSznJ6yrrujdn8H45ni5AkJa6ZmmzY5je1rgCZgF2Gf3A3MiI6W3Rql4i5pH/AlMCQy/DigUdK24hgXhE0EB77QdlI+mkmMv8vuTNs2Rxe2PQpYTagyjo8y8PsJ0WhxIcLLhTJw/wDoCzQSqq/3pSAzb0j6HlgLDCBEiqOwfSUwnhCF3snqT9021ZHgGuBNwqVUnaS9EcnVwCfARNujC1mg1CgT90xe049wGVvJO6pZhBLHMtsbbS+xvZpwdXAYmCHpAJTONtW2zyd4ZivBE7+JPdMQtUvyFV5qlJF7JtxvBV4oUlZRkLSHcMe0EriAEHFqCRHo8kzFt5S2Sf3TiGMRttcQCpbDJW2tNJ9Ko9iPsI55RMnvtcBzPQ4TkNr3NMcSbA8gXImcB9xM+Ix1QUVJdSP0OE0yrgIWEU4ibwB3laDA+b9FT07Tg7zxH/RCc51argrkAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle x^{3} + x^{2} y + 6 x^{2}$" ], @@ -318,7 +318,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAXCAYAAAAr8TBeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAABJ0AAASdAHeZh94AAAFN0lEQVR4nO2ae7CWUxTGf+cUI9VEbg2K3GKmwRCV0aF0ZDSm3P7QiBDDiJJQLj09htRUOhNqQqP4R1SDErlMVIrJJZEwUUMjYrq45ZLyx95fHe95v3Pqu51M55n5Zn2z19rver693r322nt/Zdu3b6cBewca59PZ9jDgEqAd8CfwLjBM0qcF4NaAAqM8z/7nAhOBs4BuwFbgDdst83xuA4qAskKmcdvNgM1Ab0mzU/RPAxcAbSX9VjDHDagB26cD7wP9JU2BPNN4CpoTssWGFOcdgCuBIQ2Bzh22uwCDCNm0JWGsPwGqJM3N2En6wPYLwAO2p0v6Nd80nkQVsIywdicxEvgZmFRgn3sNbN8LLAAqgFeBccBs4EDCkprEQ0Ar4FYoYBq3PYYwc7tIWpXQnQB8Djwp6YaCOKybTz/gKaCrpLdK4bM25MvH9uXAc8AbwCWSfkno95H0d0q/lcD+wDGNE4rXgErgUkmzqrWXRaJXA6MlDU30G0cIdNdkoCOuBcqA6Vl+SE5+iwHbtwNjCcvNuBR9O2A58J6kimLziT7LgdHA70CfZKAB0gId8SwwAuieTON3ANsIeb5RtfaxhAF/IiXQE9gZ6M+yOOwO/EN6es/JbxGxKMpOWfSPAI2AAaWhA4T1uS0wF9hou6ftu2wPtN25jr7vRFn5n2BL+hh4BjgJ6Atg+25gMCGF3Fjd3vZEoB9wBbDBdqv4aVbNpilwKrAyW2G2u36LjA+BLUDHpCKm0krgMUnLS8jpjCh/IPCbA4wi1EiLbb9t+5AsfZdGWZFWoN0L/AGMsD0AeBCYB/SVtC1hexOhAn8TWFftM6SazRGEmbCujh+0O36LhpgOlwKtbR+eaY8v7cPAemB4qfhEHBrljUATQqZsDrQnjFEF8HxaR0mbCePapsbWS9Ja21XAUELKWkwoCP5KsS3bBaIHRbmxNqPd8ZuE7TXAUVnU820n26ZJ6lfLI98hDGAnIFNDDAeOBK6JA1hKPpmlrQy4LGZCgBW2Lwa+BM6x3VnSkpT+G4DDsu2zf6z2/TpJv9dCpC5siXK/XbDN1W8VcECi7VSgFzANWJPQLavjeZl1riMwy/aJwG3Akvi8UvPJTJSvqwUaAElbbM8DrgPOjByTaAJsqRFs21cQCqPvCXu0gYR0nSvWR3lQbUb5+JVUlfK8foTBnZrDVmcxsJ2dRdqjhNl1s6Q696pF4PNFlJuy6DMvQ5MUv+WEF291eUJxIeHNWwGcTNgb949vdq5YR5ix7bIZFMlvzpC0EVgJdLDdBzgPmCzpo/rgQzhI2Qocb3vfFH37KNek6NoR0v+yHcG2fTYwA1gLnC/pR+A+wpHqqFxZxpmwADjY9nFJfbH8FgCLCIcRk4GfCAVkvUDST4QzihYkikPblUAPwp3EqyndM9lpfnnscAqhnN8MVEpaF53MIBym94pnsrliZpQ9EkSL7TcfZNbtZoRr2xrn/SXGYGAVcI/tBbbH2n4eeIVwhnG9pE0p/c6P+hfL42ybR1ijekj6KmE8LMoxeRCdSdgjXpVpKJHffLA6yqXAlHrisAOS1hMKxvFAa8J5dzfgZcIRdY2tl+0WQG9gjqRvC3rFWRviHx1GAqfV49q3y7D9EtAT6CRpaV32eyJs3wJMACokLSz0rVdtGA98A9xfQp85IRZlFwGT/seBbkLIjjMlLYTC32dnhaQ/bPcFutpuuqfdadtuA/QBjiUsNyuAO+uVVH44GngcmJppKFka39Nh+wZC5b0JeB0YJOm7eiVVYDQEey/CvxiiNb+5640IAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAXCAYAAAAr8TBeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAFMklEQVR4nO2afazWYxjHP+eUkTIviQxhXsLMmqQOlV6czmiUxkZblF42imhFefv6Mi9Jb0irZTrzT6hGpVWysAo7KJVVf1DUHCtURoV0/HH/nvb4nd9zTj1vJ+t8t2fX89zXfd/X9buv33293PdTUlNTQyOODTTNZbDtcUA/oC3wJ/AZME7Shjzo1og8ozTH8d2A14BrgR7AAWC57dNynLcRBUBJPt247RbAHqCvpIUJ/ErgRuACSX/kTXAjasF2e+ALYKikWZCjG0/ASQRvsStBeAdgADC60dDZw3ZPYARQBpwK/AKsB6ZKWpzqJ+lL2+8Cz9ieI+n3XN14HFOBtcCnCbxngd+A6XmWeczA9ovAcuBqYAEwEXgfaEUIqXE8D7QGHoA8unHbk4A7gM6SvovxLgE2AbMkDcuLwPr1GQi8AXSX9FExZNaFXPWxPRSYCVQCwyT9FeMfJ+nvhHEbgROBC5rGGMuAcuA2SfPS2ksiRe8GxksaGxs3mWDo7nFDR7gHKAHeyvAgWcktBGyPIuyY0ZImJvDbAuuAzyV1LbQ+kczjCZ7xBxIMDZBk6AhzgKeA8rgbHwMcJPj5JmntLxEWfGaCoacCdwI9JG3KIPAG4B9CaZaEI5ZbQKyKaKcM/FeAJoS4WSyUE1z1fOCg7d62H7E90nZZPWNTz/NfY0v6GngTuIyQTGH7UWAU8DZwb3p/29OAQUB/YJft1tGnRVqf5kA7YGOmxOxI5RYYXwH7gI5xhu3bCQs/TdK6IurUIaL7gTXAIuAFYAqw2vbHtltlGFsV0a5JCdoT0aSyPYLgPpYCAyQdjPW9j5CBfwhUp31Gp/U5m7ATqut5oCORWzBE7rAKONf2Wan26KWdBOwAniyWPhHOiOgYoAboQlj3K4FlQFfgnaSBkvYQ1rVNrdJL0jbbU4CxBJe1GuiXIU6UHIaiLSNaqxzLVm4ctrcC52Vgr7Adb6uUNLCOKVcRFrCM4DohGPgcYFC0gMXUJ7UpDwC3SNoa/V5v+1ZgM3C97TJJSZXQr8CZmersnWnfB0vaW4ci9WFfRE84jL7Zyp0CnBJrawf0IWSvW2O8tfXMl4pzHYH5ti8FHiKUlJUNoM/uiK5JMzQAkvbaXgoMBq4huextBuyrZWzb/QmJ0U+EGm0kucXMHRFtWVenXORKmpIw30DC4s7OotRZTXCXqSTtVUIoGi6p3lq1APpsjujuDPyU12yWILeU8OJtKY0xbgJmAxsI8WAzMCQqN7JFNWHHZpyjQHKzhqRdwEagffQS9gRmSFrTEPoQcqIa4PLIeHFcEdEtCby2hLJ37aGBtjsDc4HtQIWkncDjhCPV8dlqGe2ET4DTbV8U5xdKbh6wEmgOzAB+Bh5rKEUkfQ8sBNoQPN4h2O4FVBB2/ZKE4SnvtKI0GtCOkM7vAcolVUdC5hIO0/vY7pKDvqmDkoqYooWWmwtScbsF4dq2zgSzCBgObAMm2V5ue4LtucBiwhnGkAyJY6+I/15ptNuWENxEhaRvY53HRXRCDorOI8Tuu1INRZKbC1IusQp4vYF0OARJ24H2hPzhYsIO70bY8delnzymYPtkoC+wSNK2vF5x1oXojw7PAVc1YOw7bNheAPQGOkmqqq//0Qjb9wMvA10krcz3rVddmEw42326iDKzQpSU3QxM/x8buhnBO86TtBLyf5+dEZL22x4AdLfd/Gi707bdhnDseyEh3HwDPNygSuWG8wm3ZLNTDUVz40c7bA8jZN67gQ+AByX92KBK5RmNxj6G8C8PHDfc7bZAEwAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle x^{2} \\left(x + y + 6\\right)$" ], @@ -343,7 +343,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle x^{2} \\left(x + \\cos{\\left(x \\right)} + 5\\right) + x^{2}$" ], @@ -375,7 +375,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle x^{2} \\left(x + y + 5\\right) + x^{2} = 1$" ], @@ -401,7 +401,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAfCAYAAADHorIzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAABJ0AAASdAHeZh94AAAEpUlEQVR4nO2ba4hVVRiGnzEtukFYSf0QLSxIDK2syPKSNRn2Q7vYXRIssIgUSTCbentLUdFohn72ozErKEWpxrwgXSwmLEkthBK1qSRLB0cJLFKbfqx14ng4c9wzc86eo7Mf2Kx91trrm5f97bXXt9a3p6a9vZ2M3kHf/B+2zwfG5lVtlnQgXUkZALbHAHOA64BLgSmSVibodzkwNPdbUlPuvE/BtYOAFWVRm9FdzgW2A093sf8A4KP8ir5FLjqe/zRk9AyS1gJrAWx3pt8eYI/twYVthSM74zSm2MjuVdgeDcwCRgH9gYPA90C9pI97UFrZ6dXOtl0HvAK0Ak3APuAi4BpgHJA5+3TA9hSCozcC90j6s6C9XxftTgPeBG6V9Fk3ZZaV1JxtewNQC9wraVVefQ3h5jwGLJY0NwUtfYDFwBHg4UJHA0g6WmkdaZPmyJ4DfAvMt/2BpOOxfinB0W+k4ejIKOAyYCXQZvsuYBjwN/C1pK9S0tEhts8DhuRVDbY9Ajgo6Zeu2EwtGpe0HVgOXAVMBbA9D5gNvA/MSEsLcH0s/yA8gE3AIqAeaLb9ue2LU9RTjJHA1ngALInnL3fVYNpzdh3wAPBSfHIXAOuBqZL+TVHHgFjOAH4Cbgc2EzaVXgUmEDaXxqWo6QTifF9TTpuJnG27hXAjkvKOpEcLKyXttV0PzAVeB5oJwdE/aWmInBHLGuC++NYB2GH7bmAnMNb2TaVe6SfR9GmRzZBlkqYlEV8Jko7s3YT5LCm/lWjL32ufLulID2hoi+WePEcDIOkv2+uB6cANQKn5ux64oKBuBDAJWAa0FLRtK2Gr4iRytqTbyvHHbD9ECMh+By4BZgJPpqkh8mMsD3XQnnsYzi5lRFJ9YV1cek0CGnvz0msi4WnfAYwHNgGP226Q9ENaOiKbgGPAFbbPLDKNDItlS1qCbHc71yyp5ByfirNt30JY5uwF7pB0wPYLhCBoETA5DR05JLXafg94BHiREDjmtNYSArTDwLoUNZ00GLM9kLCiGQAcBZy/Z3EyKr70sj2csLQ5DNRK2gcQc7NbgElxfzptZgO7gOdtb7K91PYKQqbpOPCEpEM9oKsUx4CZkoYSNqgabJ+TtHNFnW17CGFp1Q5MkLS74JLnYrmkkjqKIWk/cCPwGjAQeIYwvawBRkuqury+pH25gDLqbyPs5Seioq9xSbsIgVhH7Rsp81qyM0g6SBjhs8tosxFoLJe9jrA9EugH/Jq0T5bPPgWxfSHwFmHpmjiwy5x9imH7LGA1sFBSc2f69toUZzUS065vA1dK+jnWNQATCcmbVsIU8Ymk5Z21n43s6mIl4SuZOgDbzwIPAnfGr3xvJuQWJtveFo+rkxrPRnYVIak9ZgLX2N4NzAPG51Yxkr6kGwM0G9lVhqQNwDfAfOB+SVvKZTtzdpVhezwwnOCb/eW0nTm7ioi7jauAp4APCfn+slFszu5ne1Y8X52LCjMqi+1BhK9Zl0haZnsrsM32aElfdMLOtcAYwmfRJ1A4sncSXiHr4tHaVfEZybHdn3C/myQtAJD0HSE6X9hJcy3R1ruET8D+pyb7L87ew39WYqU0g6OV0QAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAfCAYAAADHorIzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAElUlEQVR4nO2bbYhUVRjHfyuFSH4owaggLbBAERS0YH2prWU1erMXI4oWLTWIiiJcMDH+/C1Js2Kl+tKHWhO/pJKkmUovirFCZrupSBJLppKKvegX20qdPpyzMQw768x65+7o3B8M595z7nnuwzzzPOc855ypy+VyZNQGl+Xf2L4W2ADsBnLAakk7BkKxWsf2bcB8YAJwHfCkpLYS+tUDs+LtROBhSb9AgbGBwVH4FEndCemd0T+GAvuAj+KnJCTtBHYC2M4BQ3raCo2dUSVI2gRsArDdloTMQUkIybg4yDwbsN0IPAfUA1cBvwN7gRXRwy4Jat7Ytt8AWoAjwKfAb8BwwtylgRhKLwVq2ti25xEMvRJ4WtI/Be2X90PmbOBD4A5J2xJQMzFSM7btrUATMFPSurz6OsKXMwtYJmlBSvoMBpYAh+jF0ACS/k1Dl7RI07NbgO+BV22vl3Q21r9JMPT7aRk60kQI163AOdv3AGOBbuDbmMIMGLaHAqPi7SBghO3xwB+SDvVHZmqzcUk/AKuA0UAzgO2FwEvAx8AzaekSuSWW3UAHsBFYSjB+u+3ttoenrFM+E6NeHYRc2fF6cX8Fpj1mvwI8Cij+cpcAW4BmSedS1uXqWLYA+4GpQCdwIyHaTAPWECZpqRPH+7okZZZkbNsHgZFlyF0t6YnCSkmHbbcCC4B3gHbgod7Gy0rpkEdPVDsD3C/pYLzfa/tB4ABwu+36YiH9PDp9bbuwbqWk2SXoXhFK9ewuQrgrlV/7aDuRdz1H0ukB0AHgZCw78gwNgKTTtrcAc4BbicuPvdAKXFlQNx6YQZjhHyxo6zyPThWlJGNLakziZbYfJ4TIY8A1wAuUOFYnpUMeB2J5skj7n7EcUqQdSa2FdTH1mgG0lZN6xXXsC0JSn2E/zdTrbqCNsLjfCOwA5tpulXSgr74V4kvCzt4Y24N6mTOMjeXPaShzPkMlQSqzcdtTgLWEVarpkk4Aiwg/tmVp6FBI3PbbAIwgRJj/sT0NmE7w+s2pK1cE29fb3mZ7v+09th8pp3/FjR1zw43AKaBJ0lEASWuB74AZtqdWWo8iPAscBt62/YXt5bbXEpZIzwJzJZ0aIN164wzwoqQxhGyh1fYVpXauqLFtjyJ4Ro7g0V0Fj7wcy+WV1KMYko4Q1sDfBW4ieHgDweMn56/0VQOSjkrqjNfHCOv4w0rtX5d/LMn2DYQxakh2eKG6sT2BkMqN7eOZHDBa0o9Q4xshFyu2hxFOr8wrp19m7CrC9kxgNXBzz7kx2yuAe4FJko7HDZz1wFJJ7eXIz06qVBfrCIcmFgHYng88BtwVDV1HSF+/krSqXOGZZ1cRknJxc+gz213AQqBR0k/xkcmEvYU9th+Idc2S9pYiPzN2lSFpq+1dwGvAfZJ25bV9wwVE4yyMVxm27wTGEXa8jicpOzN2FWF7HPAJ8DxhEvZ6kvIzY1cJtkcCnwNvSfoAENBkuyGpdxSO2X8T/vrzXkzIV0nantTLMnon5s2bgQ2SFgNI2md7DcG768uQNQl4Kt7uBv7qaavL/thXO2RhvIb4DyfqqX/syaykAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left[ - x - 6 + \\frac{1}{x^{2}}\\right]$" ], @@ -435,7 +435,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle x^{2} \\left(x + y + 5\\right) + x^{2}$" ], @@ -459,11 +459,167 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "graphviz is not installed. Visualizing the AST is not available\n" - ] + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"425pt\" height=\"260pt\"\n", + " viewBox=\"0.00 0.00 425.00 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-256 421,-256 421,4 -4,4\"/>\n", + "<!-- Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_() -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_()</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"136\" cy=\"-234\" rx=\"28.7\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"136\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">Add</text>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(0,) -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(0,)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"98\" cy=\"-162\" rx=\"29.8\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"98\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">Pow</text>\n", + "</g>\n", + "<!-- Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_()->Pow(Symbol('x'), Integer(2))_(0,) -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_()->Pow(Symbol('x'), Integer(2))_(0,)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M127.19,-216.76C122.65,-208.4 117.01,-198.02 111.9,-188.61\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"114.88,-186.75 107.03,-179.63 108.72,-190.09 114.88,-186.75\"/>\n", + "</g>\n", + "<!-- Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,) -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"174\" cy=\"-162\" rx=\"28.7\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"174\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">Mul</text>\n", + "</g>\n", + "<!-- Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_()->Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,) -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>Add(Pow(Symbol('x'), Integer(2)), Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y'))))_()->Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M144.81,-216.76C149.42,-208.28 155.16,-197.71 160.32,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"163.54,-189.61 165.23,-179.15 157.39,-186.27 163.54,-189.61\"/>\n", + "</g>\n", + "<!-- Symbol('x')_(0, 0) -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>Symbol('x')_(0, 0)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">x</text>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(0,)->Symbol('x')_(0, 0) -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(0,)->Symbol('x')_(0, 0)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M82.94,-146.15C73.02,-136.37 59.87,-123.4 48.81,-112.5\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.13,-109.87 41.55,-105.35 46.21,-114.86 51.13,-109.87\"/>\n", + "</g>\n", + "<!-- Integer(2)_(0, 1) -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>Integer(2)_(0, 1)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(0,)->Integer(2)_(0, 1) -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(0,)->Integer(2)_(0, 1)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M98.25,-143.7C98.36,-135.98 98.49,-126.71 98.61,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.11,-118.15 98.76,-108.1 95.11,-118.05 102.11,-118.15\"/>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(1, 0) -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(1, 0)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"174\" cy=\"-90\" rx=\"29.8\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"174\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">Pow</text>\n", + "</g>\n", + "<!-- Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)->Pow(Symbol('x'), Integer(2))_(1, 0) -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)->Pow(Symbol('x'), Integer(2))_(1, 0)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M174,-143.7C174,-135.98 174,-126.71 174,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"177.5,-118.1 174,-108.1 170.5,-118.1 177.5,-118.1\"/>\n", + "</g>\n", + "<!-- Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1) -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"284\" cy=\"-90\" rx=\"28.7\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"284\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">Add</text>\n", + "</g>\n", + "<!-- Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)->Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1) -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>Mul(Pow(Symbol('x'), Integer(2)), Add(Integer(5), Symbol('x'), Symbol('y')))_(1,)->Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M193.41,-148.65C210.74,-137.62 236.33,-121.33 255.9,-108.88\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"257.85,-111.79 264.41,-103.47 254.1,-105.88 257.85,-111.79\"/>\n", + "</g>\n", + "<!-- Symbol('x')_(1, 0, 0) -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>Symbol('x')_(1, 0, 0)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"102\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"102\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">x</text>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(1, 0)->Symbol('x')_(1, 0, 0) -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(1, 0)->Symbol('x')_(1, 0, 0)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M158.73,-74.15C148.67,-64.37 135.33,-51.4 124.11,-40.5\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"126.36,-37.81 116.75,-33.35 121.49,-42.83 126.36,-37.81\"/>\n", + "</g>\n", + "<!-- Integer(2)_(1, 0, 1) -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>Integer(2)_(1, 0, 1)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"174\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"174\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", + "</g>\n", + "<!-- Pow(Symbol('x'), Integer(2))_(1, 0)->Integer(2)_(1, 0, 1) -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>Pow(Symbol('x'), Integer(2))_(1, 0)->Integer(2)_(1, 0, 1)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M174,-71.7C174,-63.98 174,-54.71 174,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"177.5,-46.1 174,-36.1 170.5,-46.1 177.5,-46.1\"/>\n", + "</g>\n", + "<!-- Integer(5)_(1, 1, 0) -->\n", + "<g id=\"node10\" class=\"node\">\n", + "<title>Integer(5)_(1, 1, 0)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"246\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"246\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n", + "</g>\n", + "<!-- Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Integer(5)_(1, 1, 0) -->\n", + "<g id=\"edge9\" class=\"edge\">\n", + "<title>Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Integer(5)_(1, 1, 0)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M275.19,-72.76C270.58,-64.28 264.84,-53.71 259.68,-44.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"262.61,-42.27 254.77,-35.15 256.46,-45.61 262.61,-42.27\"/>\n", + "</g>\n", + "<!-- Symbol('x')_(1, 1, 1) -->\n", + "<g id=\"node11\" class=\"node\">\n", + "<title>Symbol('x')_(1, 1, 1)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"318\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"318\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">x</text>\n", + "</g>\n", + "<!-- Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Symbol('x')_(1, 1, 1) -->\n", + "<g id=\"edge10\" class=\"edge\">\n", + "<title>Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Symbol('x')_(1, 1, 1)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M292.06,-72.41C296.08,-64.13 301.04,-53.92 305.54,-44.66\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"308.78,-45.99 310,-35.47 302.48,-42.94 308.78,-45.99\"/>\n", + "</g>\n", + "<!-- Symbol('y')_(1, 1, 2) -->\n", + "<g id=\"node12\" class=\"node\">\n", + "<title>Symbol('y')_(1, 1, 2)</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"390\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"390\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">y</text>\n", + "</g>\n", + "<!-- Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Symbol('y')_(1, 1, 2) -->\n", + "<g id=\"edge11\" class=\"edge\">\n", + "<title>Add(Integer(5), Symbol('x'), Symbol('y'))_(1, 1)->Symbol('y')_(1, 1, 2)</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M302.95,-76.49C319.71,-65.42 344.35,-49.15 363.14,-36.74\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"365.15,-39.6 371.57,-31.17 361.29,-33.76 365.15,-39.6\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.sources.Source at 0x7f41d153f050>" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -505,7 +661,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle \\left( x^{2}, \\ x^{2} \\left(x + y + 5\\right)\\right)$" ], @@ -562,7 +718,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC0AAAAaCAYAAAAjZdWPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAABJ0AAASdAHeZh94AAADAklEQVR4nM3YXYgWZRQH8N+bFW1fYEikRGwQUUHfdiPlReRFGhFEFNGFEBGJhQRChXA4UkEIQlQWWlBUF4HdeNG6EiRUYoFtHxSCShSxIS1BeFGItl3MvMvD7OzurO6+9L955vk/5zz858x5zpyZ3uTkpC7IzNXYjNuxHA9FxO5OzguMc+ZhexG+w8ZF0tIZ57aRmXkpXsT9WIHz8FxEbKnXByawDa2i8SHuwyf4AKewZ1Ci5sI00Zl5nUrwaESsG7ykudGW03fX48eDFDIfTEU6Mx9EWQ12ZubO+vr6iDg8UGWzoEyP35HYgKV4qeYncWTAumZFr6zTmbkEJ3A0Im4qDTPzYlxTT8dUNftT/BkRvw5GboXmQbwBQ/imxXYlPivm2+rxPaxfcGWzoCn6tnqcJjoi9qO32IK6oFk9+qLHBi1kPmiL9CS+bRpm5lIcxqqIOLb40sjM3TgQEdtLvix5PdyMIxFxomWPF7C3L3ghGqjM3FDvsRw/YlNEfF6YbMX+zHwnIv7qk2V6XItLtKRGZl6IJ/B2QZ9VA5WZD+NVvIxb8SVGMvOqvk1EfI+f8VjpW6bHjIcQ6/Avvig2HMFILeBMdD+LdyNiVz1/JjPvxVN4vrDbg0fxRp8oIz2b6DtxKCK6Nd9zIDPPV6XVvsbSPqxqcF/hjswc6hNTkY6Izar8asMwxs9WbIFlWILjDf447mlw46rWeAWO0f0j4AL8c+YaZ0TzyfVauL/rcSrSXUVPqPqRhcIETuOKBn+56dG/rB7/6BNdRY+pXvELgog4iUNY01hagwMN7kaMR8TUzcz05dLEKF7JzGURMcG0BgqGM/MW3Ruo7Xg/M79WlbsnVXn7VsNuNfaWRKdIR8QPqlP8SEGvVD2Bfl3fVl9v7Rtk5vrMnMzM4ZY9P8ImbFG9ge/C2oj4pfAfwgPYVfp2jTRVr/1aZr4ZEac7NlBX4yf81rYYETuwYxb/x3EwIg6WZOdfCBExitdxZVcfrMXGiDg1D58SJ/F0k+x1/Vnzf8J/lSTmjUVQzcoAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAC0AAAAaCAYAAAAjZdWPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAC/ElEQVR4nM3YT6hVVRQG8N/Vil5YYAaShBVEhET/aSDZIBLCIogGFTQoalCGJJIDJVgsqahBgYNEtOBBNYhq4uCVjooo7IG9oL9UBkVZkgXhoCjlNjjn3jbnHd87z/fepQ8O+55vr7Xvxzprr73O6fX7fV2QmTfjCVyPVXgwIsY7OS8wlszBdhk+w+P4c3HkdMMZbWRmnoencKcqqmdiW0Rsr+fHRyWwDa2i8RruwARexQnsG5Wo2TBNdGZeoRK8PyJuH72k2dGW07fU41ujFDIXDCOdmXfjzWJuT2buqX+viYgvR6psBpTp8TMSG7EcT9d8H1+PWNeM6JV1OjOX4ji+jYirSsPMXIbL6tsP8axqc/4eET+MRm6FZk6vwRg+brG9AVP1NaZ6KlPYsZgC29CsHtfV4zTREfEueostqAuakR6Inhq1kLmgLdJ9fNI0zMzl+AprI+Lw4ksjM9/AwYh4vuTLktfD1fgmIo63rLEdEwPBC9FAZeZGbMWF+BybI+L9wmQH3svMlyLijwFZpsflOFdLamTmOXgYLxf0vBqozLwHO/EMrlVVpLczc/XAJiI+xXe4v/Qt0+OUmxAbVGnzQbHghKo3Od0GagvGI2Jvfb8pM2/Do9hW2O3DfXhxQJSRnkn0OhyKiG7N9yzIzLNUaXWgMXUAaxvcJG7MzLEBMYx0RGxV5VcbLsaReav9DxdgKY42+KO4tcEdUbXGq3CY7i8BY/jr9DXOC4P9Mox0V9HHVP3IQuEYTmJlg1+JXxrc+fX464DoKnpKdcQvCCLibxzC+sbUelUVKXElfoqIYSqd6s2lif14LjNXRMRvTGuglmB1Zl6jewP1Al7JzElVVXpElbe7G3br6v8folOk63o5iXsLetYGKjMfyMx+Zl7Ssubr2IwnVSfwTdgQEd8X/mfjLuwtfbtGWi1qZ2bujoiTHRuoS/EFfmybjIhd2DWD/0P4KCIOlmTnTwgR8Y6qwF/U1Ud1KD0WESfm4FPiH2xqkr2uH2v+T/gXmdDo73n+u0IAAAAASUVORK5CYII=", "text/latex": [ "$\\displaystyle {f}_{(1,0)}^{1}$" ], @@ -632,16 +788,13 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle \\left({img}_{(1,0)}^{2} w_{2} - {img}_{(1,1)}^{2} w_{1} - {img}_{(-1,1)}^{2} w_{1} + {img}_{(1,-1)}^{2} w_{1} - {img}_{(-1,-1)}^{2} w_{1} - {img}_{(-1,0)}^{2} w_{2}\\right)^{2}$" ], "text/plain": [ - " \n", - "(img_E__2⋅w₂ - img_NE__2⋅w₁ - img_NW__2⋅w₁ + img_SE__2⋅w₁ - img_SW__2⋅w₁ - img\n", - "\n", - " 2\n", - "_W__2⋅w₂) " + " 2\n", + "(img_E__2⋅w₂ - img_NE__2⋅w₁ - img_NW__2⋅w₁ + img_SE__2⋅w₁ - img_SW__2⋅w₁ - img_W__2⋅w₂) " ] }, "execution_count": 26, @@ -671,16 +824,13 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAAaCAYAAACAVwz9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAPlklEQVR4nO2dfdAdVX2An4CYWBKV4AjFjxBBEJRBEgoZQHwjEDLUGaPtFL9og1Q+EgUqokaRH7+IH1jBpJSIYzsEQ3GordbSomWSIvIpNAER5UNRwIqiQIhEJVF8/eN3lnff857du3vv7t29955nJnPznrNn9+zuc8/Zc8/HThsfHycPVZ0uIttyN2oYVV0BvAXYF9gG3AqsEJG7G81YZGiJzkUgehDpjuhNpEqiT6NNvP+dUdXnisj2DtsUuo47dNjJu4G9e8tuXxgD1gCHAW8Afg+sV9XZTWYqMtSMEZ2LRA8i3TFG9CZSHWNEn0aZMeL978SBqnpsh23GKHAdp2X1OKnqQmCRiKwIxL0PuBB4h4hcWTr7NaOqM4EtwBIRubrp/ER6o+2+QXSuH0QPIt3SdneiN4ND212C6FOdxPs/uKjqhcBaEfluwe2D1/E5GRvvDHwKa32FONh9/l/RDPeZWVhv2uamMzIMqOpLgZXAYmBX4GfAfwAqIoWvsao+CMzJiH5URHbPiGu7bzAizjXsQvRgQIllSEeiNyWI5VBHok/1Ee//4LISuFpVx0TkDwW2D17HYMMJ+ABwnYj8NiP+Qy4DPyiY2X6zGrgTuKXhfAw8qroXcDPwYuBrwL3AIcAZwGJVPVxEHi+xyy3AqkD41pw0bfcNRsC5FrgQPRhAWuANtN+d6E1BWuBT212C6FOdxPs/oIjIFlW9BzgBuLxAkuB1nNJwUtVZwOnAoTkHf7hMZvuJql4EHAEcISLPNJ2fIWANVkGdLiIXJ4HuOv8d8HHg1BL7e1JEziuTgTb7BiPlXKMuRA+aQVWXApcBC0Xkm13sIpYhOQyrNzUSy6Ecok/1Eu//wPPPwL+p6pfyFovIu46hHqe/BJ4QkfszdrYQ+F/gMyJythd2IXAlcC5wJLCjCz9NRH6uqvsD5wBHA9OBG4BlIRFVdQZwJvDXwCuAR4HPAxcATwIPisgBXprPAm/FKvgfZV2QulHVo4D1wMdE5NxU+KHYKh0Ac0XkwVTcFcDbgf1E5L4+ZjcT98veIuBB4BIvWoCTgRNU9SwR+XVNeWitby5dK5yrm6ZdCHnghVfiQvSgWpr2xuWhtWVI9KYcTfvUr3LI7TP61DJiPVQ9/X5eFpHb3HSkNwJfychT7nXMajhtyjnuPPe5KRC2D3Aj8HWsVbcYWAJMV9XPAV/CJLocmz/158AX8eZSuZNaDywANmLdZbthMu4HzPTzqKqrgePdid6bk/9+kIyHnOWFfzD1/9lY4Y+q7gH8FXB1WxpNjoXu81p/PKiIPKWqN2GV2AJgQ8F9TlfVdwIvB34N3AV8K+eXkVb65tK1ybm6adqFkAfp8J5diB7UQtPeQEvLkOhNVzTtU+3lEESfWkysh6qnieflO7C2zpSGU5Hr+BwvwQ5Y19QFOQfMq4QOARaIyF1ufyuBh7GC7CDgGBG5xcU9F/ghcKSqzhCRp1P7+zwmzbnA+SIy7tKsw4SadHxVvQQbs7gE2KyqyYTOrSKSN+69LqaIoKr7AG/CJrAuAXZJbb8c2An4+/5krzD7us9g7yM2xncRVlgUraR2B9Z5YT9W1RNF5PrA9q3zzcW1zbm6adqFThVWFS5ED6qnaW+ghWVI9KZrmvapH+UQRJ/aSqyHqqeJ5+VNwDv8wKLX0X+P0yuA5+NadhnMwyZN3u+FASxNhAH7Bcjta0fg7EQYF7cduA+YBuycyvgCd0JfE5GPJdK4NBswCZMTT1iGXfQN2Oo6yb/355xHnYRa0O8HngI+7f6eDc92yZ4MfFtEbuxbDovxAve5JSM+CX9hwf1dBhyFVVQ7AwdghcSewNdV9cBAmjb6Bu1zrm6adiHkQRIOPboQPaiNpr2BdpYh0ZvuaNqnWsshiD61nFgPVU8Tz8sPAXuo6q5eeKHr6A/Vm+s+g4WS60LcB7g51QpOwn4kIt8IJJsDPAFclRH3lExeAWe5+/x4KA/A48DLsJUuABCRaRnbNsUW4A84EVR1N2ys6mrgJ26b5IVaJwAvAk7r9aCav7RqiH8RkXf2etyiiIh6QXcDp6rqVuAs4DzgzUlkW31z59I25yYxTC6EPPDCq3BhKD0oSwdvrlP1bxuXi8jSOvOUZljKkGHzJotYDgHRp0ao2r1YD9VGE8/LSRtnLnZNgeLX0W84Jd1hv8rY/kCsl2pTIGy9v7Gq7un2+RUR+Z0XNxPYGxsPmmYRdiJZa+T/KfAD15JvJSIyrqpbmGhBn4H9qrAaa0XDxLU+A3iA1FhLVV0BvAUblrANmyC3QkTu7nDoB4CnO2yT5pEO8YlcL8iIT8KfLHHMEJdildSRXnj0rXuGyYWQB+nwKlwYVg/Ksoqpv9a/Fhs2cTlTRyPc2WF/sQwZHXdCxHIo+tQUVbsX66EaaOh5OWnjvLCbPPsNp+nu8zcZ2yfdkXcEwjYGtp+fE3cQdnHS43RnYMuM3plu0afiX4V1qX/TC98Fe5fDYSLyQEbeK0dVvwzcKiIXBqI3A7Pcl+M04EoRecSlewaYraqLgFcD75HJE13HsCVXb8eu0UpgvaruLyJPZOVHRI6q4LTSJBPv9smIf6X7zBpvXpRfus+dvfBW+ubi+u5cB98mMWQuhDxIh/fkwqB5UJaS3qwKpF+KNZzWSvnlyGMZ0qI6qwpiOVRPOQSj6VNZivpXg3uxHuqBlj0vJ22cGd2ci99wSl54OzNj+7xJtqEW8vycuIMC+3rG/dtl6uaAvZjXTwPwYeCatDCqeiQ2LnE+sAdwooiszdhvEFVdBpyNtfK/B5wpIjekNlkJXK+q/yQi/vDGze48TsZ+BUtPZPsV1vV4JvbrwmXphCJyrJePE7Bf2g4Hri5zDj1ynftcpKo7pGVVe9/X4ZiAt4YSl2CB+/SXfWyrb+A516tvBdPn+VY3TbrQaUJury5U5kFZojcjW4bUUmf1SvTpWZooh6BCn8rQBvdK5KMp/2I9lL+PQXpeTto4v82Iz8VfHCJpnT0/Y/t5WNfn972w7djYYJ+81vYUCV1X5n3AHLW13Z9FVZcDJ/ppVPVPgL/Fln5MM9Pl6Qy6uDiqejzWVfgJTPCbscmiL0/l97tYwRoaF5uIcCYmdPqabcFeMLwYWCMiWT18CbOwe7W5w3aV4r6E12ITZZd70Yr9GrdOvPdlqOpeqvoqVd0pFbafGwuMt+2ewD+6P6/wolvnm4sLOdeTb0XSd/CtVrpxIeSBCy/rQsiDJLxnFyr2oCzRmxErQ+qqsypi6HwalHIIKvepDG1wr1A+GvQv1kMZDODzctLGeTxnm0z8Hqfk15Up44dVdTqwP9aN+Hsv7C4Jv4F3PvCQN/ExYR52g+7xwj+JLQ3636p6FfBzbIn0V2JdkfsyWZzjgHHgpvROROQa4BqXz7WB43fifdjQlC+4v9+rqouxbsQVqe3+E3gbU1/Gl4iwCzahLc2T2LyBp5kooPNYjc0luKXDdnWwDPsS/IP7Mt+DSbwQGw7xkUCaDdikx7lMzIk4HjhLVb+FrWjyFLAX9h6DGdi9+kyygxb7BgHnevWtRPos3/pBWRdCHkAJF0IeeOFVuVCJB2WJ3oxkGVJXndUzQ+rTIJVDUJFPZWiDeyXz0Vf/Yj3UkUF7Xk7aOP4IhUL4PU4PYb1Oewe2fQ22dvqmQNiU1rSqzgF2zYibjr3I6y7xXjInIlcApwM/xS7w27CL8GdMjP9MtyRfB2wMjQntFrX19edjv2yluRY4zAu7DThEVZ/nhSd5vF2mvgsi6aZcJyK/6JCXi7Avzl/416ofuF/4DgbWYpXTWVjlshp7X0HRFvt1wH+5tG/HvmivxyZG/g3wRq/gaatvUINzJcjyrXYaciHkQTq8EhcG0IOyjJo30N4yZJC8yWLUfOpLOeTObxR9Kku//Yv1UAYD+ry8N/BDEclaCC+XST1OYqtbXM9EF2I6biM28So3LBX3UE7cNky2ICJyMXBxOsyNW5yNtcjTzKHzaihleRG27v6jXvijwNFe2CPYueyBrfYBgIicApwS2rmIjBXJhKp+Fngr9gbjrlrGVSAiP2Gim7jI9nsGwq4H/C9E3j7a6hvU41xRgr71izIuhDxw4YVdyLrndbgwYB6UpWtv3Fj3tb0cPJYhkxgkb7KI5VBOuIuLPtVHX/2L9VAug/i8PI+J+ZKl8YfqAfwrqeEO/URVdwR29VuVqno08DlsTfdLvWTPY+oN6yfJeNBKf/lQ1dXYUIKFInJvlfuOGF36Bs06V4tvo0zVHqjq+YSHn6VZKOVXqOuF6E0NtLXO6oOD0acaqNKnpsqhPh136Pyrsh5qaR0ELXheVtUdsCXkz+v2eKGG01eBC1R1vmtN95P9gdtV9X+w1uhO2NjGI7DlQd8kIlu9NI+RvQpJtzyGrW6ymxe+GzbmNE3yYq5fUhGqegk2znMJsFlVd3dRWwPnH+mebnyDepwrSuW+RSr3YBVTFynwebhDfNVEb+qhLXWWzyrqdTD6VA9V+rSKZsqhfhx3GP2rsh5aRf/u/aA9L78B+BlV9jiJyDZV/SjwLsIrgdTJdmyC2qHAsdjbhH8MfBq4SERCv9LdASytMhMisl1VNwLHAF9ORR0D/Lu3+WuAn2bkrVuWuc8NXrjSQys5MoVufIManCtBHb6NOpV6ICKPYZVJm4je1EMr6iyfPjgYfaqHynxqqhzq03GH0b/K6qF+3vsBfF5+F3C+TH4XVCmmjY9PnU/murI2YBOsMl+42gZU9QBs8tyL05NCdeKtzGAr8HwKW9HjCRHp2NJ2yyuuw27KTcCpwEnAq93Y1WS7tcAzInJSFecTaT8h5yrwrVD66Ft7yCp7Su4jejNi1FVnVZS36NOA0YZyqCqif+Vpw/0flOdlVX0J8EXgaOlhMQ1/VT0AXEvsFOCcbnfcL8TWhr8NmxSW5mCsJX4HNp5S3f9XJhuo6lJVHVd7b4O/36uwNeXPwaQ8AjjOk2AG8GbgC376yPCS4VxPvhVMH31rETllTxmiNyNGXXVWRUSfBoyWlENVEf0rSRvu/wA9L38CeHcvjSYIz3ECQETuV9WvquprReTOXg7SBxRYraqXiluC0E16C65okmIu9jKz/w9FisgaYE1O+pOAb4tIr28pjwwek5zr1beC6aNv7WNK2VOG6M3IUkud1SvRp4Gl0XKoKqJ/XdP4/W/787Kqvg64rMCKex0J9jgliMgNwHd6PUjdiMg3sBdqvbRk0uOA5ZJ6oVlJfge8t8u0kQGmS+eib0NGD2VPGaI3Q0aDdVYVRJ9axoCUQ1UR/fMYkPvf9H27sapVBINznCKRSCQSiUQikUgkMsEfAVkOEq5D3Q3VAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left({img}_{(1,0)}^{2} w_{2} - 0.5 {img}_{(1,1)}^{2} - 0.5 {img}_{(-1,1)}^{2} + 0.5 {img}_{(1,-1)}^{2} - 0.5 {img}_{(-1,-1)}^{2} - {img}_{(-1,0)}^{2} w_{2}\\right)^{2}$" ], "text/plain": [ - " \n", - "(img_E__2⋅w₂ - 0.5⋅img_NE__2 - 0.5⋅img_NW__2 + 0.5⋅img_SE__2 - 0.5⋅img_SW__2 -\n", - "\n", - " 2\n", - " img_W__2⋅w₂) " + " 2\n", + "(img_E__2⋅w₂ - 0.5⋅img_NE__2 - 0.5⋅img_NW__2 + 0.5⋅img_SE__2 - 0.5⋅img_SW__2 - img_W__2⋅w₂) " ] }, "execution_count": 27, @@ -707,16 +857,13 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/8AAAAaCAYAAADhY+z6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAABJ0AAASdAHeZh94AAAXWklEQVR4nO2defgdU5rHP1kQQyxhiGVIaDtt3yV+ESK2tjxtGm2JZbRg0IzuDiavl8ZgmNj1mG5L0DTaNrYQS2ytTToaQdsSYu22i0aIzB/vqdz61a26t+reuvfWvfd8nidP/VKnlnPrfOutOm+95z195s2bh8fTiahqP2CoiLza6rpUQ1XHAXsBawBfA38AxonI8y2tmKcj8XrzBHgteGrB68aTJ15P3Y1v/+qo6lDgTRGZW2GbVNexbyMr6vG0mPMx8bcDPcClwFbAdsC3wAOqOqiVlfJ0LD14vXmMHrwWPNnpwevGkx89eD11Mz349q/GV8D4Ktv0kOI69sny5V9VVwLeAG4Vkb0yVLjjUdUhwAzgahEZk8PxjgGOAIYCA4CfisiEeo/bLajqYcAAEbk4pux44DxgPxH5bdMrlwJVXRT4FNhDRO5sdX089VF0zXm9NYei6wC8FopK0bXjddM+FF1L4PXUSHz7ty+ub9NXRP475fax17F/xvNu5JZ/yrhfUIlAcD8WketrOUarUNUXga9FZIMmnGsf4AJgGjABF7qRt4OhU1HVZYGjgI0TNtnELac2p0Y1MRCLzPmo1RXpBFR1ReA0YDSwFPAucBugIvJxhuPMBFZOKH5fRAYnlBVdc12jtxZroeg6gC7SQha8DamK100GvB2qitdT4/Dt3778GusP3iwiaa5N7HWstfNfq2Dq3b+V3AqMU9WhIjKjwefaNViKyDvBStf591TnZOA2EfkuofwX2EP3leZVKTMTgGew8TqeOlDVVYEngGWA24GXgM2AY4HRqrq1iHyY4ZCfYu0TZXaFfYquuQl0gd4KoIWi6wC6RAtZKIBuoPjamYDXTSoKoKeiawm8nhqJb/82RUTmqeqtwDjgxBS7TCDmOmbt/AdfUmv68u/2n02xBZdEcLH3xMaSN5LlAcIdf086VHVJ4FBgnaRtROTN5tUoO6p6LjAcGFYpsYcnNZdiL1nHiMhFwUpVPR/4KXAGNsQmLZ+IyKlZKlBkzXWZ3lqqhSLrADpXC6o6BrgSGCEiD9dwCG9DKtCpumkg3g5VwOupsfj2b3uuAV5R1XNF5K9JG1W6jmWdf1Xtj4VMHwqsBvwVuAQ4F/ty/7aIvB/afhhmrNYHVgA+A2YCD4jISW6bs4GfhU4zV1WDvw8QkWvT/+bWICJPq+pb1Nj5V9XNMS/NNsAg4H3gbizE6x23zamAhPYJJ2TQUNlBqnpQqOxgEbnK7TMG2A3YEFgO+AZ4Drgsep3DwwiAM4HTgRHA0liiiJmVyoOXKFX9Z+BoTAMLAq8C1wPni8jXofMtioWePC0iW4fWLwx8DCwEHCgiE0NlR2L6O1REfhNzaaP8EPhQRGbGFarqCOBB4FwR+VnM+vNc3cdjN00/t36siLynqmsDpwDbu/o+ChwZNaaqOgA4DjgQWAVr718BZwOfADNE5Psx9TsP2B97SW3ZLAWquj1wP3C6iIwPrd+ckgdxaPg6q+p1wL7AWiLylyZWNxFVXQUYhWn5kkixAIcDB6jqCSLyRYPqUKa5vPXmjplZc0XRWzNotRa87WlPWq0bVwdvQzqEVuvJ26Huxrd//jT7fVlE3lHVd4B9gAsT6lTxOvaPbLwg8L/ADliYwMXYWCTFHAGDgTtD25+EeSjfBO4DPgCWxcaTjAZOcptOxTqQB2GhTveHTvtI+p/ccm4DjlTVZcMOkGqo6sHAFdjY/TuAWdj1PAzYTVW3cDfOw26XMdgYLg0d5mFgCSws7M+uLgHPhP6+DHgBmIKNIVsK2BmYqKpriMi/x1RxVeAp4GXgOmBhzIlTtVxVz8QiIj7ADMZsYCfMWbCjqu4gIt8AiMhsVf0jsLmqDhSRz93xt8aMCMBIYH7nH3NCAEyOqXccP8ByJSQRDD2JbhOsXx14DLgHG1szGtgDWEhVLwN+ixnCq7GsmrtgXrie4ECqugjwALAFpv0LsPtiPLAWsGhcHVX1QuBH2M36QvWf2lCC8UEDI+t/Hvp7EPYCg6ouD+wN3FmUjr8j0M+k6DAQEflcVR/HXsS2IL3GFlLV/YGVgC+AZ4EpFTzUcZrLTW9Qm+YKprdm0GoteNvTnrRaN+BtSCfRaj15O9Td+PbPn1a8L0/D+jtlnf801zH65f8SrOM/HviliMxzB7qKUif9T27dstiYkceAkSIyJ3LypYO/ReR3qroE1vm/WlJmKSwgv8e+cO8OpM20uDrm7ZoJbCsib4fKtsMcIRcAe7ov6Q+rag+wcjSMSy2xy7HAMxVCvNYVkdci+y2I3ci/UNXLw3VwbAOcFURqhPYbUqV8S6zjPwvYTETec+vHYcMkdsWiHc4M7fYg1tkfDtzl1o0E5mIOi5Gh4/fFDMrrIvJGwu8N16ePO3asJ8yRlLQyWL8ZsIWIPOuOeRrm3BqFRVPsICJPurIgymG4qg4Qka/cMX6FGb3ofTQRM4hl51fVSzEv3R7AR6oaJOmZLSKVxoE2iiDh0HxjpqqrYdq/DavnkqHtjwIWwCKEisQabvlyQvkrWNuuTvoXrcH0dlABzFDVg0UkzpkZp7k89QYZNVdAvTWDVmvB2572pNW6AW9DOolW68nboe7Gt3/+tOJ9eRpwsqr2Czv50l7HvqEdNsO+RE8RkdODxgIQkSnAi+6/QbK+NbFwkJejHX+3zweRVUmCayemAB9iof9pGYs18rHRTreIPIhFAuymqlGPUU1EO/5u3RzMsdOfUOc6xPv0jjJIW36IW/4y6Pi7830LnAB8h2kqTPAwC9djJKarW4AVncMEYAMsciHtA3A57AZ7t8I2GxGfdyLQ55jA6IF54jHHTT/gxMDoubI5wF+APsAiAKq6BfBj4PaY+2gyZkSh/D4YixmOya7+wb9/q/iLG0eZMcMcOZ8D57j/D4L54V2HA0+JyGNNq2E6FnfLTxPKg/VLpDzelZheB2Ntvh72oBsC3KOq68fsE6e5XPQGNWuuaHprBq3Wgrc97UmrdQPehnQSrdaTt0PdjW///GnF+/K72DWPzvSR6jqGv/z/q1uOJ54g82jQYNMxI3WIqv4jFg4+SZKnKNmI0vjzXqglaXsJ2Cqu89ooVPVm4AkRSTWGX0TmquqdwH6quriIJBnvMFu65baqumlM+TLYTbU6OcyCoKorYaEmI7EQsIUjm6wQs9ufJTQ2P0N5YCwejBaIyMtqORKGquoSIvKJK3oS+NLVD1Vd3B3nnNBxRmJe8SA8ruz4CQQ3wWdxhS4UaXWszb+LWT9DRO5NOO5HwI0JZZ9LKTPvUW55RkIdPwT+id5DNRCRPgnbt4pPMefNQJgf6XMgFqUyy20zyC0PwPJAjK33pFp52qI4rhOR/es4ZXDd51XcyiEiUSfY88ARqjobc3idSsg5GKe5nPUGNWiugHoro5O04G1P86iim4dUy/zY9U6d621IB+PtEODtUEvIW3u+/RtGK96Xg37OSsDrwcq01zHc+R+FNcqUhG1XweYMfdud4ANV3QZLULIzlmRurqreD5wsIuHwsP6YN/KFhE7kScC90Y6/WrK3E7EvutOB40Tk0TQ/LOX+p2Fh9r9O2ZEHC2cfg41zuT7F9ku5ZbUpGRZNef5E1BLJ/BH7+v0oMAkT5VzMC3wQpbH1Yd6LWZemPPBgJ31pfxcT5uJYgg9EZI6qPgZsr6rLYM6RfsBkEXlRLYnFSCx3wUjsAZi287+YW8Z2/rGEhH0p9zgG6++P7uCGPiwJ/F5c7oJQ2aJYPoTHQ6uD++j/EuqwHPCKlPIdFBKx6UQ+peTJPBZ7KbkA82ZCKYzpWOA1bFgMMH/ox15YiOPXWNKTcSLyfJVTvwZ8VWWbMNVmxAju68UTyheLbFcrl2MvWsMj6+M0l6feoEM0F0MnacHbnuYxgfKvphtgIZhX48ZdhnimyvG8Deke7cTh7ZC3Q60ib+359m8ALXpfDvo5i1XYJpH+7sQDsC/Q08IhGqGKbYVNP3dPeL2r2N5u3MdwLJRhb2BTVV0h1NFfGxhATMi/qv4D8C+Y8yC8/kfYhTsSyyswFgthWltSTFORZn8ReVZVZ2DjI6JZV5OYhIXM7Em6zv98Qy8iSZ3SvDgeczbMz/4foKr7Yp3/OKp5mJPKg982GBNzlOUi2wU8iOWW2A7YChN7YDweAnZS1YWAYcB0qTCVRYQF3TIpiqFaopM4Y7VxhbINCRnS0H30TMJ9tCZ2rR6OKSti9MvHwEBn4I8ArpfSzBRzgUGqOgqbVvFo6Z28qAebzuhpzAieBjzg7r+PSEBE4oal1EOQTGX1hPLV3DJp/GVaAo0uEllfKVFXXXqD9tNclmirDtOCtz11kFE3E2L2H4N1/q+S7FP9eRsSo5120E0S3g55O9RK0uqvAdrz7V8HBXtfDpxCCyaUVyT48j/X/VsmYbsgrCh2vL4b9/EAVtlHsQRxy1Ia27GBW8ZlYd8FC5eIjn04HntQX+H+f4yq7oR14scl1LOW/e8A9iNl519EvlLVe7EOajRhThx/wG6eYZQS3NVKkNShX0L599zylpiybes8dxzTMKPRQ6Tzr6rfA1bEwog+iewXHve/JfB46DpOxsYLjcUeWmnH+wP83S2T8idUS3QSN+xi4wplG0aO9637t2TMtlCa7jLuPiqLflHV4VjEyMaYI2VvEbk54dix1Bn98rH7LYdjX9L+M1T2GRbGdBzm5b0yvKOI7BipxwGYE2hrQjOGNIGH3HKUqvaNhLoNdPX5ktJ0LLUSDO95PbK+UqKuevUGOWquXr2l3L+WaKu8aKUW2sr2ZMHrpmttSEOeWfXi9TQfb4earL0M9WiV/nz7Vz5GO70vB1/8a5oOtK878TdY8ocVVDX6Bf7n2HyO4BpfVTdU1VWjB3MdvnWxTv9boaIg9D3uy/c2wNSwl8hFEmyMfWUPMwn7UlyRjPs/hUUqRMfGV+JWrGO6Q4ptL8ZyHfyXlhLZ9aqrqg5Led6Psa/wKyWUz3TLnsg5dqQ88V4e/MYtT1HL+xCcrx8m/L7YVCFRpmLDAHbHvGDhDn7wd+CgSRvyDzbdICSHwWyEecuiU19sBMzBxspFCQxfnLHqZUjFEh2+DKysqr08tqp6FHBw3LFC0S//Ezn+Iti0jkfH/5zKhKJfzsSM9ONY9Mt8/YgldgmiX6IExuw44G4RmR4q+xTYHJsG5lIR+Xv57r0YiOkh8at/I3APkknYsJejIsWKXeNrJDKfsqquqqprquoCoXXrqOogogdRXRm7zwGujRTHaS4XvUHumqtLb2n2r6K3hlKLFuJ04NZn1UK72Z4seN10mQ1p1DMrJzpOT94OpaII2ktVjxbqz7d/Am34vhz0c6LJ9VMRHvN/FjYe7hZVvQEb592DjdWfhSVoCBrsGOAgtTnbp2PhRUOxOQcBDomENAQeozNUdV3MUzFdRG7CDGB0nMrS2Nft9yPr36fkiKhElv3fwbLxL0986Hocd2E3yl5U+YopIi+p6iFYR3m6ixp42Z1zJSwi4G/Y7AkVEZHZqvoUMExVr3PHmQvc4UR5KXZz3aSqtwBvY86Y0cDvsHkfc0NEnlDVczBv3vMuJOYLYCd33seImcpCRL5T1Uewzj+EOv8i8qaqvoaNI5pLaYrJNAQe7rKxdGrDCNbGwpG+jVn/rMTMWoEZtzekfPaKoOxLSjNhgN1HE4G7VPVG7D7aBgvlewkb0xM1orHRLyJyD26ojZYnqUpDvdEvgTFbEktSEuYTLKLnK0ovGZWYgI2trfdrRi0cCTwBXOgeSC9ihngEdg+dHLPPZCyRzVBKTrW9sekyH8IeAJ9jOt0FG9Z0NyFvb5zmGqA3yElz9eotw/6Zoq1yJqsW4nQAGbTQjrYnC143XWlDGvXMqpsO1ZO3Q1UogvYy1qOp+vPtX5V2e18OOv81RUr0Df4QkWswj8VbQDA+fBYWdjAP+FBKc63fjmX3XxIzPidgczpeD6wvNp0DoWNPwWYT+MIthdJQgAEkJ7SIjhnpE7OuEmn2/9ItU3/5d+EeD2JT9CWF4Ie3vxbznl0HfB/zTO2PhenfjD0I0nIA5nwYjV3H03HeN+cAGIE9VHbGRLsY5qS4PMM5UiMiP8f08gqW3fIYTFenYPOBxhkTKHX4P6N8LFFQNjVLSJRYApFXKI2ZC7Mu5nCJGp1gfVlIk/OeL51QthCwFmYwg+EYQVsfgzle9nX/ngE2pTQWKjojRln0S73kFP0S1PNpKZ8rOGiXiVIlJ4OqnovlBNk7fK2ahfvSsglwFfaCdQL2gnQhsKX0znpdiYewqJ+hmPE/HhtO8xhmL3eN6D1Oc7nqzf2+QmguA7VEW+VCi7TQVbangXSbbqC4NqSddJNEt+nJ26Fi0Wz9+fZPoE3fl4PZGWqKpg1/+UdELsDCHqKsHNnuNuC2LCcSkYuJ93h8QPn4kA+wr76DI+uXofxrfhxZ9g9Cpv6W4rhhbsU64MOBh0RkJqUpWsoQkeewWQKqIiI9FcpeJZIcMVL+BKUp8qL0iWw7M7ouS3louxuAG6ptF9nnIuCihLKfAD/JcrwQD1MKRQofcyoxvyVpvSt7o0LZ15jBjCsr+21qY3gGYV7RKEOonqU1K3VHv1Rqh0oaDaOq52GOrhFOuy1BRGZRCjlLs/2QmHWPkCESJU5bjdCbKy+C5tJSS7RVbmTRQpwO3PrUWuhC29MoataNWALcq+o5ubchvRhC++gmCW+HKqx3Zd4ONY6m6s+3f0Xa8X15I0r5QzLTv/omDWcakU6x2HRwU7Ex9TeFinYgPpldLzLuvx7wjoikcSqEuR2bjm4v6mgAT+7cCNyukUQ6zcBFgSwV9eyp6vaYVmYRH4FRKfqlXhoS/ZIGVb0QG2oyQkSiY8w8OVBQzVWjIXrrZvLWgaqeikWWVWKEZM+cXw9eNw2gRu003H40QYNeTznTKXaoSeftOP3l2f4tavu2eF9W1T5Y9PzZtZ6vCJ3/+4CzVXVp6T2m5Hxgossr8DjmUVme9OHrafcfDtybtdLOWVA15N/TdIKxb9tTHsLTaNYGnlbV+zCP4ALYDboNFo2yu4jMjtkvLvqlXpoR/ZKIql6KeTD3AD5S1aAesxOugac2iqS5tOSuN0/uOriY6tFcb1Ypzxuvm8ZQi3aaYT8arUGvp/zpFDvUjPN2ov7ybP9mtn27vS8Px/IIPFDrOVve+ReR51wSu30IDQsQkRtVdSls7PhyWBbKnaWUdwC1uXuvBIa6EHUy7r8wdrFHNeTHeZqOWDLBk7BokmZ3/udgCXY2B3bEEpjMAM4Bzq8QXVIW/VIvTYp+qcRYt5wcWa/AqTmep9spjOYy0Ai9dTu56sA54mvKItxAvG4aQy3aabj9aIIGvZ7ypyPsUJPO24n6y639m9n2bfi+PAb4jyo5ASrSZ9681ufXUJuK7iJgrSw/Ri2l4w+xJIPfVts+Zv+jgR+IiO/8dxiqOgkYIyKFH0emquthCVGWDUe/qOqiWFJIMON4Iubp+0hEqno81aYumYgllAyiXw4D1ok4wa4BvhGRQ3P5QZ7CE6e5HPSWan+vt+KQZHsyHsPrpsto1DMrp7p5PbUZRbBDeeH1l50itH+7vC+r6jKYQ6Knns5/3+qbNB4RuQ/76r9ixl13Bo6upePvmIPNPuDpPA4Hxre6EmkQSwYZRL+E2QQzYtPc/891f58WbKCqY1R1nqoOiTnujdgMHqdghnUYydEvV0T393QuCZqrS28p9/d6KxAVbE8WvG66jEY9s3LC66nNKIgdyguvv4wUof3b6H35LOCIejr+UJAv/x5PI1DVLYF+IlLz3KHNwke/eJpNLZrzeus8arU9Gc/hddNhtOqZlQdeT8WjHexQjvXw+ovQDu3f6nZT1S2AwWIz7tVFIb78ezyNQESeBJ5sdT3S4KNfPM2mRs15vXUYddieLHjddBgtfGblgddTwWgTO5QXXn8R2qT9W91uT+fR8Qf/5d/j8Xg8Ho/H4/F4PJ6O5/8BB36dFeoPK2wAAAAASUVORK5CYII=\n", + "image/png": "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", "text/latex": [ "$\\displaystyle {dst}_{(0,0)} \\leftarrow \\left({img}_{(1,0)}^{2} w_{2} - 0.5 {img}_{(1,1)}^{2} - 0.5 {img}_{(-1,1)}^{2} + 0.5 {img}_{(1,-1)}^{2} - 0.5 {img}_{(-1,-1)}^{2} - {img}_{(-1,0)}^{2} w_{2}\\right)^{2}$" ], "text/plain": [ - " \n", - "dst_C := (img_E__2⋅w₂ - 0.5⋅img_NE__2 - 0.5⋅img_NW__2 + 0.5⋅img_SE__2 - 0.5⋅im\n", - "\n", - " 2\n", - "g_SW__2 - img_W__2⋅w₂) " + " 2\n", + "dst_C := (img_E__2⋅w₂ - 0.5⋅img_NE__2 - 0.5⋅img_NW__2 + 0.5⋅img_SE__2 - 0.5⋅img_SW__2 - img_W__2⋅w₂) " ] }, "execution_count": 28, @@ -763,7 +910,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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t9sNp9MpexEEQRAEQQhMW9DwPI+nnnoKGzZswPLlywEA3d3dMBgMsFqtsrwFBQXo7u4W80jFjHBeOKfGrl27YLFYxFdpael0m00QBEEQxCxEN92CO3bswPnz53H48OFYtkeVp59+Gjt37hSPHQ4HysrKyFJDEARBECmEMG7PINolLNMSNE8++STef/99HDx4ECUlJWK6zWaDx+OB3W6XWWl6enpgs9nEPMePH5fVJ8yCEvIoMRqNMBqN4rHQIWSpIQiCIIjUY2BgABaLJaZ1RiVoGGP43ve+h7fffhv79+9HZWWl7HxNTQ30ej327duHbdu2AQAuX76MtrY21NXVAQDq6urwd3/3d+jt7UV+fj4AYO/evTCbzVi2bFlE7SgqKsLFixexbNkytLe3U2DwDHA6nSgtLaV+jAHUl7GB+jF2UF/GBurH2CF4WITY21gSlaDZsWMHXnvtNfzud79DVlaWGPNisVhgMplgsVjwxBNPYOfOncjOzobZbMb3vvc91NXVYf369QCAe+65B8uWLcPXv/51/MM//AO6u7vxV3/1V9ixY4fMCjMZGo0GxcXFAACz2UxfsBhA/Rg7qC9jA/Vj7KC+jA3Uj7FDo4n9ur5RCZrnn38eAHDnnXfK0l966SV84xvfAAD80z/9EzQaDbZt2wa3243NmzfjX/7lX8S8Wq0W77//Pr773e+irq4OGRkZePzxx/GTn/xkZndCEARBEMScJWqX01SkpaXhueeew3PPPRc2T3l5OT744INoLk0QBEEQBBGWlN3LyWg04plnnonYTUWoQ/0YO6gvYwP1Y+ygvowN1I+xI559OaOVggmCIAiCIG4GUtZCQxAEQRAEIUCChiAIgiCIlIcEDUEQBEEQKQ8JGoIgCIIgUp6UFDTPPfccKioqkJaWhtra2pCtFOY6Bw8exAMPPICioiJwHId33nlHdp4xhh//+McoLCyEyWRCfX09rly5IsszODiI7du3w2w2w2q14oknnoDL5UrgXSSfXbt24dZbb0VWVhby8/Px0EMP4fLly7I84+Pj2LFjB3JycpCZmYlt27aJW3kItLW14b777kN6ejry8/PxZ3/2Z/D5fIm8laTz/PPPY+XKleLCZHV1ddi9e7d4nvpxevz93/89OI7DU089JaZRX0bG3/zN34DjONmrqqpKPE/9GDkdHR342te+hpycHJhM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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] @@ -794,7 +941,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] @@ -825,11 +972,155 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "graphviz is not installed. Visualizing the AST is not available\n" - ] + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"684pt\" height=\"391pt\"\n", + " viewBox=\"0.00 0.00 684.00 390.75\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1.22 1.22) rotate(0) translate(4 472)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-472 829.23,-472 829.23,4 -4,4\"/>\n", + "<!-- 139920670537616 -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>139920670537616</title>\n", + "<ellipse fill=\"#a056db\" stroke=\"black\" cx=\"263.84\" cy=\"-450\" rx=\"134.58\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"263.84\" y=\"-446.3\" font-family=\"Times,serif\" font-size=\"14.00\">Func: kernel (dst,img,w_2)</text>\n", + "</g>\n", + "<!-- 139920670664720 -->\n", + "<g id=\"node11\" class=\"node\">\n", + "<title>139920670664720</title>\n", + "<ellipse fill=\"#dbc256\" stroke=\"black\" cx=\"263.84\" cy=\"-378\" rx=\"36.29\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"263.84\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\">Block</text>\n", + "</g>\n", + "<!-- 139920670537616->139920670664720 -->\n", + "<g id=\"edge10\" class=\"edge\">\n", + "<title>139920670537616->139920670664720</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M263.84,-431.7C263.84,-423.98 263.84,-414.71 263.84,-406.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"267.34,-406.1 263.84,-396.1 260.34,-406.1 267.34,-406.1\"/>\n", + "</g>\n", + "<!-- 139920666169168 -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>139920666169168</title>\n", + "<ellipse fill=\"#56db7f\" stroke=\"black\" cx=\"175.84\" cy=\"-306\" rx=\"73.39\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"175.84\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">_data_img_22</text>\n", + "</g>\n", + "<!-- 139920670656400 -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>139920670656400</title>\n", + "<ellipse fill=\"#3498db\" stroke=\"black\" cx=\"352.84\" cy=\"-306\" rx=\"85.59\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"352.84\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">Loop over dim 0</text>\n", + "</g>\n", + "<!-- 139920657663504 -->\n", + "<g id=\"node10\" class=\"node\">\n", + "<title>139920657663504</title>\n", + "<ellipse fill=\"#dbc256\" stroke=\"black\" cx=\"352.84\" cy=\"-234\" rx=\"36.29\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"352.84\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">Block</text>\n", + "</g>\n", + "<!-- 139920670656400->139920657663504 -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>139920670656400->139920657663504</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M352.84,-287.7C352.84,-279.98 352.84,-270.71 352.84,-262.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"356.34,-262.1 352.84,-252.1 349.34,-262.1 356.34,-262.1\"/>\n", + "</g>\n", + "<!-- 139920670665808 -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>139920670665808</title>\n", + "<ellipse fill=\"#56db7f\" stroke=\"black\" cx=\"70.84\" cy=\"-162\" rx=\"70.69\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"70.84\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">_data_dst_00</text>\n", + "</g>\n", + "<!-- 139920670698640 -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>139920670698640</title>\n", + "<ellipse fill=\"#56db7f\" stroke=\"black\" cx=\"249.84\" cy=\"-162\" rx=\"89.88\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"249.84\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">_data_img_22_01</text>\n", + "</g>\n", + "<!-- 139920661915920 -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>139920661915920</title>\n", + "<ellipse fill=\"#56db7f\" stroke=\"black\" cx=\"455.84\" cy=\"-162\" rx=\"98.58\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"455.84\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">_data_img_22_0m1</text>\n", + "</g>\n", + "<!-- 139920657676048 -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>139920657676048</title>\n", + "<ellipse fill=\"#3498db\" stroke=\"black\" cx=\"658.84\" cy=\"-162\" rx=\"85.59\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"658.84\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">Loop over dim 1</text>\n", + "</g>\n", + "<!-- 139920657567760 -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>139920657567760</title>\n", + "<ellipse fill=\"#dbc256\" stroke=\"black\" cx=\"658.84\" cy=\"-90\" rx=\"36.29\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"658.84\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">Block</text>\n", + "</g>\n", + "<!-- 139920657676048->139920657567760 -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>139920657676048->139920657567760</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M658.84,-143.7C658.84,-135.98 658.84,-126.71 658.84,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"662.34,-118.1 658.84,-108.1 655.34,-118.1 662.34,-118.1\"/>\n", + "</g>\n", + "<!-- 139920662243472 -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>139920662243472</title>\n", + "<ellipse fill=\"#56db7f\" stroke=\"black\" cx=\"658.84\" cy=\"-18\" rx=\"166.27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"658.84\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">_data_dst_00[_stride_dst_1*ctr_1]</text>\n", + "</g>\n", + "<!-- 139920657567760->139920662243472 -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>139920657567760->139920662243472</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M658.84,-71.7C658.84,-63.98 658.84,-54.71 658.84,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"662.34,-46.1 658.84,-36.1 655.34,-46.1 662.34,-46.1\"/>\n", + "</g>\n", + "<!-- 139920657663504->139920670665808 -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>139920657663504->139920670665808</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M321.04,-225.11C274.68,-213.6 187.72,-192.01 129.54,-177.57\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"130.29,-174.15 119.74,-175.14 128.61,-180.94 130.29,-174.15\"/>\n", + "</g>\n", + "<!-- 139920657663504->139920670698640 -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>139920657663504->139920670698640</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M332,-218.83C317.82,-209.19 298.75,-196.24 282.56,-185.23\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"284.15,-182.08 273.91,-179.35 280.21,-187.87 284.15,-182.08\"/>\n", + "</g>\n", + "<!-- 139920657663504->139920661915920 -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>139920657663504->139920661915920</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M373.69,-218.83C387.77,-209.26 406.67,-196.42 422.79,-185.46\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"425.11,-188.12 431.41,-179.61 421.17,-182.33 425.11,-188.12\"/>\n", + "</g>\n", + "<!-- 139920657663504->139920657676048 -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>139920657663504->139920657676048</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M385.3,-225.58C434.58,-214.3 529.28,-192.64 593.27,-178\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"594.3,-181.35 603.27,-175.71 592.74,-174.53 594.3,-181.35\"/>\n", + "</g>\n", + "<!-- 139920670664720->139920666169168 -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>139920670664720->139920666169168</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M245.18,-362.15C233.32,-352.72 217.72,-340.31 204.33,-329.66\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"206.33,-326.78 196.32,-323.29 201.97,-332.25 206.33,-326.78\"/>\n", + "</g>\n", + "<!-- 139920670664720->139920670656400 -->\n", + "<g id=\"edge9\" class=\"edge\">\n", + "<title>139920670664720->139920670656400</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M282.72,-362.15C294.63,-352.78 310.27,-340.49 323.75,-329.88\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"326.12,-332.47 331.82,-323.54 321.79,-326.97 326.12,-332.47\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.sources.Source at 0x7f4230138790>" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -936,20 +1227,20 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">_stride_img_2</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">])</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]);</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">_stride_img_2</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">])</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]);</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ @@ -1077,24 +1368,24 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_img_2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", "<span class=\"w\"> </span><span class=\"cp\">#pragma omp parallel num_threads(2)</span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">_stride_img_2</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_img</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">_stride_img_2</span><span class=\"p\">;</span>\n", "<span class=\"w\"> </span><span class=\"cp\">#pragma omp for schedule(static)</span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">])</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]);</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_img_22_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_img_22</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">])</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">w_2</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.5</span><span class=\"o\">*</span><span class=\"n\">_data_img_22_01</span><span class=\"p\">[</span><span class=\"n\">_stride_img_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_img_1</span><span class=\"p\">]);</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ @@ -1231,20 +1522,20 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">202</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">601</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">600</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">];</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">202</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">601</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I_21</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">600</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_0m1</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_I_21_01</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">];</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ @@ -1292,7 +1583,7 @@ "source": [ "### Running on GPU\n", "\n", - "If you have a CUDA enabled graphics card and [pycuda](https://mathema.tician.de/software/pycuda/) installed, *pystencils* can run your kernel on the GPU as well. You can find more details about this in the GPU tutorial." + "If you have a GPU and [cupy](https://cupy.dev/) installed, *pystencils* can run your kernel on the GPU as well. You can find more details about this in the GPU tutorial." ] }, { @@ -1388,19 +1679,19 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"nf\">__launch_bounds__</span><span class=\"p\">(</span><span class=\"mi\">256</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">202</span><span class=\"w\"> </span><span class=\"o\">&&</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">600</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_10</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_11_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">5</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_1m1_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_10_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_10</span><span class=\"p\">[</span><span class=\"mi\">601</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_11_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_11_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_1m1_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_10_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_10_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_I_1m1_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">];</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"nf\">__launch_bounds__</span><span class=\"p\">(</span><span class=\"mi\">256</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">202</span><span class=\"w\"> </span><span class=\"o\">&&</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">600</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_10</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_11_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">5</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_1m1_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_I_10_21</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_I</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_10</span><span class=\"p\">[</span><span class=\"mi\">601</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_11_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_11_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_1m1_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_10_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">_data_I_10_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_data_I_1m1_21</span><span class=\"p\">[</span><span class=\"mi\">2404</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2404</span><span class=\"p\">];</span>\n", "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"> </span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ @@ -1425,8 +1716,8 @@ ], "source": [ "try:\n", - " import pycuda\n", - " from pystencils.gpucuda import BlockIndexing\n", + " import cupy\n", + " from pystencils.gpu import BlockIndexing\n", "\n", " gpu_ast = create_kernel(update_rule, target=ps.Target.GPU,\n", " gpu_indexing=BlockIndexing,\n", @@ -1434,7 +1725,7 @@ "\n", " ps.show_code(gpu_ast)\n", "except ImportError:\n", - " print(\"Please install pycuda for GPU support\")" + " print(\"Please install cupy for GPU support\")" ] } ], @@ -1455,7 +1746,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.11.0rc1" } }, "nbformat": 4, diff --git a/doc/notebooks/03_tutorial_datahandling.ipynb b/doc/notebooks/03_tutorial_datahandling.ipynb index da01623927e6d2b97a4834aa067d040caa6a27f8..05b489133ba87e8a74091ef1121ac456498f0e5e 100644 --- a/doc/notebooks/03_tutorial_datahandling.ipynb +++ b/doc/notebooks/03_tutorial_datahandling.ipynb @@ -21,33 +21,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Test to see if pycuda is installed which is needed to run calculations on the GPU" + "Test to see if cupy is installed which is needed to run calculations on the GPU" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No pycuda installed\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", - " import pycuda\n", + " import cupy\n", " gpu = True\n", "except ImportError:\n", " gpu = False\n", - " pycuda = None\n", - " print('No pycuda installed')\n", - " \n", - "if pycuda:\n", - " import pycuda.gpuarray as gpuarray" + " cupy = None\n", + " print('No cupy installed')" ] }, { @@ -138,22 +127,22 @@ "span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", ".highlight .hll { background-color: #ffffcc }\n", ".highlight { background: #f8f8f8; }\n", - ".highlight .c { color: #408080; font-style: italic } /* Comment */\n", + ".highlight .c { color: #3D7B7B; font-style: italic } /* Comment */\n", ".highlight .err { border: 1px solid #FF0000 } /* Error */\n", ".highlight .k { color: #008000; font-weight: bold } /* Keyword */\n", ".highlight .o { color: #666666 } /* Operator */\n", - ".highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".highlight .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".highlight .cs { color: #408080; font-style: italic } /* Comment.Special */\n", + ".highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", + ".highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", + ".highlight .cp { color: #9C6500 } /* Comment.Preproc */\n", + ".highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", + ".highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", + ".highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", ".highlight .gd { color: #A00000 } /* Generic.Deleted */\n", ".highlight .ge { font-style: italic } /* Generic.Emph */\n", - ".highlight .gr { color: #FF0000 } /* Generic.Error */\n", + ".highlight .gr { color: #E40000 } /* Generic.Error */\n", ".highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".highlight .gi { color: #00A000 } /* Generic.Inserted */\n", - ".highlight .go { color: #888888 } /* Generic.Output */\n", + ".highlight .gi { color: #008400 } /* Generic.Inserted */\n", + ".highlight .go { color: #717171 } /* Generic.Output */\n", ".highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", ".highlight .gs { font-weight: bold } /* Generic.Strong */\n", ".highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", @@ -166,15 +155,15 @@ ".highlight .kt { color: #B00040 } /* Keyword.Type */\n", ".highlight .m { color: #666666 } /* Literal.Number */\n", ".highlight .s { color: #BA2121 } /* Literal.String */\n", - ".highlight .na { color: #7D9029 } /* Name.Attribute */\n", + ".highlight .na { color: #687822 } /* Name.Attribute */\n", ".highlight .nb { color: #008000 } /* Name.Builtin */\n", ".highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", ".highlight .no { color: #880000 } /* Name.Constant */\n", ".highlight .nd { color: #AA22FF } /* Name.Decorator */\n", - ".highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", + ".highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */\n", + ".highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", ".highlight .nf { color: #0000FF } /* Name.Function */\n", - ".highlight .nl { color: #A0A000 } /* Name.Label */\n", + ".highlight .nl { color: #767600 } /* Name.Label */\n", ".highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", ".highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", ".highlight .nv { color: #19177C } /* Name.Variable */\n", @@ -191,11 +180,11 @@ ".highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", ".highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", + ".highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", ".highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", + ".highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", ".highlight .sx { color: #008000 } /* Literal.String.Other */\n", - ".highlight .sr { color: #BB6688 } /* Literal.String.Regex */\n", + ".highlight .sr { color: #A45A77 } /* Literal.String.Regex */\n", ".highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n", ".highlight .ss { color: #19177C } /* Literal.String.Symbol */\n", ".highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", @@ -216,28 +205,28 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_01</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_dst_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_src_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"n\">_size_dst_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">_stride_dst_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">_stride_src_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_01</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_0m1</span><span class=\"p\">[</span><span class=\"n\">_stride_src_1</span><span class=\"o\">*</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ - "FUNC_PREFIX void kernel(double * RESTRICT _data_dst, double * RESTRICT const _data_src, int64_t const _size_dst_0, int64_t const _size_dst_1, int64_t const _stride_dst_0, int64_t const _stride_dst_1, int64_t const _stride_src_0, int64_t const _stride_src_1)\n", + "FUNC_PREFIX void kernel(double * RESTRICT _data_dst, double * RESTRICT const _data_src, int64_t const _size_dst_0, int64_t const _size_dst_1, int64_t const _stride_dst_0, int64_t const _stride_dst_1, int64_t const _stride_src_0, int64_t const _stride_src_1)\n", "{\n", " for (int64_t ctr_0 = 1; ctr_0 < _size_dst_0 - 1; ctr_0 += 1)\n", " {\n", - " double * RESTRICT _data_dst_00 = _data_dst + _stride_dst_0*ctr_0;\n", + " double * RESTRICT _data_dst_00 = _data_dst + _stride_dst_0*ctr_0;\n", " double * RESTRICT _data_src_01 = _data_src + _stride_src_0*ctr_0 + _stride_src_0;\n", " double * RESTRICT _data_src_00 = _data_src + _stride_src_0*ctr_0;\n", " double * RESTRICT _data_src_0m1 = _data_src + _stride_src_0*ctr_0 - _stride_src_0;\n", @@ -321,22 +310,22 @@ "span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", ".highlight .hll { background-color: #ffffcc }\n", ".highlight { background: #f8f8f8; }\n", - ".highlight .c { color: #408080; font-style: italic } /* Comment */\n", + ".highlight .c { color: #3D7B7B; font-style: italic } /* Comment */\n", ".highlight .err { border: 1px solid #FF0000 } /* Error */\n", ".highlight .k { color: #008000; font-weight: bold } /* Keyword */\n", ".highlight .o { color: #666666 } /* Operator */\n", - ".highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".highlight .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".highlight .cs { color: #408080; font-style: italic } /* Comment.Special */\n", + ".highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", + ".highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", + ".highlight .cp { color: #9C6500 } /* Comment.Preproc */\n", + ".highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", + ".highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", + ".highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", ".highlight .gd { color: #A00000 } /* Generic.Deleted */\n", ".highlight .ge { font-style: italic } /* Generic.Emph */\n", - ".highlight .gr { color: #FF0000 } /* Generic.Error */\n", + ".highlight .gr { color: #E40000 } /* Generic.Error */\n", ".highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".highlight .gi { color: #00A000 } /* Generic.Inserted */\n", - ".highlight .go { color: #888888 } /* Generic.Output */\n", + ".highlight .gi { color: #008400 } /* Generic.Inserted */\n", + ".highlight .go { color: #717171 } /* Generic.Output */\n", ".highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", ".highlight .gs { font-weight: bold } /* Generic.Strong */\n", ".highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", @@ -349,15 +338,15 @@ ".highlight .kt { color: #B00040 } /* Keyword.Type */\n", ".highlight .m { color: #666666 } /* Literal.Number */\n", ".highlight .s { color: #BA2121 } /* Literal.String */\n", - ".highlight .na { color: #7D9029 } /* Name.Attribute */\n", + ".highlight .na { color: #687822 } /* Name.Attribute */\n", ".highlight .nb { color: #008000 } /* Name.Builtin */\n", ".highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", ".highlight .no { color: #880000 } /* Name.Constant */\n", ".highlight .nd { color: #AA22FF } /* Name.Decorator */\n", - ".highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", + ".highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */\n", + ".highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", ".highlight .nf { color: #0000FF } /* Name.Function */\n", - ".highlight .nl { color: #A0A000 } /* Name.Label */\n", + ".highlight .nl { color: #767600 } /* Name.Label */\n", ".highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", ".highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", ".highlight .nv { color: #19177C } /* Name.Variable */\n", @@ -374,11 +363,11 @@ ".highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", ".highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", + ".highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", ".highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", + ".highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", ".highlight .sx { color: #008000 } /* Literal.String.Other */\n", - ".highlight .sr { color: #BB6688 } /* Literal.String.Regex */\n", + ".highlight .sr { color: #A45A77 } /* Literal.String.Regex */\n", ".highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n", ".highlight .ss { color: #19177C } /* Literal.String.Symbol */\n", ".highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", @@ -399,28 +388,28 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">29</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"p\">;</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">29</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_01</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_0m1</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", - "<span class=\"p\">}</span><span class=\"w\"></span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"p\">)</span>\n", + "<span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">29</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_dst</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_src_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_src</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">30</span><span class=\"p\">;</span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">29</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_dst_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_01</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_src_0m1</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span>\n", + "<span class=\"p\">}</span>\n", "</pre></div>\n" ], "text/plain": [ - "FUNC_PREFIX void kernel(double * RESTRICT _data_dst, double * RESTRICT const _data_src)\n", + "FUNC_PREFIX void kernel(double * RESTRICT _data_dst, double * RESTRICT const _data_src)\n", "{\n", " for (int64_t ctr_0 = 1; ctr_0 < 29; ctr_0 += 1)\n", " {\n", - " double * RESTRICT _data_dst_00 = _data_dst + 30*ctr_0;\n", + " double * RESTRICT _data_dst_00 = _data_dst + 30*ctr_0;\n", " double * RESTRICT _data_src_01 = _data_src + 30*ctr_0 + 30;\n", " double * RESTRICT _data_src_00 = _data_src + 30*ctr_0;\n", " double * RESTRICT _data_src_0m1 = _data_src + 30*ctr_0 - 30;\n", @@ -477,7 +466,7 @@ "### 1.2. GPU simulations\n", "\n", "Let's now jump to a seemingly unrelated topic: running kernels on the GPU. \n", - "When creating the kernel, an additional parameter `target=ps.Target.GPU` has to be passed. Also, the compiled kernel cannot be called with numpy arrays directly, but has to be called with `pycuda.gpuarray`s instead. That means, we have to transfer our numpy array to GPU first. From this step we obtain a gpuarray, then we can run the kernel, hopefully multiple times so that the data transfer was worth the time. Finally we transfer the finished result back to CPU:" + "When creating the kernel, an additional parameter `target=ps.Target.GPU` has to be passed. Also, the compiled kernel cannot be called with numpy arrays directly, but has to be called with `cupy.array`s instead. That means, we have to transfer our numpy array to GPU first. From this step we obtain a gpuarray, then we can run the kernel, hopefully multiple times so that the data transfer was worth the time. Finally we transfer the finished result back to CPU:" ] }, { @@ -486,18 +475,18 @@ "metadata": {}, "outputs": [], "source": [ - "if pycuda:\n", + "if cupy:\n", " config = ps.CreateKernelConfig(target=ps.Target.GPU)\n", " kernel_function_gpu = ps.create_kernel(update_rule, config=config).compile()\n", " # transfer to GPU\n", - " src_arr_gpu = pycuda.gpuarray.to_gpu(src_arr)\n", - " dst_arr_gpu = pycuda.gpuarray.to_gpu(dst_arr)\n", + " src_arr_gpu = cupy.asarray(src_arr)\n", + " dst_arr_gpu = cupy.asarray(dst_arr)\n", " \n", " # run kernel on GPU, this is done many times in real setups\n", " kernel_function_gpu(src=src_arr_gpu, dst=dst_arr_gpu)\n", " \n", " # transfer result back to CPU\n", - " dst_arr_gpu.get(dst_arr)" + " dst_arr = dst_arr_gpu.get()" ] }, { @@ -516,7 +505,7 @@ "\n", "- symbolic pystencils field\n", "- numpy array on CPU \n", - "- for GPU run also a pycuda.gpuarray to mirror the data on the GPU\n", + "- for GPU use also cupy to mirror the data on the GPU\n", "\n", "Managing these three objects manually is tedious and error-prone. We'll see in the next section how the data handling object takes care of this problem." ] @@ -768,14 +757,12 @@ "outputs": [ { "data": { - "image/png": "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J1c9GABwfHYzAJtqmUtkH5TkLVV15/Gv7e53rnQqAOBk7GYANtIpA7O7P5Pk4nMwCwCwBLsZgE3l25QAAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAwQmACAAAw4sC6B2DGu265dt0jwM572kMuWfcIsJPsMIDd4RlMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARiwdmFV1XlX9YVW9bZUDAQDLsZsB2DSn8wzmC5Ncv6pBAIDTZjcDsFGWCsyqujDJ05O8YrXjAADLsJsB2ETLPoP5siQvTvKNEx1QVVdU1eGqOnz06NGJ2QCAE3tZ7GYANswpA7OqnpHk1u4+crLjuvvK7j7U3Yf29vbGBgQAvpndDMCmWuYZzEuTPLOqbkzy+iSXVdXvrnQqAOBk7GYANtIpA7O7f6m7L+zug0mem+S93f3jK58MADguuxmATeX7YAIAADDiwOkc3N3XJLlmJZMAAKfNbgZgk3gGEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBECEwAAgBGnDMyquldVfaSqPl5V11XVL5+LwQCA47ObAdhUB5Y45mtJLuvur1bV+Uk+UFX/ubs/tOLZAIDjs5sB2EinDMzu7iRfXXx4/uKtVzkUAHBidjMAm2qp12BW1XlVdW2SW5Nc3d0fXulUAMBJ2c0AbKKlArO77+juS5JcmOQJVfU9dz2mqq6oqsNVdfjo0aPDYwIAx7KbAdhEp3UX2e6+Lck1SS4/zs9d2d2HuvvQ3t7ezHQAwEnZzQBskmXuIrtXVfdfvH/vJE9O8qkVzwUAnIDdDMCmWuYusg9O8uqqOi/7QfqG7n7bascCAE7CbgZgIy1zF9lPJHncOZgFAFiC3QzApjqt12ACAADAiQhMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARghMAAAARpwyMKvqoVX1vqq6vqquq6oXnovBAIDjs5sB2FQHljjm9iQv6u6PVdX9khypqqu7+49WPBsAcHx2MwAb6ZTPYHb3n3X3xxbvfyXJ9UkuWPVgAMDx2c0AbKrTeg1mVR1M8rgkH17JNADAabGbAdgkSwdmVd03yZuS/Hx3f/k4P39FVR2uqsNHjx6dnBEAOA67GYBNs1RgVtX52V9gr+nuNx/vmO6+srsPdfehvb29yRkBgLuwmwHYRMvcRbaS/HaS67v7pasfCQA4GbsZgE21zDOYlyZ5fpLLquraxdsPrXguAODE7GYANtIpv01Jd38gSZ2DWQCAJdjNAGyq07qLLAAAAJyIwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCEwAQAAGCE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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABP4AAAIQCAYAAAARnqAIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqsUlEQVR4nO3de3DV9Zn48SfhElBJACUgEkC8oSJoQSmiq1SUoepWO16G0RbZ6rAWrBbdKp2pyDo1dnbq6LQsgnaJ7cZFacXa7ipSFeyuWgSXXbXVQpdWqghqaxLSNmpyfn/sz7NNuZ1vSHKSD6/XzJnxfHMuT77j1KfvnEtJLpfLBQAAAACQlNJiDwAAAAAAtD/hDwAAAAASJPwBAAAAQIKEPwAAAABIkPAHAAAAAAkS/gAAAAAgQcIfAAAAACRI+AMAAACABAl/AAAAAJAg4Q9Iwj/8wz/EqFGjokePHnHyyScXexwAABL3ve99L0aPHh29evWK/v37F3scgN0S/oBOVVNTEyUlJa0ulZWVMWXKlHj88cfb9JhPPvlkfOUrX4nJkyfHsmXL4o477mjnqQEAOND84z/+Y5SUlMTEiRN3+dlrr70WV111VRx11FFx3333xdKlS+MPf/hD3HbbbbFmzZrOHxZgD3oWewDgwPT3f//3ceSRR0Yul4vt27dHTU1NfPrTn44f/ehHccEFF2R6rKeffjpKS0vjO9/5TvTu3buDJgYA4EBSW1sbI0eOjHXr1sXmzZvj6KOPzv9szZo10dLSEvfcc0/++LvvvhsLFy6MiIizzz67GCMD7MIr/oCimD59elx55ZXxuc99Lm666ab46U9/Gr169Yp/+Zd/yfxYO3bsiL59+7Zb9MvlcvHHP/6xXR4LAIDuZ8uWLfHcc8/FXXfdFYMGDYra2tpWP9+xY0dERKe8xbexsbHDnwNIl/AHdAn9+/ePvn37Rs+e//dC5JaWlrj77rvjxBNPjD59+sTgwYNj9uzZ8fvf/z5/m5KSkli2bFk0Njbm3zpcU1MTEREfffRR3H777XHUUUdFWVlZjBw5Mr761a9GU1NTq+ceOXJkXHDBBbFq1aqYMGFC9O3bN5YsWRIREe+//37ccMMNUVVVFWVlZXH00UfHN77xjWhpaen4kwIAQFHU1tbGgAED4vzzz49LLrmkVfgbOXJkLFiwICIiBg0aFCUlJXHVVVfFoEGDIiJi4cKF+b30tttuy9/vtddei0suuSQGDhwYffr0iQkTJsRjjz3W6nk//lictWvXxhe/+MWorKyMYcOGdfwvDCTLW32Boqirq4t33303crlc7NixI771rW/Fzp0748orr8zfZvbs2VFTUxOzZs2KL33pS7Fly5b49re/Hf/5n/8Z//Ef/xG9evWK733ve7F06dJYt25d3H///RERcfrpp0dExNVXXx0PPPBAXHLJJXHjjTfGz372s6iuro5f/OIXsXLlylbzvP766zFjxoyYPXt2XHPNNXHcccfFH/7whzjrrLPizTffjNmzZ8fw4cPjueeei/nz58e2bdvi7rvv7rTzBQBA56mtrY3Pfvaz0bt375gxY0YsXrw4XnzxxTj11FPj7rvvju9+97uxcuXKWLx4cRxyyCFx0kknxSc/+cm49tpr4+KLL47PfvazERExduzYiIh49dVXY/LkyXHEEUfELbfcEgcffHA8/PDDcdFFF8UPfvCDuPjii1s9/xe/+MUYNGhQ3HrrrV7xB+yfHEAnWrZsWS4idrmUlZXlampq8rf76U9/mouIXG1tbav7P/HEE7scnzlzZu7ggw9udbuNGzfmIiJ39dVXtzp+00035SIi9/TTT+ePjRgxIhcRuSeeeKLVbW+//fbcwQcfnPvlL3/Z6vgtt9yS69GjR+6NN95o20kAAKDLWr9+fS4icqtXr87lcrlcS0tLbtiwYbnrr78+f5sFCxbkIiL3zjvv5I+98847uYjILViwYJfHPOecc3InnXRS7k9/+lP+WEtLS+7000/PHXPMMfljH+/KZ5xxRu6jjz5q/18OOOB4qy9QFIsWLYrVq1fH6tWr45//+Z9jypQpcfXVV8cjjzwSERErVqyIioqKOPfcc+Pdd9/NX8aPHx+HHHJIPPPMM3t9/H/7t3+LiIh58+a1On7jjTdGRMS//uu/tjp+5JFHxrRp01odW7FiRZx55pkxYMCAVjNMnTo1mpub49lnn92vcwAAQNdTW1sbgwcPjilTpkTE/360zOWXXx7Lly+P5ubmzI/3u9/9Lp5++um47LLLoqGhIb9TvvfeezFt2rTYtGlTvPnmm63uc80110SPHj3a5fcBDmze6gsUxWmnnRYTJkzIX58xY0accsopMXfu3Ljgggti06ZNUVdXF5WVlbu9/8cfqLwnv/nNb6K0tLTVt69FRAwZMiT69+8fv/nNb1odP/LII3d5jE2bNsV///d/5z+vJesMAAB0L83NzbF8+fKYMmVKbNmyJX984sSJ8c1vfjOeeuqpOO+88zI95ubNmyOXy8XXvva1+NrXvrbb2+zYsSOOOOKI/PXd7aYAbSH8AV1CaWlpTJkyJe65557YtGlTtLS0RGVl5S7foPaxPcW4v1RSUlLQ7fr27bvLsZaWljj33HPjK1/5ym7vc+yxxxb02AAAdA9PP/10bNu2LZYvXx7Lly/f5ee1tbWZw9/HXwp300037fIOk4/95R+rd7ebArSF8Ad0GR999FFEROzcuTOOOuqo+MlPfhKTJ09u0+IzYsSIaGlpiU2bNsXxxx+fP759+/Z4//33Y8SIEft8jKOOOip27twZU6dOzfz8AAB0P7W1tVFZWRmLFi3a5WePPPJIrFy5Mu69997d3ndPf3AeNWpURET06tXLXgl0Op/xB3QJH374YTz55JPRu3fvOP744+Oyyy6L5ubmuP3223e57UcffRTvv//+Xh/v05/+dETELt+8e9ddd0VExPnnn7/PmS677LJ4/vnnY9WqVbv87P3338+HSgAAur8//vGP8cgjj8QFF1wQl1xyyS6XuXPnRkNDQzz22GO7vf9BBx0UEbHLnlpZWRlnn312LFmyJLZt27bL/d555512/10APuYVf0BRPP744/Haa69FxP9+psmDDz4YmzZtiltuuSXKy8vjrLPOitmzZ0d1dXVs3LgxzjvvvOjVq1ds2rQpVqxYEffcc09ccskle3z8cePGxcyZM2Pp0qXx/vvvx1lnnRXr1q2LBx54IC666KL8hzXvzd/93d/FY489FhdccEFcddVVMX78+GhsbIyXX345vv/978evf/3rOOyww9rtnAAAUDyPPfZYNDQ0xF//9V/v9uef/OQnY9CgQVFbWxuf+MQndvl5375944QTToiHHnoojj322Bg4cGCMGTMmxowZE4sWLYozzjgjTjrppLjmmmti1KhRsX379nj++efjt7/9bfzXf/1XR/96wAFK+AOK4tZbb83/c58+fWL06NGxePHimD17dv74vffeG+PHj48lS5bEV7/61ejZs2eMHDkyrrzyypg8efI+n+P++++PUaNGRU1NTaxcuTKGDBkS8+fPjwULFhQ040EHHRRr166NO+64I1asWBHf/e53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", "text/plain": [ - "<Figure size 1152x432 with 2 Axes>" + "<Figure size 1600x600 with 2 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -826,7 +813,61 @@ "name": "stdout", "output_type": "stream", "text": [ - "(-1, -1) (32, 32)\n" + "(-1, -1) (32, 32)\n", + "[0][PROGRESS]------(0.000 sec) Initializing SetupBlockForest:\n", + "[0] - AABB: [ <0,0,0>, <30,30,1> ]\n", + "[0] - forest size (root blocks / blocks on the initial grid): 1 x 1 x 1\n", + "[0] - periodicity: false x false x false\n", + "[0][PROGRESS]------(0.000 sec) Initializing SetupBlockForest: Allocating root blocks ...\n", + "[0][PROGRESS]------(0.000 sec) Initializing SetupBlockForest: Setting up neighborhood information for each block (with respect to periodicity) ...\n", + "[0][PROGRESS]------(0.000 sec) Initializing SetupBlockForest: Assigning workload, memory requirements, and SUIDs to blocks ...\n", + "[0][PROGRESS]------(0.000 sec) Initializing SetupBlockForest: finished!\n", + "[0] The following block structure has been created:\n", + "[0] - AABB: [ <0,0,0>, <30,30,1> ]\n", + "[0] - initial decomposition: 1 x 1 x 1 (= forest size)\n", + "[0] - periodicity: false x false x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 1 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 1\n", + "[0] - blocks have not yet been distributed to processes\n", + "[0][PROGRESS]------(0.000 sec) Balancing SetupBlockForest: Creating a process distribution for 1 process(es) ...\n", + "[0][PROGRESS]------(0.000 sec) Balancing SetupBlockForest: process distribution to 1 process(es) finished!\n", + "[0] - number of worker processes: 1\n", + "[0] - number of empty buffer processes: 0\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] The resulting block structure looks like as follows:\n", + "[0] - AABB: [ <0,0,0>, <30,30,1> ]\n", + "[0] - initial decomposition: 1 x 1 x 1 (= forest size)\n", + "[0] - periodicity: false x false x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 1 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 1\n", + "[0] - number of processes: 1 (1 worker process(es) / 0 empty buffer process(es))\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] - process ID bytes: 0\n", + "[0] - blocks/memory/workload per process:\n", + "[0] + blocks:\n", + "[0] - min = 1\n", + "[0] - max = 1\n", + "[0] - avg = 1\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + memory:\n", + "[0] - min = 1\n", + "[0] - max = 1\n", + "[0] - avg = 1\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + workload:\n", + "[0] - min = 1\n", + "[0] - max = 1\n", + "[0] - avg = 1\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0][PROGRESS]------(0.000 sec) Adding block data (\"cell bounding box\")\n", + "[0][PROGRESS]------(0.000 sec) Adding block data (\"field\")\n" ] } ], @@ -858,10 +899,64 @@ "name": "stdout", "output_type": "stream", "text": [ - "(-1, -1, -1) (22, 12, 22)\n", + "(-1, -1, -1)[0][PROGRESS]------(0.025 sec) Initializing SetupBlockForest:\n", + "[0] - AABB: [ <0,0,0>, <40,10,40> ]\n", + "[0] - forest size (root blocks / blocks on the initial grid): 2 x 1 x 2\n", + "[0] - periodicity: true x false x false\n", + " (22, 12, 22)\n", "(19, -1, -1) (22, 12, 22)\n", "(-1, -1, 19) (22, 12, 22)\n", - "(19, -1, 19) (22, 12, 22)\n" + "(19, -1, 19) (22, 12, 22)\n", + "[0][PROGRESS]------(0.025 sec) Initializing SetupBlockForest: Allocating root blocks ...\n", + "[0][PROGRESS]------(0.025 sec) Initializing SetupBlockForest: Setting up neighborhood information for each block (with respect to periodicity) ...\n", + "[0][PROGRESS]------(0.025 sec) Initializing SetupBlockForest: Assigning workload, memory requirements, and SUIDs to blocks ...\n", + "[0][PROGRESS]------(0.025 sec) Initializing SetupBlockForest: finished!\n", + "[0] The following block structure has been created:\n", + "[0] - AABB: [ <0,0,0>, <40,10,40> ]\n", + "[0] - initial decomposition: 2 x 1 x 2 (= forest size)\n", + "[0] - periodicity: true x false x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 3 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 4\n", + "[0] - blocks have not yet been distributed to processes\n", + "[0][PROGRESS]------(0.025 sec) Balancing SetupBlockForest: Creating a process distribution for 1 process(es) ...\n", + "[0][PROGRESS]------(0.025 sec) Balancing SetupBlockForest: process distribution to 1 process(es) finished!\n", + "[0] - number of worker processes: 1\n", + "[0] - number of empty buffer processes: 0\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] The resulting block structure looks like as follows:\n", + "[0] - AABB: [ <0,0,0>, <40,10,40> ]\n", + "[0] - initial decomposition: 2 x 1 x 2 (= forest size)\n", + "[0] - periodicity: true x false x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 3 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 4\n", + "[0] - number of processes: 1 (1 worker process(es) / 0 empty buffer process(es))\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] - process ID bytes: 0\n", + "[0] - blocks/memory/workload per process:\n", + "[0] + blocks:\n", + "[0] - min = 4\n", + "[0] - max = 4\n", + "[0] - avg = 4\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + memory:\n", + "[0] - min = 4\n", + "[0] - max = 4\n", + "[0] - avg = 4\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + workload:\n", + "[0] - min = 4\n", + "[0] - max = 4\n", + "[0] - avg = 4\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0][PROGRESS]------(0.025 sec) Adding block data (\"cell bounding box\")\n", + "[0][PROGRESS]------(0.026 sec) Adding block data (\"field\")\n" ] } ], @@ -892,7 +987,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAVCAYAAACuVXuDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADhUlEQVRoBe2Z7W3bMBCGHaMDGO0G6gZJs0GygeNO0HiDFv1l/yvSDdpOUCQbJBsE9Qb2BnW8gfs+jE5lJUo2bIoS0BxwOvL4dXqPR1LUYLvdDnyezWaZn39J/4tPCjxCPhgOPJrP5x+VPfVUL8luEMhyXxSjnzBDIBWMJc4lPzlFzUPlOHIqOS1Xke4m1/2WfCu+kW5Vrhcrn9tyq/7OlN6E+k1tk9mQ23YwTmpP0Gwkv9OniyhlRkp/lmx0Eg1EAPPapbyH2v5S9pE+xF+Vpq97pTOv2tFJ9TcS34q/qbMf4tr+VSeJTTUvdRROsh0McTS+eXaUJJHAizeSGuHlCkl/LSUA3lmh0sxw8jv7tTb7SPoVX4mJ6J91bVSezKayDRo7Fk5g51Yp26Mm6tyFWHlQy6ucJQ/w4TJdSbEoK5V/FF+orZsVgfI2VZ3YFBOn3Cf4ZjTUg71pn33kfd4wBO6FlOtAgfVLeWrqyqbYOIHhhIi6FD80oSgHEcrBJQxvN7XNyyp72h5tDq7SlU0t4YRvLnHUO/GyDhUNnqmMfcGio1zVnBBaEq3uPs60ujFkcptaxAnfZDgKEEPLlgHGyaNx/7KKDfJNQ1lXRbFtagsnfOMcxewLRoMcxMkpuOR56DY52WY231UpKalNLePESjYiooKUhzJH7rolz7VTuTk5tLyZrrGPoAFHKFPalAAnF0ivhAezzwD14WFv4qaCDzefTpXhigP9SpIPWzY86pfJIqrxsFJuFCmfyqa2ccI3axzFbK+ALAfwohWApX9CL8l3ihFOs+sj0yHPxAvV3ZhSaaK0yJu+BZnEJr1LKzh5eDDZV0M9FuJzr2BXEg/DBclYDhtrSb7JHClNnYn4w7PG3Seie1IZVzsxyA4EFrlFnx3aZDYcjJN1kEs32U90pc5Sxt0Zl6i1pHIOFUSefbxyPcTdHndSA0kMI6o2Yg4POP+L9EyEgpS3T4Hai9Sick1CfdhyjC2MyxisDNwtFidUpZPZpLEdacwoOHn9gdfU/YuSs5Y4LMW/FsbQWGPxKNV4+4zTU5sy2bXEfpY+iEio/LZwJe08OKQQeX2iPtrEQe3vpWy+XHCSqxwqYiOpMViOUn9XNb5GT23CF/jELeUWUbwIp7hdH7fUO5auNbjb147tKGL7PtqEL4pVrvjDy0sLQLw47iGQmPffkPDnEvxOsrgo+AP8ixo954XzTQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH4AAAAUCAYAAABLTIm0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABJ0AAASdAHeZh94AAAEGUlEQVR4nO2aW4hVVRjHf2M+aGYzYITQBdIc8UGaytAIjcys3gYUfDFNUSSrsUgiL/nvE7o8pKLdsXAshAoGDerFF0E0Lxn2pnmnCKGyMu+UTg9rrZk9e/Y+5+x9Zs526PzhsNjf3mut3/7W9Vv7NHR2dlLX/0+DigaoqxgNTjKa2WbgSeAuSRdqi1RXX8nM7gcOAAslfRy91xCf6s3sAWAfsFTS2hKFzgY+85e9Co48dzuwGngCGAGcBrYBJunPPC9USmY2E3gYaAHuAYYDWyTNLpOvppwpDGV9mpXTzLYCk4Axks4He9JU/zrwN/BBCcA7gHeB82nP+OdGA98D84D9wDrgBLAE2GNmI0rlz6mVwHO4hv+lkgwFccYZyvo0J+ebwEigLWrs0fBm1gxMA76UdCml8gZgE3AG+LDM+7wP3Aq0SWqV9IqkqR54LK6T9bVeBJqBm4FnKsxTBGeXMvg0M6ek/cBhYJGZdbV3fMTPBxqAL0pU3gZMxfW61PXf987pwCngvTiPz/uUmQ0rUVdmSdoh6aikisKVojhjKuvTKjk/B+4EHguGeMNPA64Ce1MqHwe8BayXtLP0u/CIT7dLutaDUjoH7AZuxK0/RapQzgw+rYZzt097N7zvKS3AoaSdvJkNxm08fgKWl3kfcFMPwJGU+0d92lxBWf2pwjgz+rQazu98OiUYoiP+NuAG3C4xSauAe4Gn09b/mBp9ejblfrA3VVBWf6pIziw+zc0p6SxwGTfdAz0bPuwIk0KCibgeuUbSnjKAdVWgAnz6B3BLuIg2fOhxQ6JP++noU9wU82qGikIPbEy5H+x/ZSizP1Rzzpw+rZZzKN1t3OPk7lefxmPBm+heNy6bWVKhG81sI26D8oK3/ejTtLVxjE/T1qxaqQjOPD7NzenDuCbgZLBFR/xp4De6NxFBV4BPUn4H/TO7/HV0ytrh0+nR+NGDDAceAi6SEkHUUEVw5vFpNZxjcWH6D8HQNeIldZrZTmCGmd0t6Zi3XwIWJNGb2Wu4zcnm+PGipONmth0Xez4LvBPNCgwDPopHEGbWDswF5klqT6q3L1UEZx6f5uX0CiFe6Dy9PtJ0ADOAx4FjWV4mRYuBb4ENZvYocAiYiItJjwArEvKE3vxvngrNrBVo9ZcjffqgbyiA3yUtLZozp/JwgussV4GvgiF+gNOBW+vn9AWlpOPABKDdA74EjAbWA5MknUnINh44B3yTs9oW3Eici+vAAKMitpnXCWdm5eE0s0bcQPha0s/BnvR1bhnwBnCfpIPUUGbWhDuvXiPp5VrWnUUDhRPAzJ4HNgCTJe0K9qSvc+twJ0mra8QW1WTgHyD1c/B1ogHBaWZDgWVAR7TRIWHE+wxTcOvG2/U/Ygxc+e8As4B2Saei9/4DBmP8sRNok9wAAAAASUVORK5CYII=", "text/latex": [ "$\\displaystyle \\left( 40, \\ 10, \\ 40\\right)$" ], @@ -922,7 +1017,69 @@ "cell_type": "code", "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0][PROGRESS]------(0.119 sec) Initializing SetupBlockForest:\n", + "[0] - AABB: [ <0,0,0>, <40,40,1> ]\n", + "[0] - forest size (root blocks / blocks on the initial grid): 2 x 4 x 1\n", + "[0] - periodicity: true x true x false\n", + "[0][PROGRESS]------(0.119 sec) Initializing SetupBlockForest: Allocating root blocks ...\n", + "[0][PROGRESS]------(0.119 sec) Initializing SetupBlockForest: Setting up neighborhood information for each block (with respect to periodicity) ...\n", + "[0][PROGRESS]------(0.119 sec) Initializing SetupBlockForest: Assigning workload, memory requirements, and SUIDs to blocks ...\n", + "[0][PROGRESS]------(0.119 sec) Initializing SetupBlockForest: finished!\n", + "[0] The following block structure has been created:\n", + "[0] - AABB: [ <0,0,0>, <40,40,1> ]\n", + "[0] - initial decomposition: 2 x 4 x 1 (= forest size)\n", + "[0] - periodicity: true x true x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 4 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 8\n", + "[0] - blocks have not yet been distributed to processes\n", + "[0][PROGRESS]------(0.119 sec) Balancing SetupBlockForest: Creating a process distribution for 1 process(es) ...\n", + "[0][PROGRESS]------(0.119 sec) Balancing SetupBlockForest: process distribution to 1 process(es) finished!\n", + "[0] - number of worker processes: 1\n", + "[0] - number of empty buffer processes: 0\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] The resulting block structure looks like as follows:\n", + "[0] - AABB: [ <0,0,0>, <40,40,1> ]\n", + "[0] - initial decomposition: 2 x 4 x 1 (= forest size)\n", + "[0] - periodicity: true x true x false\n", + "[0] - number of blocks discarded from the initial grid: 0 (= 0 %)\n", + "[0] - number of levels: 1\n", + "[0] - tree ID digits: 4 (-> block ID bytes = 1)\n", + "[0] - total number of blocks: 8\n", + "[0] - number of processes: 1 (1 worker process(es) / 0 empty buffer process(es))\n", + "[0] - buffer processes are inserted into the process network: no\n", + "[0] - process ID bytes: 0\n", + "[0] - blocks/memory/workload per process:\n", + "[0] + blocks:\n", + "[0] - min = 8\n", + "[0] - max = 8\n", + "[0] - avg = 8\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + memory:\n", + "[0] - min = 8\n", + "[0] - max = 8\n", + "[0] - avg = 8\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0] + workload:\n", + "[0] - min = 8\n", + "[0] - max = 8\n", + "[0] - avg = 8\n", + "[0] - stdDev = 0\n", + "[0] - relStdDev = 0\n", + "[0][PROGRESS]------(0.119 sec) Adding block data (\"cell bounding box\")\n", + "[0][PROGRESS]------(0.119 sec) Adding block data (\"src\")\n", + "[0][PROGRESS]------(0.120 sec) Adding block data (\"dst\")\n" + ] + } + ], "source": [ "blocks = createUniformBlockGrid(blocks=(2,4,1), cellsPerBlock=(20, 10, 1), \n", " oneBlockPerProcess=False, periodic=(1, 1, 0))\n", @@ -952,14 +1109,12 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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xEEAAAAASJQ4CMfw85//PGbNmhWjRo2Kfv36xfnnnx/3339/HD58uMu67du3xxe+8IXo27dv1NbWxsMPP1ymiSEty5Yti0996lPRt2/fmDhxYrz88svlHgmS0djYGBMmTIgBAwbEkCFDYvr06bFjx44uaw4dOhQNDQ0xaNCg6N+/f8yYMSNaW1vLNDGk6aGHHoqKioqYP39+fp9rE8rj7bffjj/5kz+JQYMGRb9+/eIzn/lMvPrqq/njuVwuFi9eHMOGDYt+/frFlClT4s033yzjxKRGHIRj+NnPfhadnZ3x2GOPxU9+8pNYsmRJLF++PP7iL/4ivyabzcbUqVNj5MiRsXXr1vjOd74T3/jGN+IHP/hBGSeHT74f/ehHsXDhwrj//vvjtddei0svvTTq6+tj//795R4NktDc3BwNDQ2xefPmWL9+fRw5ciSmTp0a7e3t+TULFiyIZ599Np566qlobm6Offv2xU033VTGqSEtr7zySjz22GMxduzYLvtdm3Dq/epXv4orr7wyzjzzzHj++efjpz/9afzt3/5t/N7v/V5+zcMPPxzf+973Yvny5bFly5Y4++yzo76+Pg4dOlTGyUlJRS6Xy5V7CDgdfOc734mmpqZ46623IiKiqakp/vIv/zJaWlqiT58+ERFx7733xtNPPx0/+9nPyjkqfKJNnDgxJkyYEN///vcjIqKzszNqa2tj3rx5ce+995Z5OkjPu+++G0OGDInm5uaYNGlStLW1xbnnnhurVq2KP/qjP4qI//2PbhdffHFs2rQprrjiijJPDJ9s77//flx22WXx6KOPxoMPPhjjxo2LpUuXujahTO699974z//8z/j3f//3Yx7P5XJRU1MTX/3qV+NrX/taRES0tbXF0KFDY+XKlfGlL33pVI5Lotw5CCeora0tBg4cmH+9adOmmDRpUj4MRkTU19fHjh074le/+lU5RoRPvMOHD8fWrVtjypQp+X29evWKKVOmxKZNm8o4GaSrra0tIiL/d+TWrVvjyJEjXa7T0aNHx4gRI1yncAo0NDTEH/zBH3S5BiNcm1Au//qv/xqXX3553HzzzTFkyJD47Gc/G3//93+fP7579+5oaWnpcm1mMpmYOHGia5NTRhyEE7Bz5874u7/7u/jTP/3T/L6WlpYYOnRol3UfvG5paTml80EqfvnLX8bRo0ePee257uDU6+zsjPnz58eVV14ZY8aMiYjI31F/zjnndFnrOoXSW716dbz22mvR2Nj4kWOuTSiPt956K5qamuLCCy+MdevWxV133RV/9md/Fk888URE/OZ7R///lnISB0nKvffeGxUVFcfdfvtHgt9+++24/vrr4+abb47Zs2eXaXIA6HkaGhrijTfeiNWrV5d7FEje3r1748///M/jySefjL59+5Z7HOD/dHZ2xmWXXRbf/va347Of/WzMmTMnZs+eHcuXLy/3aJDXu9wDwKn01a9+NW6//fbjrjnvvPPyv963b19cffXV8fnPf/4jHzRSXV39kU93++B1dXV1cQYGuhg8eHCcccYZx7z2XHdwas2dOzeee+652LhxYwwfPjy/v7q6Og4fPhwHDhzocoeS6xRKa+vWrbF///647LLL8vuOHj0aGzdujO9///uxbt061yaUwbBhw+KSSy7psu/iiy+Of/mXf4mI33zv2NraGsOGDcuvaW1tjXHjxp2yOUmbOwdJyrnnnhujR48+7vbBMwTffvvtmDx5cowfPz5WrFgRvXp1vVzq6upi48aNceTIkfy+9evXx0UXXdTlk6eA4unTp0+MHz8+NmzYkN/X2dkZGzZsiLq6ujJOBunI5XIxd+7cWLNmTbz44osxatSoLsfHjx8fZ555ZpfrdMeOHbFnzx7XKZTQtddeG6+//nps27Ytv11++eVx22235X/t2oRT78orr4wdO3Z02fc///M/MXLkyIiIGDVqVFRXV3e5NrPZbGzZssW1ySnjzkE4hg/C4MiRI+Nv/uZv4t13380f++C/7Nx6663xwAMPxKxZs+Kee+6JN954Ix555JFYsmRJucaGJCxcuDBmzpwZl19+eXzuc5+LpUuXRnt7e9xxxx3lHg2S0NDQEKtWrYpnnnkmBgwYkH8eUiaTiX79+kUmk4lZs2bFwoULY+DAgVFVVRXz5s2Luro6n4YKJTRgwID8sz8/cPbZZ8egQYPy+12bcOotWLAgPv/5z8e3v/3t+OM//uN4+eWX4wc/+EH+J9MqKipi/vz58eCDD8aFF14Yo0aNiq9//etRU1MT06dPL+/wJEMchGNYv3597Ny5M3bu3NnlR6Ui/veOiYj//Sbo3/7t36KhoSHGjx8fgwcPjsWLF8ecOXPKMTIk45Zbbol33303Fi9eHC0tLTFu3LhYu3btRx7iDJRGU1NTRERMnjy5y/4VK1bkH92xZMmS6NWrV8yYMSM6Ojqivr4+Hn300VM8KfDbXJtw6k2YMCHWrFkTixYtim9+85sxatSoWLp0adx22235NXfffXe0t7fHnDlz4sCBA3HVVVfF2rVrPT+UU6Yi90HpAAAAAACS4pmDAAAAAJAocRAAAAAAEiUOAgAAAECixEEAAAAASJQ4CAAAAACJEgcBAAAAIFHiIAAAAAAkShwEAAAAgESJgwAAAACQKHEQAAAAABIlDgIAAABAov4/4ztPmQSEup8AAAAASUVORK5CYII=", "text/plain": [ - "<Figure size 1152x432 with 1 Axes>" + "<Figure size 1600x600 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -999,14 +1154,12 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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cBAAAAAAako4CAAAAAA1JRwEAAAAgJoSDgIAAABATQkHAQAAAKCmBvo9AAD0S9ktU/VFkagvc70jM0unk+s9W72+MT2bat2Yrv5UYuDxbqp3cyr3Gubg/qJybWdRM9X7wPiiyrV7m8n9Eyurz9FppTo/NDhSuXZJs53qnZWZ/ZGZxaneuyefU7l274Elqd6Zfd94LHdcZY7Z5lTunJJZb43p3NrMnicy56D0+S1z7uzheTn79wQAjiSuHAQAAACAmhIOAgAAAEBNpcLBrVu3xhlnnBFLly6NE044Ic4///zYtWvXvJqpqanYtGlTLF++PJYsWRIbN26MvXv3LujQAAAAAMDhS4WDO3bsiE2bNsUdd9wRN998c8zMzMS5554bk5OTczWXX355fOELX4jPfvazsWPHjnjggQfiTW9604IPDgAAAAAcntQHktx4443zvr7uuuvihBNOiJ07d8bZZ58d4+Pj8clPfjK2b98er3nNayIi4tprr41TTz017rjjjnjlK1+5cJMDAAAAAIflsN5zcHx8PCIili1bFhERO3fujJmZmVi/fv1czSmnnBInnXRS3H777Qft0W63Y2JiYt4NAAAAAOi9Qw4Hu91uXHbZZXHWWWfFaaedFhERe/bsiaGhoTj22GPn1a5YsSL27Nlz0D5bt26N0dHRudvY2NihjgQAAAAAJBxyOLhp06b41re+Fddff/1hDbBly5YYHx+fu+3evfuw+gEAAAAA1aTec/AJl1xySXzxi1+M2267LU488cS5+1euXBnT09Oxb9++eVcP7t27N1auXHnQXq1WK1qt1qGMAQAAAAAchtSVg2VZxiWXXBI33HBDfOUrX4k1a9bM+/7atWtjcHAwbrnllrn7du3aFffff3+sW7duYSYGAAAAABZE6srBTZs2xfbt2+Pzn/98LF26dO59BEdHR2PRokUxOjoaF154YWzevDmWLVsWIyMjcemll8a6det8UjEAAAAAHGFS4eC2bdsiIuKcc86Zd/+1114b73znOyMi4sorr4xGoxEbN26MdrsdGzZsiI9//OMLMiwANVSWufqi6M0cERFlt3ptN1EbEdHpJMbI9S5mZqvXtqvPEREx8Fj13p1FzVTvof25fd8Zrr7vh/bl3na53RysXPtoLEn1nulU3y4T7eFU72OHH69cO9ycSfXOmupU34b7phalek9M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", "text/plain": [ - "<Figure size 1152x432 with 1 Axes>" + "<Figure size 1600x600 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1031,7 +1184,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.11.0rc1" } }, "nbformat": 4, diff --git a/doc/notebooks/06_tutorial_phasefield_dentritic_growth.ipynb b/doc/notebooks/06_tutorial_phasefield_dentritic_growth.ipynb index dcfc7487beae730ff9cee6d26fa130f7cf13bffe..9999bff04668ad95fc7cafae40b87584e93fd83d 100644 --- a/doc/notebooks/06_tutorial_phasefield_dentritic_growth.ipynb +++ b/doc/notebooks/06_tutorial_phasefield_dentritic_growth.ipynb @@ -602,7 +602,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.9" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/doc/notebooks/demo_wave_equation.ipynb b/doc/notebooks/demo_wave_equation.ipynb index 9a5016e12f1e90054775796f0f420943d23b6d41..70e130c22034b53a1044ce78cfb5590443d13ef7 100644 --- a/doc/notebooks/demo_wave_equation.ipynb +++ b/doc/notebooks/demo_wave_equation.ipynb @@ -69,15 +69,15 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAAyBAMAAAAzRVApAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHaZ70QiZs27Mondq1QBvk6oAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAI5klEQVR4Ae1bXYgcRRCu2c3u3e3ubcbom4asiRJIQE+DohjxJ+IPSDw0KAGDAz6IEPEkoIJ5OBBkHxTPH5A8SAYioviQNYIICXgG/0AkywkhBCGnYkQxJhHiQ2JyVnV1z85P93TPRc3NkeJueqenvvq+rtrZma27AZBWp7Gh9hzHgPxC2rhZQG4hbZwtIM+QNkUsIOeQNoUtIERIGycrmreAooa0MVsP1q6F9rjZQXOkCfA+wM+aI/qpJjRvvq6AP0YpSsHE80MJbFFoDxpTBfLmEn40GOq1+3CjPomG2YOwaz1ANTAczkwfhI/hEFSDzAHzRFEKjjQ/lMAWhI4GjXXT4J43l/AfQGscTsJyc1ayRxo9gEcBvH72kHYG/b+E3YGzPwYpSsG880MJbFHoBwC1aXDOm1P4w7AihI0wHPBqnLajoagFvOTkDYD+X8DT487+GLYoBSuZH0pgi0IPcy1c8+YUfhrfsPAVVCYc80puLfzF8wJW046DkT8c95390bsoBauYH0pgi0KnuRaueXMJX8da+LAf8JJhMW/djlC6bMWRanFM7tsG8kcOZ3/0LkrBEoqjGmOMLEpYn+Za2PPmrqw2RefFnYCjxZZD85R02Ywj1YJGFyO/Ji7a1R/di1KwjOKolnoPFoRSvuh6Yc+bu7Jan64Xp6AxyRjz9jqAu+TRLThSLd4zerc78UPkvw1/zf5xb/HaTsGQLFG+sDTRVaoWdsIEFeZN1CInbz/Guezh8X5liu+jKHa+3Q9wJGAX/G4hakEEekvopu8itV4tBLN/JoqdgiEZIouwFFH9ebVuO2GCCvPG54XCpwLjbqIW9vB4XzoNlTH80BvqZYMlZ1714UjIU1fg8Dv+vsC7mm1CN6D/e3/86uf4Z0LYKRiSIbIISxE1h1Uu7YQJKswbtPE3J2+JWuSH91Z14DIfPgNY+xF+bxtPqdTtHvCXXQ/eHdDy4fEDMwA36JzEnNId+T8wN5fnHwsUQSwUDMkQOaEiumexFq6EkirKW3392U5e3mQtXMJXa7fDtQDXsK5hGkSLReoM5RgbamdgbBNUTkBllmcnadCCVIo0/gGB2LRdsHyIRIZyBDeiNEqhvQ7WIp9woFFSOedN1sIl/BPVSdgBMMK6fqFBtKZwrOzp6ZpHrX594iYYmQLAH7T2BG21IKlb498U0RFn6IJpIcSDRh/SKXUORIRBw0/sTAOtCcO6Nek1SqqcvCU5uBb69dDlI5YCf0kH72WhJhLqjeEh2Zqi68AxqAY4A15XWEivYR14iEAYPCL2L6WtBtTsdl++t9vtIzzrf1BEpw9afRdMCxF0IBpAcXVORIyNNdBia/oNa6ElpAwkNA6ocvK2a33UpPuk2/28233FkAJyTIR/zG+cxpmjNF3xcSNbU4ANi6V+tnlUwXrVTsLuEM+IAN3hStroQfI9lPXHvgxFxy/Wpi5YhgIh0uiGPqXOTiSxdH+VXpPXw1o4a1RU5rwlOeRnlHY9KCaRgn1QuR1nBiZbU+CdhiWz2ebRT1APmtNw1QBAr/QgpTvjPxpydHMXTANRjKIWSXV2IgWm5acaaO3v1t22oaMh1GpUVMa88Y1+xCFroQnPjvEUvI0f/c8opTTK1hQ0/oLWRKZ5hG/PSjDShx1DdA5Fpgcp3Rn/loxu7oJpIIpM1CKpzk6kwFSL1WonGpf0QUPIHCmNisqYN05xxCFroQkva4END9UIvBU2jUWnP4qry9YUNE5Cq5NpHm3d+9H3UO3XNuBfRQZmACndGf+tMrq5C6aBKDquRUKdnUiBqRbH1E40LpnKrsmgUVEZ88YpjjhkLbTrEZ9RuweNwOUrj86EkSi8FsjWFL1z8QJNDZq4vTo39zd4M9c8tSY+awAp3Rn/zTK6uQumgShCdV7E1NmJFJiWn14TNHeendAQcgZSGhWVMW9ci4hD1kITfnBemBqBqjVF14ul447NIwNI6VaJiMYtMrprFwyB2DnZvAPNF02HlDo7UY2wr/Hy3RpiBo0mqigFKQ5Zi2jp6oVqTeWlAO/exc0N36k4No8MIC9xTVEqcMQb69h9FC7DbnwvTn7ivGC8am3ZiRQBnRcKpeb0o0GjiWqQArqPGnBcoo9OKRCOnG19CjxuTdVfg1X0wWpuNsU5ioKuABH9Sd+xC4ZcCJGGDSBndRGRAuc30JQXjRHUTeMgBW69MFoPislPAbemGhuhsnfMsXkEsp/lDMJWFkV/Z9a9C4YQNmoAzYOIwQX6VEU1Rnlz45DdvPwUyNZUm8VP8mDbFgRVZjkgD6ILZmNQEPZzVadQTCQ5JuWYPyShdo3/RQpGWKL4Ii6bTfmi6WhR0JQI2Q7E8IvY2jYMkV7O6hJEDOYGmo0uarcFwtOu8b9IAbemYEJIEM0mu2zZz3IHcStrSEQWXTA7B0Okn7O6OJHEuq4pDnXQWDRvTuH5PcfCRbPJnifZz5KODiB5RgiA6ILhK2y8kY0Z6OKQ+RG5o4RnnFBpNGgT0wXzVjR8HvXFYxczsHgzMLcw7EQqw0sXhqz/VUUqBRd0V14v+hdUxEXyixn49zJAz1UsIiv1cui5ikVkpV4OPVexiGpR0uW8v4FqIJ6rKH0xGm/K75llXc45wKeNxHMVpa8FLJ1Vazjuq1clGvF/Tdr05WB/iTQbpT4WVaCUy2lOQ3WSn6swLrE0B/YppfSYSPlseAxaPX6uonzi04pfVBPb1IsSjY/v2T370M43OuK5ihLp1kmt37LmHHgrDz64hx8T0fks4Lna3bDTh+PyuYoFLNRF2qZg5CRcDts7X/NjIi6YBeRz2QTcBPQjnqtYQMLmIcW7hy58H8Kn/sOlXM5tPnwD9LMIrIr/iNgDnx6AKKXdB94p+lkMhv/GuWIcF/JnORfjnaHvFrUT+G4qv63o0YUPxAMQJVyNdw5GJ482J9thCcWnJa+YhUPt4Ad89s3hz/Vp8ALYfx2293vV/rIFIOW8JYx0hr5t1s6NnKhPnHesCxFg+cp3Z8brb5VTfCph3syap672Zq5c9VzqwP+2+w+M+JTHYLF/LQAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/latex": [ - "$$\\frac{{{u^{(0)}}_{(0,0)}} - 2 {{u^{(1)}}_{(0,0)}} + {{u^{(2)}}_{(0,0)}}}{dt^{2}} = \\frac{{{u^{(1)}}_{(-1,0)}} + {{u^{(1)}}_{(0,-1)}} - 4 {{u^{(1)}}_{(0,0)}} + {{u^{(1)}}_{(0,1)}} + {{u^{(1)}}_{(1,0)}}}{dx^{2}}$$" + "$\\displaystyle \\frac{{u^{(0)}}_{(0,0)} - 2 {u^{(1)}}_{(0,0)} + {u^{(2)}}_{(0,0)}}{dt^{2}} = \\frac{- 4 {u^{(1)}}_{(0,0)} + {u^{(1)}}_{(1,0)} + {u^{(1)}}_{(0,1)} + {u^{(1)}}_{(0,-1)} + {u^{(1)}}_{(-1,0)}}{dx^{2}}$" ], "text/plain": [ - "u_0_C - 2⋅u_1_C + u_2_C u_1_W + u_1_S - 4⋅u_1_C + u_1_N + u_1_E\n", - "─────────────────────── = ───────────────────────────────────────\n", - " 2 2 \n", - " dt dx " + "u_0_C - 2⋅u_1_C + u_2_C -4⋅u_1_C + u_1_E + u_1_N + u_1_S + u_1_W\n", + "─────────────────────── = ────────────────────────────────────────\n", + " 2 2 \n", + " dt dx " ] }, "execution_count": 3, @@ -114,22 +114,16 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ - "$${{u^{(2)}}_{(0,0)}} \\leftarrow \\frac{{{u^{(1)}}_{(-1,0)}} dt^{2} + {{u^{(1)}}_{(0,-1)}} dt^{2} - 4 {{u^{(1)}}_{(0,0)}} dt^{2} + {{u^{(1)}}_{(0,1)}} dt^{2} + {{u^{(1)}}_{(1,0)}} dt^{2} + dx^{2} \\left(- {{u^{(0)}}_{(0,0)}} + 2 {{u^{(1)}}_{(0,0)}}\\right)}{dx^{2}}$$" + "$\\displaystyle {u^{(2)}}_{(0,0)} \\leftarrow \\frac{- 4 {u^{(1)}}_{(0,0)} dt^{2} + {u^{(1)}}_{(1,0)} dt^{2} + {u^{(1)}}_{(0,1)} dt^{2} + {u^{(1)}}_{(0,-1)} dt^{2} + {u^{(1)}}_{(-1,0)} dt^{2} + dx^{2} \\left(- {u^{(0)}}_{(0,0)} + 2 {u^{(1)}}_{(0,0)}\\right)}{dx^{2}}$" ], "text/plain": [ - " 2 2 2 2 2 2 \n", - " u_1_W⋅dt + u_1_S⋅dt - 4⋅u_1_C⋅dt + u_1_N⋅dt + u_1_E⋅dt + dx ⋅(-u\n", - "u_2_C := ─────────────────────────────────────────────────────────────────────\n", - " 2 \n", - " dx \n", - "\n", - " \n", - "_0_C + 2⋅u_1_C)\n", - "───────────────\n", - " \n", - " " + " 2 2 2 2 2 2 \n", + " - 4⋅u_1_C⋅dt + u_1_E⋅dt + u_1_N⋅dt + u_1_S⋅dt + u_1_W⋅dt + dx ⋅(-u_0_C + 2⋅u_1_C)\n", + "u_2_C := ──────────────────────────────────────────────────────────────────────────────────────\n", + " 2 \n", + " dx " ] }, "execution_count": 4, @@ -159,24 +153,29 @@ { "data": { "text/html": [ - "<style>.highlight .hll { background-color: #ffffcc }\n", - ".highlight { background: #f8f8f8; }\n", - ".highlight .c { color: #408080; font-style: italic } /* Comment */\n", + "<style>pre { line-height: 125%; }\n", + "td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", + "span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", + "td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", + "span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", + ".highlight .hll { background-color: #ffffcc }\n", + ".highlight { background: #f8f8f8; }\n", + ".highlight .c { color: #3D7B7B; font-style: italic } /* Comment */\n", ".highlight .err { border: 1px solid #FF0000 } /* Error */\n", ".highlight .k { color: #008000; font-weight: bold } /* Keyword */\n", ".highlight .o { color: #666666 } /* Operator */\n", - ".highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".highlight .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".highlight .cs { color: #408080; font-style: italic } /* Comment.Special */\n", + ".highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", + ".highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", + ".highlight .cp { color: #9C6500 } /* Comment.Preproc */\n", + ".highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", + ".highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", + ".highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", ".highlight .gd { color: #A00000 } /* Generic.Deleted */\n", ".highlight .ge { font-style: italic } /* Generic.Emph */\n", - ".highlight .gr { color: #FF0000 } /* Generic.Error */\n", + ".highlight .gr { color: #E40000 } /* Generic.Error */\n", ".highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".highlight .gi { color: #00A000 } /* Generic.Inserted */\n", - ".highlight .go { color: #888888 } /* Generic.Output */\n", + ".highlight .gi { color: #008400 } /* Generic.Inserted */\n", + ".highlight .go { color: #717171 } /* Generic.Output */\n", ".highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", ".highlight .gs { font-weight: bold } /* Generic.Strong */\n", ".highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", @@ -189,15 +188,15 @@ ".highlight .kt { color: #B00040 } /* Keyword.Type */\n", ".highlight .m { color: #666666 } /* Literal.Number */\n", ".highlight .s { color: #BA2121 } /* Literal.String */\n", - ".highlight .na { color: #7D9029 } /* Name.Attribute */\n", + ".highlight .na { color: #687822 } /* Name.Attribute */\n", ".highlight .nb { color: #008000 } /* Name.Builtin */\n", ".highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", ".highlight .no { color: #880000 } /* Name.Constant */\n", ".highlight .nd { color: #AA22FF } /* Name.Decorator */\n", - ".highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", + ".highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */\n", + ".highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", ".highlight .nf { color: #0000FF } /* Name.Function */\n", - ".highlight .nl { color: #A0A000 } /* Name.Label */\n", + ".highlight .nl { color: #767600 } /* Name.Label */\n", ".highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", ".highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", ".highlight .nv { color: #19177C } /* Name.Variable */\n", @@ -214,11 +213,11 @@ ".highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", ".highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", + ".highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", ".highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", + ".highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", ".highlight .sx { color: #008000 } /* Literal.String.Other */\n", - ".highlight .sr { color: #BB6688 } /* Literal.String.Regex */\n", + ".highlight .sr { color: #A45A77 } /* Literal.String.Regex */\n", ".highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n", ".highlight .ss { color: #19177C } /* Literal.String.Symbol */\n", ".highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", @@ -239,45 +238,43 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span> <span class=\"kt\">void</span> <span class=\"nf\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u0</span><span class=\"p\">,</span> <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1</span><span class=\"p\">,</span> <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"n\">_data_u2</span><span class=\"p\">)</span>\n", - "<span class=\"p\">{</span>\n", - " <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"kt\">int</span> <span class=\"n\">ctr_0</span> <span class=\"o\">=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"n\">ctr_0</span> <span class=\"o\"><</span> <span class=\"mi\">59</span><span class=\"p\">;</span> <span class=\"n\">ctr_0</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n", - " <span class=\"p\">{</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"n\">_data_u2_00</span> <span class=\"o\">=</span> <span class=\"n\">_data_u2</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_00</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u0_00</span> <span class=\"o\">=</span> <span class=\"n\">_data_u0</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_01</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_0m1</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span> <span class=\"o\">-</span> <span class=\"mi\">70</span><span class=\"p\">;</span>\n", - " <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"kt\">int</span> <span class=\"n\">ctr_1</span> <span class=\"o\">=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"n\">ctr_1</span> <span class=\"o\"><</span> <span class=\"mi\">69</span><span class=\"p\">;</span> <span class=\"n\">ctr_1</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n", - " <span class=\"p\">{</span>\n", - " <span class=\"n\">_data_u2_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_01</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_0m1</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u0_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span>\n", - " <span class=\"p\">}</span>\n", - " <span class=\"p\">}</span>\n", - "<span class=\"p\">}</span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_u0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u2</span><span class=\"p\">)</span><span class=\"w\"></span>\n", + "<span class=\"p\">{</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">59</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u2_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u2</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_01</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_0m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u0_00</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">69</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_u2_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u0_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_01</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_0m1</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u1_00</span><span class=\"p\">[</span><span class=\"n\">ctr_1</span><span class=\"p\">];</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"></span>\n", + "<span class=\"p\">}</span><span class=\"w\"></span>\n", "</pre></div>\n" ], "text/plain": [ - "\n", - "FUNC_PREFIX void kernel(double * RESTRICT const _data_u0, double * RESTRICT const _data_u1, double * RESTRICT _data_u2)\n", + "FUNC_PREFIX void kernel(double * RESTRICT const _data_u0, double * RESTRICT const _data_u1, double * RESTRICT _data_u2)\n", "{\n", - " for (int ctr_0 = 1; ctr_0 < 59; ctr_0 += 1)\n", + " for (int64_t ctr_0 = 1; ctr_0 < 59; ctr_0 += 1)\n", " {\n", - " double * RESTRICT _data_u2_00 = _data_u2 + 70*ctr_0;\n", - " double * RESTRICT const _data_u1_00 = _data_u1 + 70*ctr_0;\n", - " double * RESTRICT const _data_u0_00 = _data_u0 + 70*ctr_0;\n", - " double * RESTRICT const _data_u1_01 = _data_u1 + 70*ctr_0 + 70;\n", - " double * RESTRICT const _data_u1_0m1 = _data_u1 + 70*ctr_0 - 70;\n", - " for (int ctr_1 = 1; ctr_1 < 69; ctr_1 += 1)\n", + " double * RESTRICT _data_u2_00 = _data_u2 + 70*ctr_0;\n", + " double * RESTRICT _data_u1_01 = _data_u1 + 70*ctr_0 + 70;\n", + " double * RESTRICT _data_u1_00 = _data_u1 + 70*ctr_0;\n", + " double * RESTRICT _data_u1_0m1 = _data_u1 + 70*ctr_0 - 70;\n", + " double * RESTRICT _data_u0_00 = _data_u0 + 70*ctr_0;\n", + " for (int64_t ctr_1 = 1; ctr_1 < 69; ctr_1 += 1)\n", " {\n", - " _data_u2_00[ctr_1] = 0.25*_data_u1_00[ctr_1 + 1] + 0.25*_data_u1_00[ctr_1 - 1] + 0.25*_data_u1_01[ctr_1] + 0.25*_data_u1_0m1[ctr_1] - 1.0*_data_u0_00[ctr_1] + 1.0*_data_u1_00[ctr_1];\n", + " _data_u2_00[ctr_1] = -1.0*_data_u0_00[ctr_1] + 0.25*_data_u1_00[ctr_1 + 1] + 0.25*_data_u1_00[ctr_1 - 1] + 0.25*_data_u1_01[ctr_1] + 0.25*_data_u1_0m1[ctr_1] + 1.0*_data_u1_00[ctr_1];\n", " }\n", " }\n", "}" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -316,7 +313,7 @@ { "data": { "text/plain": [ - "{u0, u1, u2}" + "{u0: double[60,70], u1: double[60,70], u2: double[60,70]}" ] }, "execution_count": 7, @@ -384,20 +381,11 @@ "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "<video controls width=\"80%\">\n", - " <source src=\"data:video/x-m4v;base64,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EI/8wklE2oMP/5QaWApxRqxPY+eISBWbaxEPkbqob7useH4Sg2DAzJjx6Ur33iI/Bj1tYgzftwFylKVSvyun02sfQwtpi8q/eZL0wvDkNGOPi340MzM3+pe1/+EvPlQECLsVgb6w9QVpkpnnYA1zQtyum33wOJSvFmSIrv/aRIUWJoU8Xvrv//wlmAADBwsTi3L/+OMDmKaWXG+vz4NSfgOwAARvC1apkZYw4VPZ39yH/ztBPnjnGOnQfwAENRUpVpUGGBGe1FbEB5IuFVYm793hILyV4Vc8E545vrCnqCVPZRL8oZ4QYIf8JBboeML5CEbA0pF/6/7BcCC421jwlHXhNfsGBtmRjpG0I5/v4fqF/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXwgaf/CQW8MgEFbPCM0rWqrX0PRBNEhxWUAq+pd//hsgAiNAdNK9QDL/94ahcNdd9dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeAAAAErEGaOBfgFB5Qlh4y2BJ4osB1pJkHFyTIOLkmQcXJME83OSAdcpYCA3UmA5epb+5nqXytcX5MwHeUsR2p5Hkzc2doeyxi43SBYqwhAkfks8fbSZqhF/j5dZObwRvTMuTDWV9xG6cpII2o5muL8mYDrlLG+nw64l4Cu5/o9YqLDGW+HGWSMtWNRiRjw80cv+FuUKssGbxY75ROHssDrlLEkycojAGt61Hv9kAIXm5/6FNO6T/L/9lACVpU9q8/4JXY1iwhlIjz8Gy/NC56sujhu6rHFFwfPPKRxSnyaX6LVWkvSi2WDf78v+zh4SU+IjxgX5gnh/HGZrm4eyzy5OQ6uqtKCGzQhaej4n0gQhaG9o/Wg6JrfPxEo3DLJmuxYD/Usjy3+bD1MvXXYgCkb767z/h8v9+Q868BV6Si7hvK+RYnl+xa8SFDjE5KGayRPnLH/RWU1EU3nzvp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\" type=\"video/mp4\">\n", - " Your browser does not support the video tag.\n", - "</video>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "No ffmpeg installed\n" + ] } ], "source": [ @@ -423,35 +411,40 @@ "source": [ "__Runing on GPU__\n", "\n", - "We can also run the same kernel on the GPU, by using the ``pycuda`` package." + "We can also run the same kernel on the GPU, by using the ``cupy`` package." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "<style>.highlight .hll { background-color: #ffffcc }\n", - ".highlight { background: #f8f8f8; }\n", - ".highlight .c { color: #408080; font-style: italic } /* Comment */\n", + "<style>pre { line-height: 125%; }\n", + "td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", + "span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", + "td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", + "span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", + ".highlight .hll { background-color: #ffffcc }\n", + ".highlight { background: #f8f8f8; }\n", + ".highlight .c { color: #3D7B7B; font-style: italic } /* Comment */\n", ".highlight .err { border: 1px solid #FF0000 } /* Error */\n", ".highlight .k { color: #008000; font-weight: bold } /* Keyword */\n", ".highlight .o { color: #666666 } /* Operator */\n", - ".highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", - ".highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", - ".highlight .cp { color: #BC7A00 } /* Comment.Preproc */\n", - ".highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", - ".highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", - ".highlight .cs { color: #408080; font-style: italic } /* Comment.Special */\n", + ".highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", + ".highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", + ".highlight .cp { color: #9C6500 } /* Comment.Preproc */\n", + ".highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", + ".highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", + ".highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", ".highlight .gd { color: #A00000 } /* Generic.Deleted */\n", ".highlight .ge { font-style: italic } /* Generic.Emph */\n", - ".highlight .gr { color: #FF0000 } /* Generic.Error */\n", + ".highlight .gr { color: #E40000 } /* Generic.Error */\n", ".highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", - ".highlight .gi { color: #00A000 } /* Generic.Inserted */\n", - ".highlight .go { color: #888888 } /* Generic.Output */\n", + ".highlight .gi { color: #008400 } /* Generic.Inserted */\n", + ".highlight .go { color: #717171 } /* Generic.Output */\n", ".highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", ".highlight .gs { font-weight: bold } /* Generic.Strong */\n", ".highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", @@ -464,15 +457,15 @@ ".highlight .kt { color: #B00040 } /* Keyword.Type */\n", ".highlight .m { color: #666666 } /* Literal.Number */\n", ".highlight .s { color: #BA2121 } /* Literal.String */\n", - ".highlight .na { color: #7D9029 } /* Name.Attribute */\n", + ".highlight .na { color: #687822 } /* Name.Attribute */\n", ".highlight .nb { color: #008000 } /* Name.Builtin */\n", ".highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", ".highlight .no { color: #880000 } /* Name.Constant */\n", ".highlight .nd { color: #AA22FF } /* Name.Decorator */\n", - ".highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", - ".highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", + ".highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */\n", + ".highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", ".highlight .nf { color: #0000FF } /* Name.Function */\n", - ".highlight .nl { color: #A0A000 } /* Name.Label */\n", + ".highlight .nl { color: #767600 } /* Name.Label */\n", ".highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", ".highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", ".highlight .nv { color: #19177C } /* Name.Variable */\n", @@ -489,11 +482,11 @@ ".highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", ".highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", + ".highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", ".highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", + ".highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", ".highlight .sx { color: #008000 } /* Literal.String.Other */\n", - ".highlight .sr { color: #BB6688 } /* Literal.String.Regex */\n", + ".highlight .sr { color: #A45A77 } /* Literal.String.Regex */\n", ".highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n", ".highlight .ss { color: #19177C } /* Literal.String.Symbol */\n", ".highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", @@ -514,55 +507,53 @@ { "data": { "text/html": [ - "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span> <span class=\"nf\">__launch_bounds__</span><span class=\"p\">(</span><span class=\"mi\">256</span><span class=\"p\">)</span> <span class=\"kt\">void</span> <span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u0</span><span class=\"p\">,</span> <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1</span><span class=\"p\">,</span> <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"n\">_data_u2</span><span class=\"p\">)</span>\n", - "<span class=\"p\">{</span>\n", - " <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"mi\">1</span> <span class=\"o\"><</span> <span class=\"mi\">59</span> <span class=\"o\">&&</span> <span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span> <span class=\"o\">+</span> <span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span> <span class=\"o\">+</span> <span class=\"mi\">1</span> <span class=\"o\"><</span> <span class=\"mi\">69</span><span class=\"p\">)</span>\n", - " <span class=\"p\">{</span>\n", - " <span class=\"k\">const</span> <span class=\"kt\">int64_t</span> <span class=\"n\">ctr_0</span> <span class=\"o\">=</span> <span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n", - " <span class=\"k\">const</span> <span class=\"kt\">int64_t</span> <span class=\"n\">ctr_1</span> <span class=\"o\">=</span> <span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span> <span class=\"o\">+</span> <span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"n\">_data_u2_10</span> <span class=\"o\">=</span> <span class=\"n\">_data_u2</span> <span class=\"o\">+</span> <span class=\"n\">ctr_1</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_10</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"n\">ctr_1</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u0_10</span> <span class=\"o\">=</span> <span class=\"n\">_data_u0</span> <span class=\"o\">+</span> <span class=\"n\">ctr_1</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_11</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"n\">ctr_1</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n", - " <span class=\"kt\">double</span> <span class=\"o\">*</span> <span class=\"n\">RESTRICT</span> <span class=\"k\">const</span> <span class=\"n\">_data_u1_1m1</span> <span class=\"o\">=</span> <span class=\"n\">_data_u1</span> <span class=\"o\">+</span> <span class=\"n\">ctr_1</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n", - " <span class=\"n\">_data_u2_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span> <span class=\"o\">+</span> <span class=\"mi\">70</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span> <span class=\"o\">-</span> <span class=\"mi\">70</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_11</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_1m1</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u0_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">];</span>\n", - " <span class=\"p\">}</span> \n", - "<span class=\"p\">}</span>\n", + "<div class=\"highlight\"><pre><span></span><span class=\"n\">FUNC_PREFIX</span><span class=\"w\"> </span><span class=\"nf\">__launch_bounds__</span><span class=\"p\">(</span><span class=\"mi\">256</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"n\">kernel</span><span class=\"p\">(</span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_u0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u2</span><span class=\"p\">)</span><span class=\"w\"></span>\n", + "<span class=\"p\">{</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">59</span><span class=\"w\"> </span><span class=\"o\">&&</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\"><</span><span class=\"w\"> </span><span class=\"mi\">69</span><span class=\"p\">)</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">int64_t</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blockDim</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"o\">*</span><span class=\"n\">blockIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">threadIdx</span><span class=\"p\">.</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u2_10</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u2</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_10</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_11</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u1_1m1</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u1</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"kt\">double</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">RESTRICT</span><span class=\"w\"> </span><span class=\"n\">_data_u0_10</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">_data_u0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">ctr_1</span><span class=\"p\">;</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"n\">_data_u2_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">-1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u0_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">70</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_11</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">0.25</span><span class=\"o\">*</span><span class=\"n\">_data_u1_1m1</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mf\">1.0</span><span class=\"o\">*</span><span class=\"n\">_data_u1_10</span><span class=\"p\">[</span><span class=\"mi\">70</span><span class=\"o\">*</span><span class=\"n\">ctr_0</span><span class=\"p\">];</span><span class=\"w\"></span>\n", + "<span class=\"w\"> </span><span class=\"p\">}</span><span class=\"w\"> </span>\n", + "<span class=\"p\">}</span><span class=\"w\"></span>\n", "</pre></div>\n" ], "text/plain": [ - "\n", - "FUNC_PREFIX __launch_bounds__(256) void kernel(double * RESTRICT const _data_u0, double * RESTRICT const _data_u1, double * RESTRICT _data_u2)\n", + "FUNC_PREFIX __launch_bounds__(256) void kernel(double * RESTRICT const _data_u0, double * RESTRICT const _data_u1, double * RESTRICT _data_u2)\n", "{\n", " if (blockDim.x*blockIdx.x + threadIdx.x + 1 < 59 && blockDim.y*blockIdx.y + threadIdx.y + 1 < 69)\n", " {\n", " const int64_t ctr_0 = blockDim.x*blockIdx.x + threadIdx.x + 1;\n", " const int64_t ctr_1 = blockDim.y*blockIdx.y + threadIdx.y + 1;\n", - " double * RESTRICT _data_u2_10 = _data_u2 + ctr_1;\n", - " double * RESTRICT const _data_u1_10 = _data_u1 + ctr_1;\n", - " double * RESTRICT const _data_u0_10 = _data_u0 + ctr_1;\n", - " double * RESTRICT const _data_u1_11 = _data_u1 + ctr_1 + 1;\n", - " double * RESTRICT const _data_u1_1m1 = _data_u1 + ctr_1 - 1;\n", - " _data_u2_10[70*ctr_0] = 0.25*_data_u1_10[70*ctr_0 + 70] + 0.25*_data_u1_10[70*ctr_0 - 70] + 0.25*_data_u1_11[70*ctr_0] + 0.25*_data_u1_1m1[70*ctr_0] - 1.0*_data_u0_10[70*ctr_0] + 1.0*_data_u1_10[70*ctr_0];\n", + " double * RESTRICT _data_u2_10 = _data_u2 + ctr_1;\n", + " double * RESTRICT _data_u1_10 = _data_u1 + ctr_1;\n", + " double * RESTRICT _data_u1_11 = _data_u1 + ctr_1 + 1;\n", + " double * RESTRICT _data_u1_1m1 = _data_u1 + ctr_1 - 1;\n", + " double * RESTRICT _data_u0_10 = _data_u0 + ctr_1;\n", + " _data_u2_10[70*ctr_0] = -1.0*_data_u0_10[70*ctr_0] + 0.25*_data_u1_10[70*ctr_0 + 70] + 0.25*_data_u1_10[70*ctr_0 - 70] + 0.25*_data_u1_11[70*ctr_0] + 0.25*_data_u1_1m1[70*ctr_0] + 1.0*_data_u1_10[70*ctr_0];\n", " } \n", "}" ] }, - "execution_count": 13, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ "try:\n", - " import pycuda\n", + " import cupy\n", "except ImportError:\n", - " pycuda=None\n", - " print('No pycuda installed')\n", + " cupy=None\n", + " print('No cupy installed')\n", "\n", "\n", "res = None\n", - "if pycuda:\n", + "if cupy:\n", " gpu_ast = ps.create_kernel(update_rule, target=ps.Target.GPU)\n", " gpu_kernel = gpu_ast.compile()\n", " res = ps.show_code(gpu_ast)\n", @@ -578,16 +569,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ - "if pycuda:\n", - " import pycuda.gpuarray as gpuarray\n", - "\n", + "if cupy:\n", " def run_on_gpu(timesteps=1):\n", " # Transfer arrays to GPU\n", - " gpuArrs = [gpuarray.to_gpu(a) for a in u_arrays]\n", + " gpuArrs = [cupy.asarray(cpu_array) for cpu_array in u_arrays]\n", "\n", " for t in range(timesteps):\n", " gpu_kernel(u0=gpuArrs[0], u1=gpuArrs[1], u2=gpuArrs[2])\n", @@ -595,17 +584,17 @@ "\n", " # Transfer arrays to CPU\n", " for gpuArr, cpuArr in zip(gpuArrs, u_arrays):\n", - " gpuArr.get(cpuArr)\n", + " cpuArr[:] = gpuArr.get()\n", "assert np.isfinite(np.max(u_arrays[2])) " ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ - "if pycuda:\n", + "if cupy:\n", " run_on_gpu(400)" ] } @@ -627,7 +616,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.9.5" } }, "nbformat": 4, diff --git a/doc/sphinx/kernel_compile_and_call.rst b/doc/sphinx/kernel_compile_and_call.rst index 2ceab6123583c9543dad0597f63bb53609538d10..54342616eca8123c2227457a5c4f2259241a0a68 100644 --- a/doc/sphinx/kernel_compile_and_call.rst +++ b/doc/sphinx/kernel_compile_and_call.rst @@ -27,11 +27,11 @@ Code printing GPU Indexing ------------- -.. autoclass:: pystencils.gpucuda.AbstractIndexing +.. autoclass:: pystencils.gpu.AbstractIndexing :members: -.. autoclass:: pystencils.gpucuda.BlockIndexing +.. autoclass:: pystencils.gpu.BlockIndexing :members: -.. autoclass:: pystencils.gpucuda.LineIndexing +.. autoclass:: pystencils.gpu.LineIndexing :members: diff --git a/pystencils/__init__.py b/pystencils/__init__.py index 70ad39e1aded8ab2dde8dfa929d8c1135d9194d0..92fdda9c55bed3f28709f95b0088dd2d88e1904b 100644 --- a/pystencils/__init__.py +++ b/pystencils/__init__.py @@ -3,8 +3,7 @@ from .enums import Backend, Target from . import fd from . import stencil as stencil from .assignment import Assignment, assignment_from_stencil -from pystencils.typing.typed_sympy import TypedSymbol -from .datahandling import create_data_handling +from .typing.typed_sympy import TypedSymbol from .display_utils import get_code_obj, get_code_str, show_code, to_dot from .field import Field, FieldType, fields from .config import CreateKernelConfig @@ -15,6 +14,7 @@ from .simp import AssignmentCollection from .slicing import make_slice from .spatial_coordinates import x_, x_staggered, x_staggered_vector, x_vector, y_, y_staggered, z_, z_staggered from .sympyextensions import SymbolCreator +from .datahandling import create_data_handling __all__ = ['Field', 'FieldType', 'fields', 'TypedSymbol', diff --git a/pystencils/alignedarray.py b/pystencils/alignedarray.py index 067a26d58370460beb1852add9ae46b9709b0595..63bdb3a5f1324a099bbd82fd666bfaec11eeb5af 100644 --- a/pystencils/alignedarray.py +++ b/pystencils/alignedarray.py @@ -25,7 +25,8 @@ def aligned_empty(shape, byte_alignment=True, dtype=np.float64, byte_offset=0, o byte_alignment = 64 elif byte_alignment == 'cacheline': cacheline_sizes = [get_cacheline_size(is_name) for is_name in instruction_sets] - if all([s is None for s in cacheline_sizes]): + if all([s is None for s in cacheline_sizes]) or \ + max([s for s in cacheline_sizes if s is not None]) > 0x100000: widths = [get_vector_instruction_set(dtype, is_name)['width'] * np.dtype(dtype).itemsize for is_name in instruction_sets if type(get_vector_instruction_set(dtype, is_name)['width']) is int] diff --git a/pystencils/backends/simd_instruction_sets.py b/pystencils/backends/simd_instruction_sets.py index 7d0d028c0691e48252a287dd81b46fd0d0a420cc..8024d58c3960235611020cd05f3ea3755375cf5b 100644 --- a/pystencils/backends/simd_instruction_sets.py +++ b/pystencils/backends/simd_instruction_sets.py @@ -9,6 +9,7 @@ from pystencils.backends.x86_instruction_sets import get_vector_instruction_set_ from pystencils.backends.arm_instruction_sets import get_vector_instruction_set_arm from pystencils.backends.ppc_instruction_sets import get_vector_instruction_set_ppc from pystencils.backends.riscv_instruction_sets import get_vector_instruction_set_riscv +from pystencils.cache import memorycache from pystencils.typing import numpy_name_to_c @@ -31,80 +32,68 @@ def get_vector_instruction_set(data_type='double', instruction_set='avx'): return get_vector_instruction_set_x86(type_name, instruction_set) -_cache = None -_cachelinesize = None - - +@memorycache def get_supported_instruction_sets(): """List of supported instruction sets on current hardware, or None if query failed.""" - global _cache - if _cache is not None: - return _cache.copy() if 'PYSTENCILS_SIMD' in os.environ: return os.environ['PYSTENCILS_SIMD'].split(',') - if (platform.system() == 'Darwin' or platform.system() == 'Linux') and platform.machine() == 'arm64': - # not supported by cpuinfo + if platform.system() == 'Darwin' and platform.machine() == 'arm64': return ['neon'] - elif platform.system() == 'Linux' and platform.machine().startswith('riscv'): # not supported by cpuinfo + elif platform.system() == 'Windows' and platform.machine() == 'ARM64': + return ['neon'] + elif platform.system() == 'Linux' and platform.machine() == 'aarch64': + result = ['neon'] # Neon is mandatory on 64-bit ARM libc = CDLL('libc.so.6') hwcap = libc.getauxval(16) # AT_HWCAP - hwcap_isa_v = 1 << (ord('V') - ord('A')) # COMPAT_HWCAP_ISA_V - return ['rvv'] if hwcap & hwcap_isa_v else [] - elif platform.machine().startswith('ppc64'): # no flags reported by cpuinfo - import subprocess - import tempfile - from pystencils.cpu.cpujit import get_compiler_config - f = tempfile.NamedTemporaryFile(suffix='.cpp') - command = [get_compiler_config()['command'], '-mcpu=native', '-dM', '-E', f.name] - macros = subprocess.check_output(command, input='', text=True) - if '#define __VSX__' in macros and '#define __ALTIVEC__' in macros: - _cache = ['vsx'] - else: - _cache = [] - return _cache.copy() - try: - from cpuinfo import get_cpu_info - except ImportError: - return None - - result = [] - required_sse_flags = {'sse', 'sse2', 'ssse3', 'sse4_1', 'sse4_2'} - required_avx_flags = {'avx', 'avx2'} - required_avx512_flags = {'avx512f'} - required_neon_flags = {'neon'} - required_sve_flags = {'sve'} - flags = set(get_cpu_info()['flags']) - if flags.issuperset(required_sse_flags): - result.append("sse") - if flags.issuperset(required_avx_flags): - result.append("avx") - if flags.issuperset(required_avx512_flags): - result.append("avx512") - if flags.issuperset(required_neon_flags): - result.append("neon") - if flags.issuperset(required_sve_flags): - if platform.system() == 'Linux': - libc = CDLL('libc.so.6') + if hwcap & (1 << 22): # HWCAP_SVE length = 8 * libc.prctl(51, 0, 0, 0, 0) # PR_SVE_GET_VL if length < 0: raise OSError("SVE length query failed") - while length > 128: + while length >= 128: result.append(f"sve{length}") length //= 2 - result.append("sve") - return result + result.append("sve") + return result + elif platform.system() == 'Linux' and platform.machine().startswith('riscv'): + libc = CDLL('libc.so.6') + hwcap = libc.getauxval(16) # AT_HWCAP + hwcap_isa_v = 1 << (ord('V') - ord('A')) # COMPAT_HWCAP_ISA_V + return ['rvv'] if hwcap & hwcap_isa_v else [] + elif platform.system() == 'Linux' and platform.machine().startswith('ppc64'): + libc = CDLL('libc.so.6') + hwcap = libc.getauxval(16) # AT_HWCAP + return ['vsx'] if hwcap & 0x00000080 else [] # PPC_FEATURE_HAS_VSX + elif platform.machine() in ['x86_64', 'x86', 'AMD64', 'i386']: + try: + from cpuinfo import get_cpu_info + except ImportError: + return None + + result = [] + required_sse_flags = {'sse', 'sse2', 'ssse3', 'sse4_1', 'sse4_2'} + required_avx_flags = {'avx', 'avx2'} + required_avx512_flags = {'avx512f'} + flags = set(get_cpu_info()['flags']) + if flags.issuperset(required_sse_flags): + result.append("sse") + if flags.issuperset(required_avx_flags): + result.append("avx") + if flags.issuperset(required_avx512_flags): + result.append("avx512") + return result + else: + raise NotImplementedError('Instruction set detection for %s on %s is not implemented' % + (platform.system(), platform.machine())) +@memorycache def get_cacheline_size(instruction_set): """Get the size (in bytes) of a cache block that can be zeroed without memory access. Usually, this is identical to the cache line size.""" - global _cachelinesize instruction_sets = get_vector_instruction_set('double', instruction_set) if 'cachelineSize' not in instruction_sets: return None - if _cachelinesize is not None: - return _cachelinesize import pystencils as ps from pystencils.astnodes import SympyAssignment @@ -117,5 +106,4 @@ def get_cacheline_size(instruction_set): ast = ps.create_kernel(ass, cpu_vectorize_info={'instruction_set': instruction_set}) kernel = ast.compile() kernel(**{f.name: arr, CachelineSize.symbol.name: 0}) - _cachelinesize = int(arr[0, 0]) - return _cachelinesize + return int(arr[0, 0]) diff --git a/pystencils/boundaries/boundaryhandling.py b/pystencils/boundaries/boundaryhandling.py index 2be86510ede07d50d2abfb4868ecf92157bb5c6d..53c3980e2d2c9c947d45410d03017da135d4a843 100644 --- a/pystencils/boundaries/boundaryhandling.py +++ b/pystencils/boundaries/boundaryhandling.py @@ -9,7 +9,7 @@ from pystencils.backends.cbackend import CustomCodeNode from pystencils.boundaries.createindexlist import ( create_boundary_index_array, numpy_data_type_for_boundary_object) from pystencils.typing import TypedSymbol, create_type -from pystencils.datahandling.pycuda import PyCudaArrayHandler +from pystencils.gpu.gpu_array_handler import GPUArrayHandler from pystencils.field import Field from pystencils.typing.typed_sympy import FieldPointerSymbol @@ -18,6 +18,7 @@ try: import waLBerla as wlb if wlb.cpp_available: from pystencils.datahandling.parallel_datahandling import ParallelDataHandling + import cupy.cuda.runtime else: ParallelDataHandling = None except ImportError: @@ -100,7 +101,7 @@ class BoundaryHandling: self.flag_interface = fi if fi is not None else FlagInterface(data_handling, name + "Flags") if ParallelDataHandling and isinstance(self.data_handling, ParallelDataHandling): - array_handler = PyCudaArrayHandler() + array_handler = GPUArrayHandler(cupy.cuda.runtime.getDevice()) else: array_handler = self.data_handling.array_handler @@ -116,7 +117,8 @@ class BoundaryHandling: for obj, cpu_arr in cpu_version.items(): if obj not in gpu_version or gpu_version[obj].shape != cpu_arr.shape: - gpu_version[obj] = array_handler.to_gpu(cpu_arr) + gpu_version[obj] = array_handler.empty(cpu_arr.shape, cpu_arr.dtype) + array_handler.upload(gpu_version[obj], cpu_arr) else: array_handler.upload(gpu_version[obj], cpu_arr) diff --git a/pystencils/config.py b/pystencils/config.py index 23570d625dc96257ad3e6c420f5e1a54467479cb..3c03c0d33545bf6d7345139c0d4197c4f89d0027 100644 --- a/pystencils/config.py +++ b/pystencils/config.py @@ -80,7 +80,7 @@ class CreateKernelConfig: """ gpu_indexing: str = 'block' """ - Either 'block' or 'line' , or custom indexing class, see `pystencils.gpucuda.AbstractIndexing` + Either 'block' or 'line' , or custom indexing class, see `pystencils.gpu.AbstractIndexing` """ gpu_indexing_params: MappingProxyType = field(default_factory=lambda: MappingProxyType({})) """ diff --git a/pystencils/cpu/cpujit.py b/pystencils/cpu/cpujit.py index aebefec91d1b2f392b849f79960bf72dee666bf2..b839f87cfc06385e0c48080795c339ce4c88556d 100644 --- a/pystencils/cpu/cpujit.py +++ b/pystencils/cpu/cpujit.py @@ -43,26 +43,30 @@ Then 'cl.exe' is used to compile. For Windows compilers the qualifier should be ``__restrict`` """ +from appdirs import user_cache_dir, user_config_dir +from collections import OrderedDict import hashlib +import importlib.util import json import os import platform import shutil import subprocess +import sysconfig +import tempfile import textwrap -from collections import OrderedDict -from sysconfig import get_paths -from tempfile import TemporaryDirectory, NamedTemporaryFile +import time +import warnings import numpy as np -from appdirs import user_cache_dir, user_config_dir from pystencils import FieldType from pystencils.astnodes import LoopOverCoordinate from pystencils.backends.cbackend import generate_c, get_headers, CFunction -from pystencils.typing import CastFunc, VectorType, VectorMemoryAccess +from pystencils.cpu.msvc_detection import get_environment from pystencils.include import get_pystencils_include_path from pystencils.kernel_wrapper import KernelWrapper +from pystencils.typing import BasicType, CastFunc, VectorType, VectorMemoryAccess from pystencils.utils import atomic_file_write, recursive_dict_update @@ -146,9 +150,7 @@ def read_config(): ('flags', '-Ofast -DNDEBUG -fPIC -march=native -fopenmp -std=c++11'), ('restrict_qualifier', '__restrict__') ]) - if platform.machine() == 'arm64': - default_compiler_config['flags'] = default_compiler_config['flags'].replace('-march=native', '') - elif platform.machine().startswith('ppc64'): + if platform.machine().startswith('ppc64') or platform.machine() == 'arm64': default_compiler_config['flags'] = default_compiler_config['flags'].replace('-march=native', '-mcpu=native') elif platform.system().lower() == 'windows': @@ -159,6 +161,9 @@ def read_config(): ('flags', '/Ox /fp:fast /OpenMP /arch:avx'), ('restrict_qualifier', '__restrict') ]) + if platform.machine() == 'ARM64': + default_compiler_config['arch'] = 'ARM64' + default_compiler_config['flags'] = default_compiler_config['flags'].replace(' /arch:avx', '') elif platform.system().lower() == 'darwin': default_compiler_config = OrderedDict([ ('os', 'darwin'), @@ -174,8 +179,8 @@ def read_config(): default_compiler_config['flags'] += ' ' + libomp break else: - raise ValueError("The detection of the platform with platform.system() did not work. " - "Pystencils is only supported for linux, windows, and darwin platforms.") + raise NotImplementedError('Generation of default compiler flags for %s is not implemented' % + (platform.system(),)) default_cache_config = OrderedDict([ ('object_cache', os.path.join(user_cache_dir('pystencils'), 'objectcache')), @@ -215,12 +220,11 @@ def read_config(): shutil.rmtree(config['cache']['object_cache'], ignore_errors=True) create_folder(config['cache']['object_cache'], False) - with NamedTemporaryFile('w', dir=os.path.dirname(cache_status_file), delete=False) as f: + with tempfile.NamedTemporaryFile('w', dir=os.path.dirname(cache_status_file), delete=False) as f: json.dump(config['compiler'], f, indent=4) os.replace(f.name, cache_status_file) if config['compiler']['os'] == 'windows': - from pystencils.cpu.msvc_detection import get_environment msvc_env = get_environment(config['compiler']['msvc_version'], config['compiler']['arch']) if 'env' not in config['compiler']: config['compiler']['env'] = {} @@ -393,7 +397,8 @@ def create_function_boilerplate_code(parameter_info, name, ast_node, insert_chec has_nontemporal = has_nontemporal or any([a.args[0].field == field and a.args[3] for a in loop.atoms(VectorMemoryAccess)]) if has_openmp and has_nontemporal: - byte_width = ast_node.instruction_set['cachelineSize'] + cl_size = ast_node.instruction_set['cachelineSize'] + byte_width = f"({cl_size}) < SIZE_MAX ? ({cl_size}) : ({byte_width})" offset = max(max(ast_node.ghost_layers)) * item_size offset_cond = f"(((uintptr_t) buffer_{field.name}.buf) + {offset}) % ({byte_width}) == 0" @@ -468,18 +473,15 @@ def create_module_boilerplate_code(module_name, names): def load_kernel_from_file(module_name, function_name, path): - from importlib.util import spec_from_file_location, module_from_spec try: - spec = spec_from_file_location(name=module_name, location=path) - mod = module_from_spec(spec) + spec = importlib.util.spec_from_file_location(name=module_name, location=path) + mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) except ImportError: - import time - import warnings warnings.warn(f"Could not load {path}, trying on more time in 5 seconds ...") time.sleep(5) - spec = spec_from_file_location(name=module_name, location=path) - mod = module_from_spec(spec) + spec = importlib.util.spec_from_file_location(name=module_name, location=path) + mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) return getattr(mod, function_name) @@ -518,9 +520,13 @@ class ExtensionModuleCode: headers = {'<math.h>', '<stdint.h>'} for ast in self._ast_nodes: + for field in ast.fields_accessed: + if isinstance(field.dtype, BasicType) and field.dtype.is_half(): + # Add the half precision header only if half precision numbers occur in the AST + headers.add('"half_precision.h"') headers.update(get_headers(ast)) - header_list = list(headers) - header_list.sort() + + header_list = sorted(headers) header_list.insert(0, '"Python.h"') ps_headers = [os.path.join(os.path.dirname(__file__), '..', 'include', h[1:-1]) for h in header_list if os.path.exists(os.path.join(os.path.dirname(__file__), '..', 'include', h[1:-1]))] @@ -557,7 +563,7 @@ def compile_module(code, code_hash, base_dir, compile_flags=None): compile_flags = [] compiler_config = get_compiler_config() - extra_flags = ['-I' + get_paths()['include'], '-I' + get_pystencils_include_path()] + compile_flags + extra_flags = ['-I' + sysconfig.get_paths()['include'], '-I' + get_pystencils_include_path()] + compile_flags if compiler_config['os'].lower() == 'windows': lib_suffix = '.pyd' @@ -591,7 +597,6 @@ def compile_module(code, code_hash, base_dir, compile_flags=None): # Linking if windows: - import sysconfig config_vars = sysconfig.get_config_vars() py_lib = os.path.join(config_vars["installed_base"], "libs", f"python{config_vars['py_version_nodot']}.lib") @@ -625,7 +630,7 @@ def compile_and_load(ast, custom_backend=None): compile_flags = ast.instruction_set['compile_flags'] if cache_config['object_cache'] is False: - with TemporaryDirectory() as base_dir: + with tempfile.TemporaryDirectory() as base_dir: lib_file = compile_module(code, code_hash_str, base_dir, compile_flags=compile_flags) result = load_kernel_from_file(code_hash_str, ast.function_name, lib_file) else: diff --git a/pystencils/datahandling/__init__.py b/pystencils/datahandling/__init__.py index 7f142428cf14b62813a7b9b1b245ffae021c1fb8..18053d2d9d6546bcb5ac2093f5f63c1633965a4e 100644 --- a/pystencils/datahandling/__init__.py +++ b/pystencils/datahandling/__init__.py @@ -23,7 +23,8 @@ def create_data_handling(domain_size: Tuple[int, ...], default_layout: str = 'SoA', default_target: Target = Target.CPU, parallel: bool = False, - default_ghost_layers: int = 1) -> DataHandling: + default_ghost_layers: int = 1, + device_number: Union[int, None] = None) -> DataHandling: """Creates a data handling instance. Args: @@ -34,6 +35,9 @@ def create_data_handling(domain_size: Tuple[int, ...], default_target: `Target` parallel: if True a parallel domain is created using walberla - each MPI process gets a part of the domain default_ghost_layers: default number of ghost layers if not overwritten in 'add_array' + device_number: If `default_target` is set to 'GPU' and `parallel` is False, a device number should be + specified. If none is given, the device with the largest amount of memory is used. If multiple + devices have the same amount of memory, the one with the lower number is used """ if isinstance(default_target, str): new_target = Target[default_target.upper()] @@ -69,7 +73,8 @@ def create_data_handling(domain_size: Tuple[int, ...], periodicity=periodicity, default_target=default_target, default_layout=default_layout, - default_ghost_layers=default_ghost_layers) + default_ghost_layers=default_ghost_layers, + device_number=device_number) __all__ = ['create_data_handling'] diff --git a/pystencils/datahandling/blockiteration.py b/pystencils/datahandling/blockiteration.py index bd981dc318cd855c496b70eef5e6bb847c24f2b5..24c4282126912e712769f3cbc74036d790bada21 100644 --- a/pystencils/datahandling/blockiteration.py +++ b/pystencils/datahandling/blockiteration.py @@ -115,7 +115,7 @@ class ParallelBlock(Block): result = wlb.field.toArray(result, with_ghost_layers=self._gls) result = self._normalize_array_shape(result) elif 'GpuField' in type_name: - result = wlb.cuda.toGpuArray(result, with_ghost_layers=self._gls) + result = wlb.gpu.toGpuArray(result, with_ghost_layers=self._gls) result = self._normalize_array_shape(result) return result diff --git a/pystencils/datahandling/datahandling_interface.py b/pystencils/datahandling/datahandling_interface.py index d6dc7b4ea75de2108e8818c4f3764659cfed3f0d..d7a49bab0473fe0be8b7bb95a11a7df9ffb70cbb 100644 --- a/pystencils/datahandling/datahandling_interface.py +++ b/pystencils/datahandling/datahandling_interface.py @@ -331,6 +331,7 @@ class DataHandling(ABC): b[array_name][(Ellipsis, *value_idx)].fill(val) else: b[array_name].fill(val) + self.to_gpu(array_name) def min(self, array_name, slice_obj=None, ghost_layers=False, inner_ghost_layers=False, reduce=True): """Returns the minimum value inside the domain or slice of the domain. diff --git a/pystencils/datahandling/parallel_datahandling.py b/pystencils/datahandling/parallel_datahandling.py index 9d1e898d7368c22faf6c1699a619587cb1c613a1..d9d91cd6c364469ae574ed9a3b5322e44977f6f1 100644 --- a/pystencils/datahandling/parallel_datahandling.py +++ b/pystencils/datahandling/parallel_datahandling.py @@ -151,8 +151,8 @@ class ParallelDataHandling(DataHandling): if gpu: if alignment != 0: raise ValueError("Alignment for walberla GPU fields not yet supported") - wlb.cuda.addGpuFieldToStorage(self.blocks, self.GPU_DATA_PREFIX + name, dtype, fSize=values_per_cell, - usePitchedMem=False, ghostLayers=ghost_layers, layout=layout_map[layout]) + wlb.gpu.addGpuFieldToStorage(self.blocks, self.GPU_DATA_PREFIX + name, dtype, fSize=values_per_cell, + usePitchedMem=False, ghostLayers=ghost_layers, layout=layout_map[layout]) if cpu and gpu: self._cpu_gpu_pairs.append((name, self.GPU_DATA_PREFIX + name)) @@ -255,7 +255,7 @@ class ParallelDataHandling(DataHandling): def get_kernel_kwargs(self, kernel_function, **kwargs): if kernel_function.ast.backend == Backend.CUDA: name_map = self._field_name_to_gpu_data_name - to_array = wlb.cuda.toGpuArray + to_array = wlb.gpu.toGpuArray else: name_map = self._field_name_to_cpu_data_name to_array = wlb.field.toArray @@ -280,7 +280,8 @@ class ParallelDataHandling(DataHandling): for block in self.blocks: transfer_func(block[self.GPU_DATA_PREFIX + name], block[name]) else: - wlb.cuda.copyFieldToCpu(self.blocks, self.GPU_DATA_PREFIX + name, name) + if self.is_on_gpu(name): + wlb.gpu.copyFieldToCpu(self.blocks, self.GPU_DATA_PREFIX + name, name) def to_gpu(self, name): if name in self._custom_data_transfer_functions: @@ -288,20 +289,21 @@ class ParallelDataHandling(DataHandling): for block in self.blocks: transfer_func(block[self.GPU_DATA_PREFIX + name], block[name]) else: - wlb.cuda.copyFieldToGpu(self.blocks, self.GPU_DATA_PREFIX + name, name) + if self.is_on_gpu(name): + wlb.gpu.copyFieldToGpu(self.blocks, self.GPU_DATA_PREFIX + name, name) def is_on_gpu(self, name): return (name, self.GPU_DATA_PREFIX + name) in self._cpu_gpu_pairs def all_to_cpu(self): for cpu_name, gpu_name in self._cpu_gpu_pairs: - wlb.cuda.copyFieldToCpu(self.blocks, gpu_name, cpu_name) + wlb.gpu.copyFieldToCpu(self.blocks, gpu_name, cpu_name) for name in self._custom_data_transfer_functions.keys(): self.to_cpu(name) def all_to_gpu(self): for cpu_name, gpu_name in self._cpu_gpu_pairs: - wlb.cuda.copyFieldToGpu(self.blocks, gpu_name, cpu_name) + wlb.gpu.copyFieldToGpu(self.blocks, gpu_name, cpu_name) for name in self._custom_data_transfer_functions.keys(): self.to_gpu(name) @@ -328,7 +330,7 @@ class ParallelDataHandling(DataHandling): create_packing = wlb.field.createStencilRestrictedPackInfo else: assert target == Target.GPU - create_packing = wlb.cuda.createPackInfo if buffered else wlb.cuda.createMPIDatatypeInfo + create_packing = wlb.gpu.createPackInfo if buffered else wlb.gpu.createMPIDatatypeInfo names = [self.GPU_DATA_PREFIX + name for name in names] sync_function = create_scheme(self.blocks, stencil) diff --git a/pystencils/datahandling/pycuda.py b/pystencils/datahandling/pycuda.py deleted file mode 100644 index 1c65a1e9b51ea561be573a0d271b719a01dab66d..0000000000000000000000000000000000000000 --- a/pystencils/datahandling/pycuda.py +++ /dev/null @@ -1,52 +0,0 @@ -try: - import pycuda.gpuarray as gpuarray -except ImportError: - gpuarray = None -import numpy as np - -import pystencils - - -class PyCudaArrayHandler: - - def __init__(self): - import pycuda.autoinit # NOQA - - def zeros(self, shape, dtype=np.float64, order='C'): - cpu_array = np.zeros(shape=shape, dtype=dtype, order=order) - return self.to_gpu(cpu_array) - - def ones(self, shape, dtype=np.float64, order='C'): - cpu_array = np.ones(shape=shape, dtype=dtype, order=order) - return self.to_gpu(cpu_array) - - def empty(self, shape, dtype=np.float64, layout=None): - if layout: - cpu_array = pystencils.field.create_numpy_array_with_layout(shape=shape, dtype=dtype, layout=layout) - return self.to_gpu(cpu_array) - else: - return gpuarray.empty(shape, dtype) - - @staticmethod - def to_gpu(array): - return gpuarray.to_gpu(array) - - @staticmethod - def upload(array, numpy_array): - array.set(numpy_array) - - @staticmethod - def download(array, numpy_array): - array.get(numpy_array) - - def randn(self, shape, dtype=np.float64): - cpu_array = np.random.randn(*shape).astype(dtype) - return self.to_gpu(cpu_array) - - from_numpy = to_gpu - - -class PyCudaNotAvailableHandler: - def __getattribute__(self, name): - raise NotImplementedError("Unable to initiaize PyCuda! " - "Try to run `import pycuda.autoinit` to check whether PyCuda is working correctly!") diff --git a/pystencils/datahandling/serial_datahandling.py b/pystencils/datahandling/serial_datahandling.py index 319411fef297e4b74ecb73f0b76ee32419c81aa0..0f5ddb431a869f3326f25b46a4f276268d2afd44 100644 --- a/pystencils/datahandling/serial_datahandling.py +++ b/pystencils/datahandling/serial_datahandling.py @@ -6,11 +6,10 @@ import numpy as np from pystencils.datahandling.blockiteration import SerialBlock from pystencils.datahandling.datahandling_interface import DataHandling -from pystencils.datahandling.pycuda import PyCudaArrayHandler, PyCudaNotAvailableHandler from pystencils.enums import Target -from pystencils.field import ( - Field, FieldType, create_numpy_array_with_layout, layout_string_to_tuple, - spatial_layout_string_to_tuple) +from pystencils.field import (Field, FieldType, create_numpy_array_with_layout, + layout_string_to_tuple, spatial_layout_string_to_tuple) +from pystencils.gpu.gpu_array_handler import GPUArrayHandler, GPUNotAvailableHandler from pystencils.slicing import normalize_slice, remove_ghost_layers from pystencils.utils import DotDict @@ -23,7 +22,8 @@ class SerialDataHandling(DataHandling): default_layout: str = 'SoA', periodicity: Union[bool, Sequence[bool]] = False, default_target: Target = Target.CPU, - array_handler=None) -> None: + array_handler=None, + device_number=None) -> None: """ Creates a data handling for single node simulations. @@ -31,9 +31,17 @@ class SerialDataHandling(DataHandling): domain_size: size of the spatial domain as tuple default_ghost_layers: default number of ghost layers used, if not overridden in add_array() method default_layout: default layout used, if not overridden in add_array() method + periodicity: List of booleans that indicate which dimensions have periodic boundary conditions. + Alternatively, a single boolean can be given, which is used for all dimensions. Defaults to + False (non-periodic) default_target: `Target` either 'CPU' or 'GPU'. If set to 'GPU' for each array also a GPU version is allocated if not overwritten in add_array, and synchronization functions are for the GPU by default + array_handler: An object that provides the same interface as `GPUArrayHandler`, which is used for creation + and transferring of GPU arrays. Default is to construct a fresh `GPUArrayHandler` + device_number: If `default_target` is set to 'GPU', a device number should be specified. If none is given, + the device with the largest amount of memory is used. If multiple devices have the same + amount of memory, the one with the lower number is used """ super(SerialDataHandling, self).__init__() self._domainSize = tuple(domain_size) @@ -48,9 +56,14 @@ class SerialDataHandling(DataHandling): if not array_handler: try: - self.array_handler = PyCudaArrayHandler() - except Exception: - self.array_handler = PyCudaNotAvailableHandler() + if device_number is None: + import cupy.cuda.runtime + if cupy.cuda.runtime.getDeviceCount() > 0: + device_number = sorted(range(cupy.cuda.runtime.getDeviceCount()), + key=lambda i: cupy.cuda.Device(i).mem_info[1], reverse=True)[0] + self.array_handler = GPUArrayHandler(device_number) + except ImportError: + self.array_handler = GPUNotAvailableHandler() else: self.array_handler = array_handler @@ -126,10 +139,14 @@ class SerialDataHandling(DataHandling): else: layout_tuple = spatial_layout_string_to_tuple(layout, self.dim) - # cpu_arr is always created - since there is no create_pycuda_array_with_layout() + # cpu_arr is always created - since there is no create_gpu_array_with_layout() byte_offset = ghost_layers * np.dtype(dtype).itemsize - cpu_arr = create_numpy_array_with_layout(layout=layout_tuple, alignment=alignment, - byte_offset=byte_offset, **kwargs) + + if gpu: + cpu_arr = self.array_handler.pinned_numpy_array(shape=kwargs['shape'], layout=layout_tuple, dtype=dtype) + else: + cpu_arr = create_numpy_array_with_layout(layout=layout_tuple, alignment=alignment, + byte_offset=byte_offset, **kwargs) if alignment and gpu: raise NotImplementedError("Alignment for GPU fields not supported") @@ -251,14 +268,16 @@ class SerialDataHandling(DataHandling): transfer_func = self._custom_data_transfer_functions[name][1] transfer_func(self.custom_data_gpu[name], self.custom_data_cpu[name]) else: - self.array_handler.download(self.gpu_arrays[name], self.cpu_arrays[name]) + if name in self.cpu_arrays.keys() & self.gpu_arrays.keys(): + self.array_handler.download(self.gpu_arrays[name], self.cpu_arrays[name]) def to_gpu(self, name): if name in self._custom_data_transfer_functions: transfer_func = self._custom_data_transfer_functions[name][0] transfer_func(self.custom_data_gpu[name], self.custom_data_cpu[name]) else: - self.array_handler.upload(self.gpu_arrays[name], self.cpu_arrays[name]) + if name in self.cpu_arrays.keys() & self.gpu_arrays.keys(): + self.array_handler.upload(self.gpu_arrays[name], self.cpu_arrays[name]) def is_on_gpu(self, name): return name in self.gpu_arrays @@ -313,7 +332,7 @@ class SerialDataHandling(DataHandling): result.append(functor(filtered_stencil, ghost_layers=gls)) else: if functor is None: - from pystencils.gpucuda.periodicity import get_periodic_boundary_functor as functor + from pystencils.gpu.periodicity import get_periodic_boundary_functor as functor target = Target.GPU result.append(functor(filtered_stencil, self._domainSize, index_dimensions=self.fields[name].index_dimensions, @@ -419,13 +438,19 @@ class SerialDataHandling(DataHandling): def world_rank(self): return 0 - def save_all(self, file): - np.savez_compressed(file, **self.cpu_arrays) + def save_all(self, filename, compressed=True, synchronise_data=True): + if synchronise_data: + for name in (self.cpu_arrays.keys() & self.gpu_arrays.keys()): + self.to_cpu(name) + if compressed: + np.savez_compressed(filename, **self.cpu_arrays) + else: + np.savez(filename, **self.cpu_arrays) - def load_all(self, file): - if '.npz' not in file: - file += '.npz' - file_contents = np.load(file) + def load_all(self, filename, synchronise_data=True): + if '.npz' not in filename: + filename += '.npz' + file_contents = np.load(filename) for arr_name, arr_contents in self.cpu_arrays.items(): if arr_name not in file_contents: print(f"Skipping read data {arr_name} because there is no data with this name in data handling") @@ -435,3 +460,6 @@ class SerialDataHandling(DataHandling): f"Read array shape {file_contents[arr_name].shape}, existing array shape {arr_contents.shape}") continue np.copyto(arr_contents, file_contents[arr_name]) + if synchronise_data: + if arr_name in self.gpu_arrays.keys(): + self.to_gpu(arr_name) diff --git a/pystencils/gpu/__init__.py b/pystencils/gpu/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c0d1fd34d7d8028469d68aaa694f88c3e607e9ee --- /dev/null +++ b/pystencils/gpu/__init__.py @@ -0,0 +1,9 @@ +from pystencils.gpu.gpu_array_handler import GPUArrayHandler, GPUNotAvailableHandler +from pystencils.gpu.gpujit import make_python_function +from pystencils.gpu.kernelcreation import create_cuda_kernel, created_indexed_cuda_kernel + +from .indexing import AbstractIndexing, BlockIndexing, LineIndexing + +__all__ = ['GPUArrayHandler', 'GPUNotAvailableHandler', + 'create_cuda_kernel', 'created_indexed_cuda_kernel', 'make_python_function', + 'AbstractIndexing', 'BlockIndexing', 'LineIndexing'] diff --git a/pystencils/gpu/gpu_array_handler.py b/pystencils/gpu/gpu_array_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..ab5cad9a8e0c9a0a98905343214312ca7f03541c --- /dev/null +++ b/pystencils/gpu/gpu_array_handler.py @@ -0,0 +1,98 @@ +try: + import cupy as cp + import cupyx as cpx +except ImportError: + cp = None + cpx = None + +import numpy as np + + +class GPUArrayHandler: + def __init__(self, device_number): + self._device_number = device_number + + def zeros(self, shape, dtype=np.float64, order='C'): + with cp.cuda.Device(self._device_number): + return cp.zeros(shape=shape, dtype=dtype, order=order) + + def ones(self, shape, dtype=np.float64, order='C'): + with cp.cuda.Device(self._device_number): + return cp.ones(shape=shape, dtype=dtype, order=order) + + def empty(self, shape, dtype=np.float64, order='C'): + with cp.cuda.Device(self._device_number): + return cp.empty(shape=shape, dtype=dtype, order=order) + + def to_gpu(self, numpy_array): + swaps = _get_index_swaps(numpy_array) + if numpy_array.base is not None and isinstance(numpy_array.base, np.ndarray): + with cp.cuda.Device(self._device_number): + gpu_array = cp.asarray(numpy_array.base) + for a, b in reversed(swaps): + gpu_array = gpu_array.swapaxes(a, b) + return gpu_array + else: + return cp.asarray(numpy_array) + + def upload(self, array, numpy_array): + assert self._device_number == array.device.id + if numpy_array.base is not None and isinstance(numpy_array.base, np.ndarray): + with cp.cuda.Device(self._device_number): + array.base.set(numpy_array.base) + else: + with cp.cuda.Device(self._device_number): + array.set(numpy_array) + + def download(self, array, numpy_array): + assert self._device_number == array.device.id + if numpy_array.base is not None and isinstance(numpy_array.base, np.ndarray): + with cp.cuda.Device(self._device_number): + numpy_array.base[:] = array.base.get() + else: + with cp.cuda.Device(self._device_number): + numpy_array[:] = array.get() + + def randn(self, shape, dtype=np.float64): + with cp.cuda.Device(self._device_number): + return cp.random.randn(*shape, dtype=dtype) + + @staticmethod + def pinned_numpy_array(layout, shape, dtype): + assert set(layout) == set(range(len(shape))), "Wrong layout descriptor" + cur_layout = list(range(len(shape))) + swaps = [] + for i in range(len(layout)): + if cur_layout[i] != layout[i]: + index_to_swap_with = cur_layout.index(layout[i]) + swaps.append((i, index_to_swap_with)) + cur_layout[i], cur_layout[index_to_swap_with] = cur_layout[index_to_swap_with], cur_layout[i] + assert tuple(cur_layout) == tuple(layout) + + shape = list(shape) + for a, b in swaps: + shape[a], shape[b] = shape[b], shape[a] + + res = cpx.empty_pinned(tuple(shape), order='c', dtype=dtype) + + for a, b in reversed(swaps): + res = res.swapaxes(a, b) + return res + + from_numpy = to_gpu + + +class GPUNotAvailableHandler: + def __getattribute__(self, name): + raise NotImplementedError("Unable to utilise cupy! Please make sure cupy works correctly in your setup!") + + +def _get_index_swaps(array): + swaps = [] + if array.base is not None and isinstance(array.base, np.ndarray): + for stride in array.base.strides: + index_base = array.base.strides.index(stride) + index_view = array.strides.index(stride) + if index_base != index_view and (index_view, index_base) not in swaps: + swaps.append((index_base, index_view)) + return swaps diff --git a/pystencils/gpucuda/cudajit.py b/pystencils/gpu/gpujit.py similarity index 64% rename from pystencils/gpucuda/cudajit.py rename to pystencils/gpu/gpujit.py index b6fb901750895b341d44fde26040ff3b91d0e9e9..52268924126870508c921a8569f6579707e72fda 100644 --- a/pystencils/gpucuda/cudajit.py +++ b/pystencils/gpu/gpujit.py @@ -4,9 +4,9 @@ from pystencils.backends.cbackend import get_headers from pystencils.backends.cuda_backend import generate_cuda from pystencils.typing import StructType from pystencils.field import FieldType -from pystencils.include import get_pycuda_include_path, get_pystencils_include_path +from pystencils.include import get_pystencils_include_path from pystencils.kernel_wrapper import KernelWrapper -from pystencils.typing.typed_sympy import FieldPointerSymbol +from pystencils.typing import BasicType, FieldPointerSymbol USE_FAST_MATH = True @@ -21,39 +21,49 @@ def get_cubic_interpolation_include_paths(): def make_python_function(kernel_function_node, argument_dict=None, custom_backend=None): """ Creates a kernel function from an abstract syntax tree which - was created e.g. by :func:`pystencils.gpucuda.create_cuda_kernel` - or :func:`pystencils.gpucuda.created_indexed_cuda_kernel` + was created e.g. by :func:`pystencils.gpu.create_cuda_kernel` + or :func:`pystencils.gpu.created_indexed_cuda_kernel` Args: kernel_function_node: the abstract syntax tree argument_dict: parameters passed here are already fixed. Remaining parameters have to be passed to the returned kernel functor. + custom_backend: use own custom printer for code generation Returns: compiled kernel as Python function """ - import pycuda.autoinit # NOQA - from pycuda.compiler import SourceModule + import cupy as cp if argument_dict is None: argument_dict = {} - header_list = ['<cstdint>'] + list(get_headers(kernel_function_node)) + headers = get_headers(kernel_function_node) + if cp.cuda.runtime.is_hip: + headers.add('"gpu_defines.h"') + for field in kernel_function_node.fields_accessed: + if isinstance(field.dtype, BasicType) and field.dtype.is_half(): + headers.add('<hip/hip_fp16.h>') + else: + headers.update({'"gpu_defines.h"', '<cstdint>'}) + for field in kernel_function_node.fields_accessed: + if isinstance(field.dtype, BasicType) and field.dtype.is_half(): + headers.add('<cuda_fp16.h>') + + header_list = sorted(headers) includes = "\n".join([f"#include {include_file}" for include_file in header_list]) code = includes + "\n" code += "#define FUNC_PREFIX __global__\n" code += "#define RESTRICT __restrict__\n\n" - code += str(generate_cuda(kernel_function_node, custom_backend=custom_backend)) + code += 'extern "C" {\n%s\n}\n' % str(generate_cuda(kernel_function_node, custom_backend=custom_backend)) - nvcc_options = ["-w", "-std=c++11", "-Wno-deprecated-gpu-targets"] + options = ["-w", "-std=c++11"] if USE_FAST_MATH: - nvcc_options.append("-use_fast_math") - - mod = SourceModule(code, options=nvcc_options, include_dirs=[ - get_pystencils_include_path(), get_pycuda_include_path()]) - func = mod.get_function(kernel_function_node.function_name) + options.append("-use_fast_math") + options.append("-I" + get_pystencils_include_path()) + func = cp.RawKernel(code, kernel_function_node.function_name, options=tuple(options), backend="nvrtc", jitify=True) parameters = kernel_function_node.get_parameters() cache = {} @@ -64,7 +74,10 @@ def make_python_function(kernel_function_node, argument_dict=None, custom_backen for k, v in kwargs.items())) try: args, block_and_thread_numbers = cache[key] - func(*args, **block_and_thread_numbers) + device = set(a.device.id for a in args if type(a) is cp.ndarray) + assert len(device) == 1, "All arrays used by a kernel need to be allocated on the same device" + with cp.cuda.Device(device.pop()): + func(block_and_thread_numbers['grid'], block_and_thread_numbers['block'], args) except KeyError: full_arguments = argument_dict.copy() full_arguments.update(kwargs) @@ -75,11 +88,16 @@ def make_python_function(kernel_function_node, argument_dict=None, custom_backen block_and_thread_numbers['block'] = tuple(int(i) for i in block_and_thread_numbers['block']) block_and_thread_numbers['grid'] = tuple(int(i) for i in block_and_thread_numbers['grid']) - args = _build_numpy_argument_list(parameters, full_arguments) + args = tuple(_build_numpy_argument_list(parameters, full_arguments)) cache[key] = (args, block_and_thread_numbers) cache_values.append(kwargs) # keep objects alive such that ids remain unique - func(*args, **block_and_thread_numbers) - # import pycuda.driver as cuda + device = set(a.device.id for a in args if type(a) is cp.ndarray) + assert len(device) == 1, "All arrays used by a kernel need to be allocated on the same device" + with cp.cuda.Device(device.pop()): + func(block_and_thread_numbers['grid'], block_and_thread_numbers['block'], args) + # useful for debugging: + # cp.cuda.runtime.deviceSynchronize() + # cuda.Context.synchronize() # useful for debugging, to get errors right after kernel was called ast = kernel_function_node parameters = kernel_function_node.get_parameters() @@ -98,8 +116,8 @@ def _build_numpy_argument_list(parameters, argument_dict): actual_type = array.dtype expected_type = param.fields[0].dtype.numpy_dtype if expected_type != actual_type: - raise ValueError("Data type mismatch for field '%s'. Expected '%s' got '%s'." % - (param.field_name, expected_type, actual_type)) + raise ValueError(f"Data type mismatch for field {param.field_name}. " + f"Expected {expected_type} got {actual_type}.") result.append(array) elif param.is_field_stride: cast_to_dtype = param.symbol.dtype.numpy_dtype.type @@ -134,22 +152,22 @@ def _check_arguments(parameter_specification, argument_dict): try: field_arr = argument_dict[symbolic_field.name] except KeyError: - raise KeyError("Missing field parameter for kernel call " + str(symbolic_field)) + raise KeyError(f"Missing field parameter for kernel call {str(symbolic_field)}") if symbolic_field.has_fixed_shape: symbolic_field_shape = tuple(int(i) for i in symbolic_field.shape) if isinstance(symbolic_field.dtype, StructType): symbolic_field_shape = symbolic_field_shape[:-1] if symbolic_field_shape != field_arr.shape: - raise ValueError("Passed array '%s' has shape %s which does not match expected shape %s" % - (symbolic_field.name, str(field_arr.shape), str(symbolic_field.shape))) + raise ValueError(f"Passed array {symbolic_field.name} has shape {str(field_arr.shape)} " + f"which does not match expected shape {str(symbolic_field.shape)}") if symbolic_field.has_fixed_shape: symbolic_field_strides = tuple(int(i) * field_arr.dtype.itemsize for i in symbolic_field.strides) if isinstance(symbolic_field.dtype, StructType): symbolic_field_strides = symbolic_field_strides[:-1] if symbolic_field_strides != field_arr.strides: - raise ValueError("Passed array '%s' has strides %s which does not match expected strides %s" % - (symbolic_field.name, str(field_arr.strides), str(symbolic_field_strides))) + raise ValueError(f"Passed array {symbolic_field.name} has strides {str(field_arr.strides)} " + f"which does not match expected strides {str(symbolic_field_strides)}") if FieldType.is_indexed(symbolic_field): index_arr_shapes.add(field_arr.shape[:symbolic_field.spatial_dimensions]) @@ -157,9 +175,9 @@ def _check_arguments(parameter_specification, argument_dict): array_shapes.add(field_arr.shape[:symbolic_field.spatial_dimensions]) if len(array_shapes) > 1: - raise ValueError("All passed arrays have to have the same size " + str(array_shapes)) + raise ValueError(f"All passed arrays have to have the same size {str(array_shapes)}") if len(index_arr_shapes) > 1: - raise ValueError("All passed index arrays have to have the same size " + str(array_shapes)) + raise ValueError(f"All passed index arrays have to have the same size {str(array_shapes)}") if len(index_arr_shapes) > 0: return list(index_arr_shapes)[0] diff --git a/pystencils/gpucuda/indexing.py b/pystencils/gpu/indexing.py similarity index 83% rename from pystencils/gpucuda/indexing.py rename to pystencils/gpu/indexing.py index 423b115837bda768ec8313abdc50c9a5ac017085..05837445af9649906498ee988b18a4bb973804dc 100644 --- a/pystencils/gpucuda/indexing.py +++ b/pystencils/gpu/indexing.py @@ -1,5 +1,6 @@ import abc from functools import partial +import math import sympy as sp from sympy.core.cache import cacheit @@ -33,7 +34,7 @@ GRID_DIM = [ThreadIndexingSymbol("gridDim." + coord, create_type("int32")) for c class AbstractIndexing(abc.ABC): """ Abstract base class for all Indexing classes. An Indexing class defines how a multidimensional - field is mapped to CUDA's block and grid system. It calculates indices based on CUDA's thread and block indices + field is mapped to GPU's block and grid system. It calculates indices based on GPU's thread and block indices and computes the number of blocks and threads a kernel is started with. The Indexing class is created with a pystencils field, a slice to iterate over, and further optional parameters that must have default values. """ @@ -41,12 +42,12 @@ class AbstractIndexing(abc.ABC): @property @abc.abstractmethod def coordinates(self): - """Returns a sequence of coordinate expressions for (x,y,z) depending on symbolic CUDA block and thread indices. + """Returns a sequence of coordinate expressions for (x,y,z) depending on symbolic GPU block and thread indices. These symbolic indices can be obtained with the method `index_variables` """ @property def index_variables(self): - """Sympy symbols for CUDA's block and thread indices, and block and grid dimensions. """ + """Sympy symbols for GPU's block and thread indices, and block and grid dimensions. """ return BLOCK_IDX + THREAD_IDX + BLOCK_DIM + GRID_DIM @abc.abstractmethod @@ -88,19 +89,22 @@ class AbstractIndexing(abc.ABC): class BlockIndexing(AbstractIndexing): - """Generic indexing scheme that maps sub-blocks of an array to CUDA blocks. + """Generic indexing scheme that maps sub-blocks of an array to GPU blocks. Args: field: pystencils field (common to all Indexing classes) iteration_slice: slice that defines rectangular subarea which is iterated over permute_block_size_dependent_on_layout: if True the block_size is permuted such that the fastest coordinate gets the largest amount of threads - compile_time_block_size: compile in concrete block size, otherwise the cuda variable 'blockDim' is used + compile_time_block_size: compile in concrete block size, otherwise the gpu variable 'blockDim' is used + maximum_block_size: maximum block size that is possible for the GPU. Set to 'auto' to let cupy define the + maximum block size from the device properties + device_number: device number of the used GPU. By default, the zeroth device is used. """ def __init__(self, field, iteration_slice, block_size=(16, 16, 1), permute_block_size_dependent_on_layout=True, compile_time_block_size=False, - maximum_block_size=(1024, 1024, 64)): + maximum_block_size=(1024, 1024, 64), device_number=None): if field.spatial_dimensions > 3: raise NotImplementedError("This indexing scheme supports at most 3 spatial dimensions") @@ -109,20 +113,22 @@ class BlockIndexing(AbstractIndexing): self._block_size = block_size if maximum_block_size == 'auto': + assert device_number is not None, 'If "maximum_block_size" is set to "auto" a device number must be stated' # Get device limits - import pycuda.driver as cuda - # noinspection PyUnresolvedReferences - import pycuda.autoinit # NOQA - da = cuda.device_attribute - device = cuda.Context.get_device() - maximum_block_size = tuple(device.get_attribute(a) - for a in (da.MAX_BLOCK_DIM_X, da.MAX_BLOCK_DIM_Y, da.MAX_BLOCK_DIM_Z)) + import cupy as cp + # See https://github.com/cupy/cupy/issues/7676 + if cp.cuda.runtime.is_hip: + maximum_block_size = tuple(cp.cuda.runtime.deviceGetAttribute(i, device_number) for i in range(26, 29)) + else: + da = cp.cuda.Device(device_number).attributes + maximum_block_size = tuple(da[f"MaxBlockDim{c}"] for c in ["X", "Y", "Z"]) self._maximum_block_size = maximum_block_size self._iterationSlice = normalize_slice(iteration_slice, field.spatial_shape) self._dim = field.spatial_dimensions self._symbolic_shape = [e if isinstance(e, sp.Basic) else None for e in field.spatial_shape] self._compile_time_block_size = compile_time_block_size + self._device_number = device_number @property def cuda_indices(self): @@ -180,35 +186,34 @@ class BlockIndexing(AbstractIndexing): def iteration_space(self, arr_shape): return _iteration_space(self._iterationSlice, arr_shape) - @staticmethod - def limit_block_size_by_register_restriction(block_size, required_registers_per_thread, device=None): - """Shrinks the block_size if there are too many registers used per multiprocessor. + def limit_block_size_by_register_restriction(self, block_size, required_registers_per_thread): + """Shrinks the block_size if there are too many registers used per block. This is not done automatically, since the required_registers_per_thread are not known before compilation. - They can be obtained by ``func.num_regs`` from a pycuda function. - :returns smaller block_size if too many registers are used. + They can be obtained by ``func.num_regs`` from a cupy function. + Args: + block_size: used block size that is target for limiting + required_registers_per_thread: needed registers per thread + returns: smaller block_size if too many registers are used. """ - import pycuda.driver as cuda - # noinspection PyUnresolvedReferences - import pycuda.autoinit # NOQA + import cupy as cp - da = cuda.device_attribute - if device is None: - device = cuda.Context.get_device() - available_registers_per_mp = device.get_attribute(da.MAX_REGISTERS_PER_MULTIPROCESSOR) - - block = block_size + # See https://github.com/cupy/cupy/issues/7676 + if cp.cuda.runtime.is_hip: + max_registers_per_block = cp.cuda.runtime.deviceGetAttribute(71, self._device_number) + else: + device = cp.cuda.Device(self._device_number) + da = device.attributes + max_registers_per_block = da.get("MaxRegistersPerBlock") + result = list(block_size) while True: - num_threads = 1 - for t in block: - num_threads *= t - required_registers_per_mt = num_threads * required_registers_per_thread - if required_registers_per_mt <= available_registers_per_mp: - return block + required_registers = math.prod(result) * required_registers_per_thread + if required_registers <= max_registers_per_block: + return result else: - largest_grid_entry_idx = max(range(len(block)), key=lambda e: block[e]) - assert block[largest_grid_entry_idx] >= 2 - block[largest_grid_entry_idx] //= 2 + largest_list_entry_idx = max(range(len(result)), key=lambda e: result[e]) + assert result[largest_list_entry_idx] >= 2 + result[largest_list_entry_idx] //= 2 @staticmethod def permute_block_size_according_to_layout(block_size, layout): @@ -237,10 +242,10 @@ class BlockIndexing(AbstractIndexing): class LineIndexing(AbstractIndexing): """ - Indexing scheme that assigns the innermost 'line' i.e. the elements which are adjacent in memory to a 1D CUDA block. + Indexing scheme that assigns the innermost 'line' i.e. the elements which are adjacent in memory to a 1D GPU block. The fastest coordinate is indexed with thread_idx.x, the remaining coordinates are mapped to block_idx.{x,y,z} This indexing scheme supports up to 4 spatial dimensions, where the innermost dimensions is not larger than the - maximum amount of threads allowed in a CUDA block (which depends on device). + maximum amount of threads allowed in a GPU block (which depends on device). """ def __init__(self, field, iteration_slice): diff --git a/pystencils/gpucuda/kernelcreation.py b/pystencils/gpu/kernelcreation.py similarity index 98% rename from pystencils/gpucuda/kernelcreation.py rename to pystencils/gpu/kernelcreation.py index 96a53138316ac97d4518cc870d7a4dd5f3fed001..066038cde246934d1694ee20613434ac9e3dc678 100644 --- a/pystencils/gpucuda/kernelcreation.py +++ b/pystencils/gpu/kernelcreation.py @@ -8,9 +8,9 @@ from pystencils.typing import StructType, TypedSymbol from pystencils.typing.transformations import add_types from pystencils.field import Field, FieldType from pystencils.enums import Target, Backend -from pystencils.gpucuda.cudajit import make_python_function +from pystencils.gpu.gpujit import make_python_function from pystencils.node_collection import NodeCollection -from pystencils.gpucuda.indexing import indexing_creator_from_params +from pystencils.gpu.indexing import indexing_creator_from_params from pystencils.simp.assignment_collection import AssignmentCollection from pystencils.transformations import ( get_base_buffer_index, get_common_field, parse_base_pointer_info, diff --git a/pystencils/gpucuda/periodicity.py b/pystencils/gpu/periodicity.py similarity index 95% rename from pystencils/gpucuda/periodicity.py rename to pystencils/gpu/periodicity.py index 7cad51654de75c2462d7d846baccc916aa102d4d..21aa95e5672718f79221a38259ab91a95a20366d 100644 --- a/pystencils/gpucuda/periodicity.py +++ b/pystencils/gpu/periodicity.py @@ -2,7 +2,7 @@ import numpy as np from itertools import product from pystencils import CreateKernelConfig, create_kernel -import pystencils.gpucuda +from pystencils.gpu import make_python_function from pystencils import Assignment, Field from pystencils.enums import Target from pystencils.slicing import get_periodic_boundary_src_dst_slices, normalize_slice @@ -40,7 +40,7 @@ def get_periodic_boundary_functor(stencil, domain_size, index_dimensions=0, inde for src_slice, dst_slice in src_dst_slice_tuples: ast = create_copy_kernel(domain_size, src_slice, dst_slice, index_dimensions, index_dim_shape, dtype) - kernels.append(pystencils.gpucuda.make_python_function(ast)) + kernels.append(make_python_function(ast)) def functor(pdfs, **_): for kernel in kernels: diff --git a/pystencils/gpucuda/__init__.py b/pystencils/gpucuda/__init__.py deleted file mode 100644 index e7be5452768f059dffdadf5a375f1dfce036efc9..0000000000000000000000000000000000000000 --- a/pystencils/gpucuda/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from pystencils.gpucuda.cudajit import make_python_function -from pystencils.gpucuda.kernelcreation import create_cuda_kernel, created_indexed_cuda_kernel - -from .indexing import AbstractIndexing, BlockIndexing, LineIndexing - -__all__ = ['create_cuda_kernel', 'created_indexed_cuda_kernel', 'make_python_function', - 'AbstractIndexing', 'BlockIndexing', 'LineIndexing'] diff --git a/pystencils/include/__init__.py b/pystencils/include/__init__.py index 8ddff6a4a8f5f3ceda691cff850dc3377d98278c..6dd3837a186bede394e26572055f2ab9868235c2 100644 --- a/pystencils/include/__init__.py +++ b/pystencils/include/__init__.py @@ -1,10 +1,5 @@ -from os.path import dirname, join, realpath +from os.path import dirname, realpath def get_pystencils_include_path(): return dirname(realpath(__file__)) - - -def get_pycuda_include_path(): - import pycuda - return join(dirname(realpath(pycuda.__file__)), 'cuda') diff --git a/pystencils/include/arm_neon_helpers.h b/pystencils/include/arm_neon_helpers.h index a27b8ff6fa9e7244a8a0467315ed06d3985ed7b6..5ffc6a4f17d46cc5495cfc82d81ed16e7636f040 100644 --- a/pystencils/include/arm_neon_helpers.h +++ b/pystencils/include/arm_neon_helpers.h @@ -1,3 +1,7 @@ +#if defined(_MSC_VER) +#define __ARM_NEON +#endif + #ifdef __ARM_NEON #include <arm_neon.h> #endif @@ -32,10 +36,13 @@ inline int32x4_t makeVec_s32(int a, int b, int c, int d) #endif inline void cachelineZero(void * p) { +#if !defined(_MSC_VER) || defined(__clang__) __asm__ volatile("dc zva, %0"::"r"(p):"memory"); +#endif } inline size_t _cachelineSize() { +#if !defined(_MSC_VER) || defined(__clang__) // check that dc zva is permitted uint64_t dczid; __asm__ volatile ("mrs %0, dczid_el0" : "=r"(dczid)); @@ -72,6 +79,7 @@ inline size_t _cachelineSize() { return size; } } +#endif // too much was zeroed return SIZE_MAX; diff --git a/pystencils/include/cuda_complex.hpp b/pystencils/include/cuda_complex.hpp deleted file mode 100644 index 535aa52e30781a03e170298e8e5ebbed872585dc..0000000000000000000000000000000000000000 --- a/pystencils/include/cuda_complex.hpp +++ /dev/null @@ -1,1228 +0,0 @@ -// An implementation of C++ std::complex for use on CUDA devices. -// Written by John C. Travers <jtravs@gmail.com> (2012) -// -// Missing: -// - long double support (not supported on CUDA) -// - some integral pow functions (due to lack of C++11 support on CUDA) -// -// Heavily derived from the LLVM libcpp project (svn revision 147853). -// Based on libcxx/include/complex. -// The git history contains the complete change history from the original. -// The modifications are licensed as per the original LLVM license below. -// -// -*- C++ -*- -//===--------------------------- complex ----------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -extern "C++" { -#ifndef CUDA_COMPLEX_HPP -#define CUDA_COMPLEX_HPP - -#ifdef __CUDACC__ -#define CUDA_CALLABLE_MEMBER __host__ __device__ -#else -#define CUDA_CALLABLE_MEMBER -#endif - -/* - complex synopsis - -template<class T> -class complex -{ -public: - typedef T value_type; - - complex(const T& re = T(), const T& im = T()); - complex(const complex&); - template<class X> complex(const complex<X>&); - - T real() const; - T imag() const; - - void real(T); - void imag(T); - - complex<T>& operator= (const T&); - complex<T>& operator+=(const T&); - complex<T>& operator-=(const T&); - complex<T>& operator*=(const T&); - complex<T>& operator/=(const T&); - - complex& operator=(const complex&); - template<class X> complex<T>& operator= (const complex<X>&); - template<class X> complex<T>& operator+=(const complex<X>&); - template<class X> complex<T>& operator-=(const complex<X>&); - template<class X> complex<T>& operator*=(const complex<X>&); - template<class X> complex<T>& operator/=(const complex<X>&); -}; - -template<> -class complex<float> -{ -public: - typedef float value_type; - - constexpr complex(float re = 0.0f, float im = 0.0f); - explicit constexpr complex(const complex<double>&); - - constexpr float real() const; - void real(float); - constexpr float imag() const; - void imag(float); - - complex<float>& operator= (float); - complex<float>& operator+=(float); - complex<float>& operator-=(float); - complex<float>& operator*=(float); - complex<float>& operator/=(float); - - complex<float>& operator=(const complex<float>&); - template<class X> complex<float>& operator= (const complex<X>&); - template<class X> complex<float>& operator+=(const complex<X>&); - template<class X> complex<float>& operator-=(const complex<X>&); - template<class X> complex<float>& operator*=(const complex<X>&); - template<class X> complex<float>& operator/=(const complex<X>&); -}; - -template<> -class complex<double> -{ -public: - typedef double value_type; - - constexpr complex(double re = 0.0, double im = 0.0); - constexpr complex(const complex<float>&); - - constexpr double real() const; - void real(double); - constexpr double imag() const; - void imag(double); - - complex<double>& operator= (double); - complex<double>& operator+=(double); - complex<double>& operator-=(double); - complex<double>& operator*=(double); - complex<double>& operator/=(double); - complex<double>& operator=(const complex<double>&); - - template<class X> complex<double>& operator= (const complex<X>&); - template<class X> complex<double>& operator+=(const complex<X>&); - template<class X> complex<double>& operator-=(const complex<X>&); - template<class X> complex<double>& operator*=(const complex<X>&); - template<class X> complex<double>& operator/=(const complex<X>&); -}; - -// 26.3.6 operators: -template<class T> complex<T> operator+(const complex<T>&, const complex<T>&); -template<class T> complex<T> operator+(const complex<T>&, const T&); -template<class T> complex<T> operator+(const T&, const complex<T>&); -template<class T> complex<T> operator-(const complex<T>&, const complex<T>&); -template<class T> complex<T> operator-(const complex<T>&, const T&); -template<class T> complex<T> operator-(const T&, const complex<T>&); -template<class T> complex<T> operator*(const complex<T>&, const complex<T>&); -template<class T> complex<T> operator*(const complex<T>&, const T&); -template<class T> complex<T> operator*(const T&, const complex<T>&); -template<class T> complex<T> operator/(const complex<T>&, const complex<T>&); -template<class T> complex<T> operator/(const complex<T>&, const T&); -template<class T> complex<T> operator/(const T&, const complex<T>&); -template<class T> complex<T> operator+(const complex<T>&); -template<class T> complex<T> operator-(const complex<T>&); -template<class T> bool operator==(const complex<T>&, const complex<T>&); -template<class T> bool operator==(const complex<T>&, const T&); -template<class T> bool operator==(const T&, const complex<T>&); -template<class T> bool operator!=(const complex<T>&, const complex<T>&); -template<class T> bool operator!=(const complex<T>&, const T&); -template<class T> bool operator!=(const T&, const complex<T>&); - -template<class T, class charT, class traits> - basic_istream<charT, traits>& - operator>>(basic_istream<charT, traits>&, complex<T>&); -template<class T, class charT, class traits> - basic_ostream<charT, traits>& - operator<<(basic_ostream<charT, traits>&, const complex<T>&); - -// 26.3.7 values: - -template<class T> T real(const complex<T>&); - double real(double); -template<Integral T> double real(T); - float real(float); - -template<class T> T imag(const complex<T>&); - double imag(double); -template<Integral T> double imag(T); - float imag(float); - -template<class T> T abs(const complex<T>&); - -template<class T> T arg(const complex<T>&); - double arg(double); -template<Integral T> double arg(T); - float arg(float); - -template<class T> T norm(const complex<T>&); - double norm(double); -template<Integral T> double norm(T); - float norm(float); - -template<class T> complex<T> conj(const complex<T>&); - complex<double> conj(double); -template<Integral T> complex<double> conj(T); - complex<float> conj(float); - -template<class T> complex<T> proj(const complex<T>&); - complex<double> proj(double); -template<Integral T> complex<double> proj(T); - complex<float> proj(float); - -template<class T> complex<T> polar(const T&, const T& = 0); - -// 26.3.8 transcendentals: -template<class T> complex<T> acos(const complex<T>&); -template<class T> complex<T> asin(const complex<T>&); -template<class T> complex<T> atan(const complex<T>&); -template<class T> complex<T> acosh(const complex<T>&); -template<class T> complex<T> asinh(const complex<T>&); -template<class T> complex<T> atanh(const complex<T>&); -template<class T> complex<T> cos (const complex<T>&); -template<class T> complex<T> cosh (const complex<T>&); -template<class T> complex<T> exp (const complex<T>&); -template<class T> complex<T> log (const complex<T>&); -template<class T> complex<T> log10(const complex<T>&); - -template<class T> complex<T> pow(const complex<T>&, const T&); -template<class T> complex<T> pow(const complex<T>&, const complex<T>&); -template<class T> complex<T> pow(const T&, const complex<T>&); - -template<class T> complex<T> sin (const complex<T>&); -template<class T> complex<T> sinh (const complex<T>&); -template<class T> complex<T> sqrt (const complex<T>&); -template<class T> complex<T> tan (const complex<T>&); -template<class T> complex<T> tanh (const complex<T>&); - -template<class T, class charT, class traits> - basic_istream<charT, traits>& - operator>>(basic_istream<charT, traits>& is, complex<T>& x); - -template<class T, class charT, class traits> - basic_ostream<charT, traits>& - operator<<(basic_ostream<charT, traits>& o, const complex<T>& x); - -*/ - -#include <math.h> -#include <sstream> - -template <class _Tp> class complex; - -template <class _Tp> -complex<_Tp> operator*(const complex<_Tp> &__z, const complex<_Tp> &__w); -template <class _Tp> -complex<_Tp> operator/(const complex<_Tp> &__x, const complex<_Tp> &__y); - -template <class _Tp> class complex { -public: - typedef _Tp value_type; - -private: - value_type __re_; - value_type __im_; - -public: - CUDA_CALLABLE_MEMBER - complex(const value_type &__re = value_type(), - const value_type &__im = value_type()) - : __re_(__re), __im_(__im) {} - template <class _Xp> - CUDA_CALLABLE_MEMBER complex(const complex<_Xp> &__c) - : __re_(__c.real()), __im_(__c.imag()) {} - - CUDA_CALLABLE_MEMBER value_type real() const { return __re_; } - CUDA_CALLABLE_MEMBER value_type imag() const { return __im_; } - - CUDA_CALLABLE_MEMBER void real(value_type __re) { __re_ = __re; } - CUDA_CALLABLE_MEMBER void imag(value_type __im) { __im_ = __im; } - - CUDA_CALLABLE_MEMBER complex &operator=(const value_type &__re) { - __re_ = __re; - __im_ = value_type(); - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator+=(const value_type &__re) { - __re_ += __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator-=(const value_type &__re) { - __re_ -= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator*=(const value_type &__re) { - __re_ *= __re; - __im_ *= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator/=(const value_type &__re) { - __re_ /= __re; - __im_ /= __re; - return *this; - } - - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator=(const complex<_Xp> &__c) { - __re_ = __c.real(); - __im_ = __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator+=(const complex<_Xp> &__c) { - __re_ += __c.real(); - __im_ += __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator-=(const complex<_Xp> &__c) { - __re_ -= __c.real(); - __im_ -= __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator*=(const complex<_Xp> &__c) { - *this = *this * __c; - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator/=(const complex<_Xp> &__c) { - *this = *this / __c; - return *this; - } -}; - -template <> class complex<double>; - -template <> class complex<float> { - float __re_; - float __im_; - -public: - typedef float value_type; - - /*constexpr*/ CUDA_CALLABLE_MEMBER complex(float __re = 0.0f, - float __im = 0.0f) - : __re_(__re), __im_(__im) {} - explicit /*constexpr*/ complex(const complex<double> &__c); - - /*constexpr*/ CUDA_CALLABLE_MEMBER float real() const { return __re_; } - /*constexpr*/ CUDA_CALLABLE_MEMBER float imag() const { return __im_; } - - CUDA_CALLABLE_MEMBER void real(value_type __re) { __re_ = __re; } - CUDA_CALLABLE_MEMBER void imag(value_type __im) { __im_ = __im; } - - CUDA_CALLABLE_MEMBER complex &operator=(float __re) { - __re_ = __re; - __im_ = value_type(); - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator+=(float __re) { - __re_ += __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator-=(float __re) { - __re_ -= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator*=(float __re) { - __re_ *= __re; - __im_ *= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator/=(float __re) { - __re_ /= __re; - __im_ /= __re; - return *this; - } - - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator=(const complex<_Xp> &__c) { - __re_ = __c.real(); - __im_ = __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator+=(const complex<_Xp> &__c) { - __re_ += __c.real(); - __im_ += __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator-=(const complex<_Xp> &__c) { - __re_ -= __c.real(); - __im_ -= __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator*=(const complex<_Xp> &__c) { - *this = *this * __c; - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator/=(const complex<_Xp> &__c) { - *this = *this / __c; - return *this; - } -}; - -template <> class complex<double> { - double __re_; - double __im_; - -public: - typedef double value_type; - - /*constexpr*/ CUDA_CALLABLE_MEMBER complex(double __re = 0.0, - double __im = 0.0) - : __re_(__re), __im_(__im) {} - /*constexpr*/ complex(const complex<float> &__c); - - /*constexpr*/ CUDA_CALLABLE_MEMBER double real() const { return __re_; } - /*constexpr*/ CUDA_CALLABLE_MEMBER double imag() const { return __im_; } - - CUDA_CALLABLE_MEMBER void real(value_type __re) { __re_ = __re; } - CUDA_CALLABLE_MEMBER void imag(value_type __im) { __im_ = __im; } - - CUDA_CALLABLE_MEMBER complex &operator=(double __re) { - __re_ = __re; - __im_ = value_type(); - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator+=(double __re) { - __re_ += __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator-=(double __re) { - __re_ -= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator*=(double __re) { - __re_ *= __re; - __im_ *= __re; - return *this; - } - CUDA_CALLABLE_MEMBER complex &operator/=(double __re) { - __re_ /= __re; - __im_ /= __re; - return *this; - } - - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator=(const complex<_Xp> &__c) { - __re_ = __c.real(); - __im_ = __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator+=(const complex<_Xp> &__c) { - __re_ += __c.real(); - __im_ += __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator-=(const complex<_Xp> &__c) { - __re_ -= __c.real(); - __im_ -= __c.imag(); - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator*=(const complex<_Xp> &__c) { - *this = *this * __c; - return *this; - } - template <class _Xp> - CUDA_CALLABLE_MEMBER complex &operator/=(const complex<_Xp> &__c) { - *this = *this / __c; - return *this; - } -}; - -// constexpr -inline CUDA_CALLABLE_MEMBER complex<float>::complex(const complex<double> &__c) - : __re_(__c.real()), __im_(__c.imag()) {} - -// constexpr -inline CUDA_CALLABLE_MEMBER complex<double>::complex(const complex<float> &__c) - : __re_(__c.real()), __im_(__c.imag()) {} - -// 26.3.6 operators: - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator+(const complex<_Tp> &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(__x); - __t += __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator+(const complex<_Tp> &__x, - const _Tp &__y) { - complex<_Tp> __t(__x); - __t += __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator+(const _Tp &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(__y); - __t += __x; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator-(const complex<_Tp> &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(__x); - __t -= __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator-(const complex<_Tp> &__x, - const _Tp &__y) { - complex<_Tp> __t(__x); - __t -= __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator-(const _Tp &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(-__y); - __t += __x; - return __t; -} - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> operator*(const complex<_Tp> &__z, - const complex<_Tp> &__w) { - _Tp __a = __z.real(); - _Tp __b = __z.imag(); - _Tp __c = __w.real(); - _Tp __d = __w.imag(); - _Tp __ac = __a * __c; - _Tp __bd = __b * __d; - _Tp __ad = __a * __d; - _Tp __bc = __b * __c; - _Tp __x = __ac - __bd; - _Tp __y = __ad + __bc; - if (isnan(__x) && isnan(__y)) { - bool __recalc = false; - if (isinf(__a) || isinf(__b)) { - __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a); - __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b); - if (isnan(__c)) - __c = copysign(_Tp(0), __c); - if (isnan(__d)) - __d = copysign(_Tp(0), __d); - __recalc = true; - } - if (isinf(__c) || isinf(__d)) { - __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c); - __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d); - if (isnan(__a)) - __a = copysign(_Tp(0), __a); - if (isnan(__b)) - __b = copysign(_Tp(0), __b); - __recalc = true; - } - if (!__recalc && - (isinf(__ac) || isinf(__bd) || isinf(__ad) || isinf(__bc))) { - if (isnan(__a)) - __a = copysign(_Tp(0), __a); - if (isnan(__b)) - __b = copysign(_Tp(0), __b); - if (isnan(__c)) - __c = copysign(_Tp(0), __c); - if (isnan(__d)) - __d = copysign(_Tp(0), __d); - __recalc = true; - } - if (__recalc) { - __x = _Tp(INFINITY) * (__a * __c - __b * __d); - __y = _Tp(INFINITY) * (__a * __d + __b * __c); - } - } - return complex<_Tp>(__x, __y); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator*(const complex<_Tp> &__x, - const _Tp &__y) { - complex<_Tp> __t(__x); - __t *= __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator*(const _Tp &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(__y); - __t *= __x; - return __t; -} - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> operator/(const complex<_Tp> &__z, - const complex<_Tp> &__w) { - int __ilogbw = 0; - _Tp __a = __z.real(); - _Tp __b = __z.imag(); - _Tp __c = __w.real(); - _Tp __d = __w.imag(); - _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); - if (isfinite(__logbw)) { - __ilogbw = static_cast<int>(__logbw); - __c = scalbn(__c, -__ilogbw); - __d = scalbn(__d, -__ilogbw); - } - _Tp __denom = __c * __c + __d * __d; - _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); - _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); - if (isnan(__x) && isnan(__y)) { - if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b))) { - __x = copysign(_Tp(INFINITY), __c) * __a; - __y = copysign(_Tp(INFINITY), __c) * __b; - } else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) { - __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a); - __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b); - __x = _Tp(INFINITY) * (__a * __c + __b * __d); - __y = _Tp(INFINITY) * (__b * __c - __a * __d); - } else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && - isfinite(__b)) { - __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c); - __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d); - __x = _Tp(0) * (__a * __c + __b * __d); - __y = _Tp(0) * (__b * __c - __a * __d); - } - } - return complex<_Tp>(__x, __y); -} - -template <> -CUDA_CALLABLE_MEMBER complex<float> operator/(const complex<float> &__z, - const complex<float> &__w) { - int __ilogbw = 0; - float __a = __z.real(); - float __b = __z.imag(); - float __c = __w.real(); - float __d = __w.imag(); - float __logbw = logbf(fmaxf(fabsf(__c), fabsf(__d))); - if (isfinite(__logbw)) { - __ilogbw = static_cast<int>(__logbw); - __c = scalbnf(__c, -__ilogbw); - __d = scalbnf(__d, -__ilogbw); - } - float __denom = __c * __c + __d * __d; - float __x = scalbnf((__a * __c + __b * __d) / __denom, -__ilogbw); - float __y = scalbnf((__b * __c - __a * __d) / __denom, -__ilogbw); - if (isnan(__x) && isnan(__y)) { - if ((__denom == float(0)) && (!isnan(__a) || !isnan(__b))) { -#pragma warning(suppress : 4756) // Ignore INFINITY related warning - __x = copysignf(INFINITY, __c) * __a; -#pragma warning(suppress : 4756) // Ignore INFINITY related warning - __y = copysignf(INFINITY, __c) * __b; - } else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) { - __a = copysignf(isinf(__a) ? float(1) : float(0), __a); - __b = copysignf(isinf(__b) ? float(1) : float(0), __b); -#pragma warning(suppress : 4756) // Ignore INFINITY related warning - __x = INFINITY * (__a * __c + __b * __d); -#pragma warning(suppress : 4756) // Ignore INFINITY related warning - __y = INFINITY * (__b * __c - __a * __d); - } else if (isinf(__logbw) && __logbw > float(0) && isfinite(__a) && - isfinite(__b)) { - __c = copysignf(isinf(__c) ? float(1) : float(0), __c); - __d = copysignf(isinf(__d) ? float(1) : float(0), __d); - __x = float(0) * (__a * __c + __b * __d); - __y = float(0) * (__b * __c - __a * __d); - } - } - return complex<float>(__x, __y); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator/(const complex<_Tp> &__x, - const _Tp &__y) { - return complex<_Tp>(__x.real() / __y, __x.imag() / __y); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator/(const _Tp &__x, - const complex<_Tp> &__y) { - complex<_Tp> __t(__x); - __t /= __y; - return __t; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator+(const complex<_Tp> &__x) { - return __x; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> operator-(const complex<_Tp> &__x) { - return complex<_Tp>(-__x.real(), -__x.imag()); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator==(const complex<_Tp> &__x, - const complex<_Tp> &__y) { - return __x.real() == __y.real() && __x.imag() == __y.imag(); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator==(const complex<_Tp> &__x, - const _Tp &__y) { - return __x.real() == __y && __x.imag() == 0; -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator==(const _Tp &__x, - const complex<_Tp> &__y) { - return __x == __y.real() && 0 == __y.imag(); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator!=(const complex<_Tp> &__x, - const complex<_Tp> &__y) { - return !(__x == __y); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator!=(const complex<_Tp> &__x, - const _Tp &__y) { - return !(__x == __y); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER bool operator!=(const _Tp &__x, - const complex<_Tp> &__y) { - return !(__x == __y); -} - -// 26.3.7 values: - -// real - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER _Tp real(const complex<_Tp> &__c) { - return __c.real(); -} - -inline CUDA_CALLABLE_MEMBER double real(double __re) { return __re; } - -inline CUDA_CALLABLE_MEMBER float real(float __re) { return __re; } - -// imag - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER _Tp imag(const complex<_Tp> &__c) { - return __c.imag(); -} - -inline CUDA_CALLABLE_MEMBER double imag(double __re) { return 0; } - -inline CUDA_CALLABLE_MEMBER float imag(float __re) { return 0; } - -// abs - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER _Tp abs(const complex<_Tp> &__c) { - return hypot(__c.real(), __c.imag()); -} - -// arg - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER _Tp arg(const complex<_Tp> &__c) { - return atan2(__c.imag(), __c.real()); -} - -inline CUDA_CALLABLE_MEMBER double arg(double __re) { return atan2(0., __re); } - -inline CUDA_CALLABLE_MEMBER float arg(float __re) { return atan2f(0.F, __re); } - -// norm - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER _Tp norm(const complex<_Tp> &__c) { - if (isinf(__c.real())) - return fabs(__c.real()); - if (isinf(__c.imag())) - return fabs(__c.imag()); - return __c.real() * __c.real() + __c.imag() * __c.imag(); -} - -inline CUDA_CALLABLE_MEMBER double norm(double __re) { return __re * __re; } - -inline CUDA_CALLABLE_MEMBER float norm(float __re) { return __re * __re; } - -// conj - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> conj(const complex<_Tp> &__c) { - return complex<_Tp>(__c.real(), -__c.imag()); -} - -inline CUDA_CALLABLE_MEMBER complex<double> conj(double __re) { - return complex<double>(__re); -} - -inline CUDA_CALLABLE_MEMBER complex<float> conj(float __re) { - return complex<float>(__re); -} - -// proj - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> proj(const complex<_Tp> &__c) { - complex<_Tp> __r = __c; - if (isinf(__c.real()) || isinf(__c.imag())) - __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); - return __r; -} - -inline CUDA_CALLABLE_MEMBER complex<double> proj(double __re) { - if (isinf(__re)) - __re = fabs(__re); - return complex<double>(__re); -} - -inline CUDA_CALLABLE_MEMBER complex<float> proj(float __re) { - if (isinf(__re)) - __re = fabs(__re); - return complex<float>(__re); -} - -// polar - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> polar(const _Tp &__rho, - const _Tp &__theta = _Tp(0)) { - if (isnan(__rho) || signbit(__rho)) - return complex<_Tp>(_Tp(NAN), _Tp(NAN)); - if (isnan(__theta)) { - if (isinf(__rho)) - return complex<_Tp>(__rho, __theta); - return complex<_Tp>(__theta, __theta); - } - if (isinf(__theta)) { - if (isinf(__rho)) - return complex<_Tp>(__rho, _Tp(NAN)); - return complex<_Tp>(_Tp(NAN), _Tp(NAN)); - } - _Tp __x = __rho * cos(__theta); - if (isnan(__x)) - __x = 0; - _Tp __y = __rho * sin(__theta); - if (isnan(__y)) - __y = 0; - return complex<_Tp>(__x, __y); -} - -// log - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> log(const complex<_Tp> &__x) { - return complex<_Tp>(log(abs(__x)), arg(__x)); -} - -// log10 - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> log10(const complex<_Tp> &__x) { - return log(__x) / log(_Tp(10)); -} - -// sqrt - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> sqrt(const complex<_Tp> &__x) { - if (isinf(__x.imag())) - return complex<_Tp>(_Tp(INFINITY), __x.imag()); - if (isinf(__x.real())) { - if (__x.real() > _Tp(0)) - return complex<_Tp>(__x.real(), isnan(__x.imag()) - ? __x.imag() - : copysign(_Tp(0), __x.imag())); - return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), - copysign(__x.real(), __x.imag())); - } - return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); -} - -// exp - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> exp(const complex<_Tp> &__x) { - _Tp __i = __x.imag(); - if (isinf(__x.real())) { - if (__x.real() < _Tp(0)) { - if (!isfinite(__i)) - __i = _Tp(1); - } else if (__i == 0 || !isfinite(__i)) { - if (isinf(__i)) - __i = _Tp(NAN); - return complex<_Tp>(__x.real(), __i); - } - } else if (isnan(__x.real()) && __x.imag() == 0) - return __x; - _Tp __e = exp(__x.real()); - return complex<_Tp>(__e * cos(__i), __e * sin(__i)); -} - -// pow - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> pow(const complex<_Tp> &__x, - const complex<_Tp> &__y) { - return exp(__y * log(__x)); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> pow(const complex<_Tp> &__x, - const _Tp &__y) { - return pow(__x, complex<_Tp>(__y)); -} - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> pow(const _Tp &__x, - const complex<_Tp> &__y) { - return pow(complex<_Tp>(__x), __y); -} - -// asinh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> asinh(const complex<_Tp> &__x) { - const _Tp __pi(atan2(+0., -0.)); - if (isinf(__x.real())) { - if (isnan(__x.imag())) - return __x; - if (isinf(__x.imag())) - return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); - return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); - } - if (isnan(__x.real())) { - if (isinf(__x.imag())) - return complex<_Tp>(__x.imag(), __x.real()); - if (__x.imag() == 0) - return __x; - return complex<_Tp>(__x.real(), __x.real()); - } - if (isinf(__x.imag())) - return complex<_Tp>(copysign(__x.imag(), __x.real()), - copysign(__pi / _Tp(2), __x.imag())); - complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1))); - return complex<_Tp>(copysign(__z.real(), __x.real()), - copysign(__z.imag(), __x.imag())); -} - -// acosh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> acosh(const complex<_Tp> &__x) { - const _Tp __pi(atan2(+0., -0.)); - if (isinf(__x.real())) { - if (isnan(__x.imag())) - return complex<_Tp>(fabs(__x.real()), __x.imag()); - if (isinf(__x.imag())) - if (__x.real() > 0) - return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); - else - return complex<_Tp>(-__x.real(), - copysign(__pi * _Tp(0.75), __x.imag())); - if (__x.real() < 0) - return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); - return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); - } - if (isnan(__x.real())) { - if (isinf(__x.imag())) - return complex<_Tp>(fabs(__x.imag()), __x.real()); - return complex<_Tp>(__x.real(), __x.real()); - } - if (isinf(__x.imag())) - return complex<_Tp>(fabs(__x.imag()), copysign(__pi / _Tp(2), __x.imag())); - complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1))); - return complex<_Tp>(copysign(__z.real(), _Tp(0)), - copysign(__z.imag(), __x.imag())); -} - -// atanh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> atanh(const complex<_Tp> &__x) { - const _Tp __pi(atan2(+0., -0.)); - if (isinf(__x.imag())) { - return complex<_Tp>(copysign(_Tp(0), __x.real()), - copysign(__pi / _Tp(2), __x.imag())); - } - if (isnan(__x.imag())) { - if (isinf(__x.real()) || __x.real() == 0) - return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); - return complex<_Tp>(__x.imag(), __x.imag()); - } - if (isnan(__x.real())) { - return complex<_Tp>(__x.real(), __x.real()); - } - if (isinf(__x.real())) { - return complex<_Tp>(copysign(_Tp(0), __x.real()), - copysign(__pi / _Tp(2), __x.imag())); - } - if (fabs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) { - return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), - copysign(_Tp(0), __x.imag())); - } - complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); - return complex<_Tp>(copysign(__z.real(), __x.real()), - copysign(__z.imag(), __x.imag())); -} - -// sinh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> sinh(const complex<_Tp> &__x) { - if (isinf(__x.real()) && !isfinite(__x.imag())) - return complex<_Tp>(__x.real(), _Tp(NAN)); - if (__x.real() == 0 && !isfinite(__x.imag())) - return complex<_Tp>(__x.real(), _Tp(NAN)); - if (__x.imag() == 0 && !isfinite(__x.real())) - return __x; - return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), - cosh(__x.real()) * sin(__x.imag())); -} - -// cosh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> cosh(const complex<_Tp> &__x) { - if (isinf(__x.real()) && !isfinite(__x.imag())) - return complex<_Tp>(fabs(__x.real()), _Tp(NAN)); - if (__x.real() == 0 && !isfinite(__x.imag())) - return complex<_Tp>(_Tp(NAN), __x.real()); - if (__x.real() == 0 && __x.imag() == 0) - return complex<_Tp>(_Tp(1), __x.imag()); - if (__x.imag() == 0 && !isfinite(__x.real())) - return complex<_Tp>(fabs(__x.real()), __x.imag()); - return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), - sinh(__x.real()) * sin(__x.imag())); -} - -// tanh - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> tanh(const complex<_Tp> &__x) { - if (isinf(__x.real())) { - if (!isfinite(__x.imag())) - return complex<_Tp>(_Tp(1), _Tp(0)); - return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); - } - if (isnan(__x.real()) && __x.imag() == 0) - return __x; - _Tp __2r(_Tp(2) * __x.real()); - _Tp __2i(_Tp(2) * __x.imag()); - _Tp __d(cosh(__2r) + cos(__2i)); - return complex<_Tp>(sinh(__2r) / __d, sin(__2i) / __d); -} - -// asin - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> asin(const complex<_Tp> &__x) { - complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); - return complex<_Tp>(__z.imag(), -__z.real()); -} - -// acos - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> acos(const complex<_Tp> &__x) { - const _Tp __pi(atan2(+0., -0.)); - if (isinf(__x.real())) { - if (isnan(__x.imag())) - return complex<_Tp>(__x.imag(), __x.real()); - if (isinf(__x.imag())) { - if (__x.real() < _Tp(0)) - return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); - return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); - } - if (__x.real() < _Tp(0)) - return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); - return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); - } - if (isnan(__x.real())) { - if (isinf(__x.imag())) - return complex<_Tp>(__x.real(), -__x.imag()); - return complex<_Tp>(__x.real(), __x.real()); - } - if (isinf(__x.imag())) - return complex<_Tp>(__pi / _Tp(2), -__x.imag()); - if (__x.real() == 0) - return complex<_Tp>(__pi / _Tp(2), -__x.imag()); - complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1))); - if (signbit(__x.imag())) - return complex<_Tp>(fabs(__z.imag()), fabs(__z.real())); - return complex<_Tp>(fabs(__z.imag()), -fabs(__z.real())); -} - -// atan - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> atan(const complex<_Tp> &__x) { - complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); - return complex<_Tp>(__z.imag(), -__z.real()); -} - -// sin - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> sin(const complex<_Tp> &__x) { - complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); - return complex<_Tp>(__z.imag(), -__z.real()); -} - -// cos - -template <class _Tp> -inline CUDA_CALLABLE_MEMBER complex<_Tp> cos(const complex<_Tp> &__x) { - return cosh(complex<_Tp>(-__x.imag(), __x.real())); -} - -// tan - -template <class _Tp> -CUDA_CALLABLE_MEMBER complex<_Tp> tan(const complex<_Tp> &__x) { - complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); - return complex<_Tp>(__z.imag(), -__z.real()); -} - -template <class _Tp, class _CharT, class _Traits> -std::basic_istream<_CharT, _Traits> & -operator>>(std::basic_istream<_CharT, _Traits> &__is, complex<_Tp> &__x) { - if (__is.good()) { - ws(__is); - if (__is.peek() == _CharT('(')) { - __is.get(); - _Tp __r; - __is >> __r; - if (!__is.fail()) { - ws(__is); - _CharT __c = __is.peek(); - if (__c == _CharT(',')) { - __is.get(); - _Tp __i; - __is >> __i; - if (!__is.fail()) { - ws(__is); - __c = __is.peek(); - if (__c == _CharT(')')) { - __is.get(); - __x = complex<_Tp>(__r, __i); - } else - __is.setstate(std::ios_base::failbit); - } else - __is.setstate(std::ios_base::failbit); - } else if (__c == _CharT(')')) { - __is.get(); - __x = complex<_Tp>(__r, _Tp(0)); - } else - __is.setstate(std::ios_base::failbit); - } else - __is.setstate(std::ios_base::failbit); - } else { - _Tp __r; - __is >> __r; - if (!__is.fail()) - __x = complex<_Tp>(__r, _Tp(0)); - else - __is.setstate(std::ios_base::failbit); - } - } else - __is.setstate(std::ios_base::failbit); - return __is; -} - -template <class _Tp, class _CharT, class _Traits> -std::basic_ostream<_CharT, _Traits> & -operator<<(std::basic_ostream<_CharT, _Traits> &__os, const complex<_Tp> &__x) { - std::basic_ostringstream<_CharT, _Traits> __s; - __s.flags(__os.flags()); - __s.imbue(__os.getloc()); - __s.precision(__os.precision()); - __s << '(' << __x.real() << ',' << __x.imag() << ')'; - return __os << __s.str(); -} - -//} // close namespace cuda_complex - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator*(const complex<U> &complexNumber, - const V &scalar) -> complex<U> { - return complex<U>(real(complexNumber) * scalar, imag(complexNumber) * scalar); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator*(const V &scalar, - const complex<U> &complexNumber) - -> complex<U> { - return complex<U>(real(complexNumber) * scalar, imag(complexNumber) * scalar); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator+(const complex<U> &complexNumber, - const V &scalar) -> complex<U> { - return complex<U>(real(complexNumber) + scalar, imag(complexNumber)); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator+(const V &scalar, - const complex<U> &complexNumber) - -> complex<U> { - return complex<U>(real(complexNumber) + scalar, imag(complexNumber)); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator-(const complex<U> &complexNumber, - const V &scalar) -> complex<U> { - return complex<U>(real(complexNumber) - scalar, imag(complexNumber)); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator-(const V &scalar, - const complex<U> &complexNumber) - -> complex<U> { - return complex<U>(scalar - real(complexNumber), imag(complexNumber)); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator/(const complex<U> &complexNumber, - const V scalar) -> complex<U> { - return complex<U>(real(complexNumber) / scalar, imag(complexNumber) / scalar); -} - -template <class U, class V> -CUDA_CALLABLE_MEMBER auto operator/(const V scalar, - const complex<U> &complexNumber) - -> complex<U> { - return complex<U>(scalar, 0) / complexNumber; -} - -using ComplexDouble = complex<double>; -using ComplexFloat = complex<float>; -#endif // CUDA_COMPLEX_HPP -} diff --git a/pystencils/include/gpu_defines.h b/pystencils/include/gpu_defines.h new file mode 100644 index 0000000000000000000000000000000000000000..67e7722e9a01b217584dce14f0dcec16d2025c80 --- /dev/null +++ b/pystencils/include/gpu_defines.h @@ -0,0 +1,12 @@ +#pragma once + +#define POS_INFINITY __int_as_float(0x7f800000) +#define INFINITY POS_INFINITY +#define NEG_INFINITY __int_as_float(0xff800000) + +#ifdef __HIPCC_RTC__ +typedef __hip_uint8_t uint8_t; +typedef __hip_int8_t int8_t; +typedef __hip_uint16_t uint16_t; +typedef __hip_int16_t int16_t; +#endif diff --git a/pystencils/include/half_precision.h b/pystencils/include/half_precision.h new file mode 100644 index 0000000000000000000000000000000000000000..0bba7b86d24e2caab295c92ee1cdff5b4f103a8c --- /dev/null +++ b/pystencils/include/half_precision.h @@ -0,0 +1,17 @@ +/// Half precision support. Experimental. Use carefully. +/// +/// This feature is experimental, since it strictly depends on the underlying architecture and compiler support. +/// On x86 architectures, what you can expect is that the data format is supported natively only for storage and +/// interchange. Arithmetic operations will likely involve casting to fp32 (C++ float) and truncation to fp16. +/// Only bandwidth bound code may therefore benefit. None of this is guaranteed, and may change in the future. + +/// Clang version must be 15 or higher for x86 half precision support. +/// GCC version must be 12 or higher for x86 half precision support. +/// Also support seems to require SSE, so ensure that respective instruction sets are enabled. +/// See +/// https://clang.llvm.org/docs/LanguageExtensions.html#half-precision-floating-point +/// https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html +/// for more information. + +#pragma once +using half = _Float16; diff --git a/pystencils/include/myintrin.h b/pystencils/include/myintrin.h index 6c1d9d4d02636bc73a56ea5f0896eb128a86fbd1..eb1fe4dc41f2851660723a3c2ddd57fafb06a22a 100644 --- a/pystencils/include/myintrin.h +++ b/pystencils/include/myintrin.h @@ -1,6 +1,6 @@ #pragma once -#if defined(__SSE2__) || defined(_MSC_VER) +#if defined(__SSE2__) || (defined(_MSC_VER) && !defined(_M_ARM64)) QUALIFIERS __m128 _my_cvtepu32_ps(const __m128i v) { #ifdef __AVX512VL__ @@ -28,7 +28,7 @@ QUALIFIERS void _MY_TRANSPOSE4_EPI32(__m128i & R0, __m128i & R1, __m128i & R2, _ } #endif -#if defined(__SSE4_1__) || defined(_MSC_VER) +#if defined(__SSE4_1__) || (defined(_MSC_VER) && !defined(_M_ARM64)) #if !defined(__AVX512VL__) && defined(__GNUC__) && __GNUC__ >= 5 && !defined(__clang__) __attribute__((optimize("no-associative-math"))) #endif diff --git a/pystencils/include/opencl_stdint.h b/pystencils/include/opencl_stdint.h deleted file mode 100644 index 98191faa56e97059f89cd8cd96f0390cf65d8168..0000000000000000000000000000000000000000 --- a/pystencils/include/opencl_stdint.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef OPENCL_STDINT -#define OPENCL_STDINT - -typedef unsigned int uint_t; - -typedef signed char int8_t; -typedef signed short int16_t; -typedef signed int int32_t; -typedef signed long int int64_t; -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long int uint64_t; - -#endif diff --git a/pystencils/include/philox_rand.h b/pystencils/include/philox_rand.h index 0571eb39d114c5ea29c974e9630744d0bbcc1540..cb91b53b96c487b575d9d318a5f58d1460ed59ed 100644 --- a/pystencils/include/philox_rand.h +++ b/pystencils/include/philox_rand.h @@ -1,16 +1,20 @@ -#ifndef __OPENCL_VERSION__ -#if defined(__SSE2__) || defined(_MSC_VER) +#if !defined(__OPENCL_VERSION__) && !defined(__HIPCC_RTC__) +#if defined(__SSE2__) || (defined(_MSC_VER) && !defined(_M_ARM64)) #include <emmintrin.h> // SSE2 #endif #ifdef __AVX2__ #include <immintrin.h> // AVX* -#elif defined(__SSE4_1__) || defined(_MSC_VER) +#elif defined(__SSE4_1__) || (defined(_MSC_VER) && !defined(_M_ARM64)) #include <smmintrin.h> // SSE4 #ifdef __FMA__ #include <immintrin.h> // FMA #endif #endif +#if defined(_MSC_VER) && defined(_M_ARM64) +#define __ARM_NEON +#endif + #ifdef __ARM_NEON #include <arm_neon.h> #endif @@ -34,7 +38,7 @@ #endif #endif -#ifdef __CUDA_ARCH__ +#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) #define QUALIFIERS static __forceinline__ __device__ #elif defined(__OPENCL_VERSION__) #define QUALIFIERS static inline @@ -55,7 +59,9 @@ typedef uint32_t uint32; typedef uint64_t uint64; #else +#ifndef __HIPCC_RTC__ #include <cstdint> +#endif typedef std::uint32_t uint32; typedef std::uint64_t uint64; #endif @@ -71,7 +77,7 @@ typedef svfloat64_t svfloat64_st; QUALIFIERS uint32 mulhilo32(uint32 a, uint32 b, uint32* hip) { -#ifndef __CUDA_ARCH__ +#if !defined(__CUDA_ARCH__) && !defined(__HIP_DEVICE_COMPILE__) // host code #if defined(__powerpc__) && (!defined(__clang__) || defined(__xlC__)) *hip = __mulhwu(a,b); @@ -182,8 +188,8 @@ QUALIFIERS void philox_float4(uint32 ctr0, uint32 ctr1, uint32 ctr2, uint32 ctr3 #endif } -#if !defined(__CUDA_ARCH__) && !defined(__OPENCL_VERSION__) -#if defined(__SSE4_1__) || defined(_MSC_VER) +#if !defined(__CUDA_ARCH__) && !defined(__OPENCL_VERSION__) && !defined(__HIP_DEVICE_COMPILE__) +#if defined(__SSE4_1__) || (defined(_MSC_VER) && !defined(_M_ARM64)) QUALIFIERS void _philox4x32round(__m128i* ctr, __m128i* key) { __m128i lohi0a = _mm_mul_epu32(ctr[0], _mm_set1_epi32(PHILOX_M4x32_0)); @@ -665,12 +671,14 @@ QUALIFIERS void philox_float4(uint32 ctr0, uint32x4_t ctr1, uint32 ctr2, uint32 philox_float4(ctr0v, ctr1, ctr2v, ctr3v, key0, key1, rnd1, rnd2, rnd3, rnd4); } +#ifndef _MSC_VER QUALIFIERS void philox_float4(uint32 ctr0, int32x4_t ctr1, uint32 ctr2, uint32 ctr3, uint32 key0, uint32 key1, float32x4_t & rnd1, float32x4_t & rnd2, float32x4_t & rnd3, float32x4_t & rnd4) { philox_float4(ctr0, vreinterpretq_u32_s32(ctr1), ctr2, ctr3, key0, key1, rnd1, rnd2, rnd3, rnd4); } +#endif QUALIFIERS void philox_double2(uint32 ctr0, uint32x4_t ctr1, uint32 ctr2, uint32 ctr3, uint32 key0, uint32 key1, @@ -695,6 +703,7 @@ QUALIFIERS void philox_double2(uint32 ctr0, uint32x4_t ctr1, uint32 ctr2, uint32 philox_double2(ctr0v, ctr1, ctr2v, ctr3v, key0, key1, rnd1, ignore, rnd2, ignore); } +#ifndef _MSC_VER QUALIFIERS void philox_double2(uint32 ctr0, int32x4_t ctr1, uint32 ctr2, uint32 ctr3, uint32 key0, uint32 key1, float64x2_t & rnd1, float64x2_t & rnd2) @@ -702,6 +711,7 @@ QUALIFIERS void philox_double2(uint32 ctr0, int32x4_t ctr1, uint32 ctr2, uint32 philox_double2(ctr0, vreinterpretq_u32_s32(ctr1), ctr2, ctr3, key0, key1, rnd1, rnd2); } #endif +#endif #if defined(__ARM_FEATURE_SVE) diff --git a/pystencils/kernelcreation.py b/pystencils/kernelcreation.py index 4b02ca13dfd66731747d80978770d976993f61cc..6e13bcfbdf93531f562d32775d54485846ecd4b5 100644 --- a/pystencils/kernelcreation.py +++ b/pystencils/kernelcreation.py @@ -159,7 +159,7 @@ def create_domain_kernel(assignments: NodeCollection, *, config: CreateKernelCon raise ValueError("Invalid value for cpu_vectorize_info") elif config.target == Target.GPU: if config.backend == Backend.CUDA: - from pystencils.gpucuda import create_cuda_kernel + from pystencils.gpu import create_cuda_kernel ast = create_cuda_kernel(assignments, config=config) if not ast: @@ -241,7 +241,7 @@ def create_indexed_kernel(assignments: NodeCollection, *, config: CreateKernelCo add_openmp(ast, num_threads=config.cpu_openmp) elif config.target == Target.GPU: if config.backend == Backend.CUDA: - from pystencils.gpucuda import created_indexed_cuda_kernel + from pystencils.gpu import created_indexed_cuda_kernel ast = created_indexed_cuda_kernel(assignments, config=config) if not ast: diff --git a/pystencils/runhelper/db.py b/pystencils/runhelper/db.py index 21b75c4ba91a53588db8637651bfda090c4044e6..1c8d3aa66c0e47681b942dd06f0a1805e244e930 100644 --- a/pystencils/runhelper/db.py +++ b/pystencils/runhelper/db.py @@ -1,10 +1,60 @@ import socket import time +from types import MappingProxyType from typing import Dict, Iterator, Sequence import blitzdb +import six +from blitzdb.backends.file.backend import serializer_classes +from blitzdb.backends.file.utils import JsonEncoder from pystencils.cpu.cpujit import get_compiler_config +from pystencils import CreateKernelConfig, Target, Backend, Field + +import json +import sympy as sp + +from pystencils.typing import BasicType + + +class PystencilsJsonEncoder(JsonEncoder): + + def default(self, obj): + if isinstance(obj, CreateKernelConfig): + return obj.__dict__ + if isinstance(obj, (sp.Float, sp.Rational)): + return float(obj) + if isinstance(obj, sp.Integer): + return int(obj) + if isinstance(obj, (BasicType, MappingProxyType)): + return str(obj) + if isinstance(obj, (Target, Backend, sp.Symbol)): + return obj.name + if isinstance(obj, Field): + return f"pystencils.Field(name = {obj.name}, field_type = {obj.field_type.name}, " \ + f"dtype = {str(obj.dtype)}, layout = {obj.layout}, shape = {obj.shape}, " \ + f"strides = {obj.strides})" + return JsonEncoder.default(self, obj) + + +class PystencilsJsonSerializer(object): + + @classmethod + def serialize(cls, data): + if six.PY3: + if isinstance(data, bytes): + return json.dumps(data.decode('utf-8'), cls=PystencilsJsonEncoder, ensure_ascii=False).encode('utf-8') + else: + return json.dumps(data, cls=PystencilsJsonEncoder, ensure_ascii=False).encode('utf-8') + else: + return json.dumps(data, cls=PystencilsJsonEncoder, ensure_ascii=False).encode('utf-8') + + @classmethod + def deserialize(cls, data): + if six.PY3: + return json.loads(data.decode('utf-8')) + else: + return json.loads(data.decode('utf-8')) class Database: @@ -46,7 +96,7 @@ class Database: class SimulationResult(blitzdb.Document): pass - def __init__(self, file: str) -> None: + def __init__(self, file: str, serializer_info: tuple = None) -> None: if file.startswith("mongo://"): from pymongo import MongoClient db_name = file[len("mongo://"):] @@ -57,6 +107,10 @@ class Database: self.backend.autocommit = True + if serializer_info: + serializer_classes.update({serializer_info[0]: serializer_info[1]}) + self.backend.load_config({'serializer_class': serializer_info[0]}, True) + def save(self, params: Dict, result: Dict, env: Dict = None, **kwargs) -> None: """Stores a simulation result in the database. @@ -146,10 +200,15 @@ class Database: 'cpuCompilerConfig': get_compiler_config(), } try: - from git import Repo, InvalidGitRepositoryError + from git import Repo + except ImportError: + return result + + try: + from git import InvalidGitRepositoryError repo = Repo(search_parent_directories=True) result['git_hash'] = str(repo.head.commit) - except (ImportError, InvalidGitRepositoryError): + except InvalidGitRepositoryError: pass return result diff --git a/pystencils/runhelper/parameterstudy.py b/pystencils/runhelper/parameterstudy.py index f4d8327d335125f7f57a8d622e1fd37855c3d9dd..243a30e437b05960a986d6134b3226c47f936948 100644 --- a/pystencils/runhelper/parameterstudy.py +++ b/pystencils/runhelper/parameterstudy.py @@ -9,6 +9,7 @@ from time import sleep from typing import Any, Callable, Dict, Optional, Sequence, Tuple from pystencils.runhelper import Database +from pystencils.runhelper.db import PystencilsJsonSerializer from pystencils.utils import DotDict ParameterDict = Dict[str, Any] @@ -54,10 +55,11 @@ class ParameterStudy: Run = namedtuple("Run", ['parameter_dict', 'weight']) def __init__(self, run_function: Callable[..., Dict], runs: Sequence = (), - database_connector: str = './db') -> None: + database_connector: str = './db', + serializer_info: tuple = ('pystencils_serializer', PystencilsJsonSerializer)) -> None: self.runs = list(runs) self.run_function = run_function - self.db = Database(database_connector) + self.db = Database(database_connector, serializer_info) def add_run(self, parameter_dict: ParameterDict, weight: int = 1) -> None: """Schedule a dictionary of parameters to run in this parameter study. diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py index 49fc06e2ddf6217f3425dacd33f1b913f6cd8c18..b0c09cec9ae2066d2db9fcb11d2c03e239d0e091 100644 --- a/pystencils/simp/assignment_collection.py +++ b/pystencils/simp/assignment_collection.py @@ -61,8 +61,11 @@ class AssignmentCollection: self.simplification_hints = simplification_hints + ctrs = [int(n.name[3:])for n in self.rhs_symbols if "xi_" in n.name] + max_ctr = max(ctrs) + 1 if len(ctrs) > 0 else 0 + if subexpression_symbol_generator is None: - self.subexpression_symbol_generator = SymbolGen() + self.subexpression_symbol_generator = SymbolGen(ctr=max_ctr) else: self.subexpression_symbol_generator = subexpression_symbol_generator @@ -453,8 +456,8 @@ class AssignmentCollection: class SymbolGen: """Default symbol generator producing number symbols ζ_0, ζ_1, ...""" - def __init__(self, symbol="xi", dtype=None): - self._ctr = 0 + def __init__(self, symbol="xi", dtype=None, ctr=0): + self._ctr = ctr self._symbol = symbol self._dtype = dtype diff --git a/pystencils/stencil.py b/pystencils/stencil.py index 10925735a868a34297d566d4fa4e14736e727992..aa86427fcd59113e502c91e7444a6815a5307f96 100644 --- a/pystencils/stencil.py +++ b/pystencils/stencil.py @@ -5,6 +5,8 @@ from typing import Sequence import numpy as np import sympy as sp +from pystencils.utils import binary_numbers + def inverse_direction(direction): """Returns inverse i.e. negative of given direction tuple @@ -293,6 +295,38 @@ def direction_string_to_offset(direction: str, dim: int = 3): return offset[:dim] +def adjacent_directions(direction): + """ + Returns all adjacent directions for a direction as tuple of tuples. This is useful for exmple to find all directions + relevant for neighbour communication. + + Args: + direction: tuple representing a direction. For example (0, 1, 0) for the northern side + + Examples: + >>> adjacent_directions((0, 0, 0)) + ((0, 0, 0),) + >>> adjacent_directions((0, 1, 0)) + ((0, 1, 0),) + >>> adjacent_directions((0, 1, 1)) + ((0, 0, 1), (0, 1, 0), (0, 1, 1)) + >>> adjacent_directions((-1, -1)) + ((-1, -1), (-1, 0), (0, -1)) + """ + result = set() + if all(e == 0 for e in direction): + result.add(direction) + return tuple(result) + binary_numbers_list = binary_numbers(len(direction)) + for adjacent_direction in binary_numbers_list: + for i, entry in enumerate(direction): + if entry == 0: + adjacent_direction[i] = 0 + if entry == -1 and adjacent_direction[i] == 1: + adjacent_direction[i] = -1 + if not all(e == 0 for e in adjacent_direction): + result.add(tuple(adjacent_direction)) + return tuple(sorted(result)) # -------------------------------------- Visualization ----------------------------------------------------------------- @@ -341,7 +375,7 @@ def plot_2d(stencil, axes=None, figure=None, data=None, textsize='12', **kwargs) for direction, annotation in zip(stencil, data): assert len(direction) == 2, "Works only for 2D stencils" direction = tuple(int(i) for i in direction) - if not(direction[0] == 0 and direction[1] == 0): + if not (direction[0] == 0 and direction[1] == 0): axes.arrow(0, 0, direction[0], direction[1], head_width=0.08, head_length=head_length, color='k') if isinstance(annotation, sp.Basic): diff --git a/pystencils/typing/types.py b/pystencils/typing/types.py index d1c473a0aa06bacf14bf4ef84d577abee69e4155..f0f9744a558ed42bfebe08e6430da3aa21d8131a 100644 --- a/pystencils/typing/types.py +++ b/pystencils/typing/types.py @@ -25,6 +25,8 @@ def numpy_name_to_c(name: str) -> str: return 'double' elif name == 'float32': return 'float' + elif name == 'float16' or name == 'half': + return 'half' elif name.startswith('int'): width = int(name[len("int"):]) return f"int{width}_t" @@ -68,7 +70,7 @@ class BasicType(AbstractType): BasicType is defined with a const qualifier and a np.dtype. """ - def __init__(self, dtype: Union[np.dtype, 'BasicType', str], const: bool = False): + def __init__(self, dtype: Union[type, 'BasicType', str], const: bool = False): if isinstance(dtype, BasicType): self.numpy_dtype = dtype.numpy_dtype self.const = dtype.const @@ -94,6 +96,9 @@ class BasicType(AbstractType): def is_float(self): return issubclass(self.numpy_dtype.type, np.floating) + def is_half(self): + return issubclass(self.numpy_dtype.type, np.half) + def is_int(self): return issubclass(self.numpy_dtype.type, np.integer) @@ -286,7 +291,7 @@ class StructType(AbstractType): return hash((self.numpy_dtype, self.const)) -def create_type(specification: Union[np.dtype, AbstractType, str]) -> AbstractType: +def create_type(specification: Union[type, AbstractType, str]) -> AbstractType: # TODO: Deprecated Use the constructor of BasicType or StructType instead """Creates a subclass of Type according to a string or an object of subclass Type. diff --git a/pystencils/typing/utilities.py b/pystencils/typing/utilities.py index da40c510ef91c7ca7fee0e6a0259b3eef50f0ab8..223da701a4d5c133715eb30f99366c44b13f16b2 100644 --- a/pystencils/typing/utilities.py +++ b/pystencils/typing/utilities.py @@ -187,18 +187,15 @@ def get_type_of_expression(expr, # Fix for sympy versions from 1.9 sympy_version = sp.__version__.split('.') -if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109: +sympy_version_int = int(sympy_version[0]) * 100 + int(sympy_version[1]) +if sympy_version_int >= 109: # __setstate__ would bypass the contructor, so we remove it - sp.Number.__getstate__ = sp.Basic.__getstate__ - del sp.Basic.__getstate__ - - class FunctorWithStoredKwargs: - def __init__(self, func, **kwargs): - self.func = func - self.kwargs = kwargs - - def __call__(self, *args): - return self.func(*args, **self.kwargs) + if sympy_version_int >= 111: + del sp.Basic.__setstate__ + del sp.Symbol.__setstate__ + else: + sp.Number.__getstate__ = sp.Basic.__getstate__ + del sp.Basic.__getstate__ # __reduce_ex__ would strip kwargs, so we override it def basic_reduce_ex(self, protocol): @@ -210,9 +207,7 @@ if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109: state = self.__getstate__() else: state = None - return FunctorWithStoredKwargs(type(self), **kwargs), args, state - - sp.Number.__reduce_ex__ = sp.Basic.__reduce_ex__ + return partial(type(self), **kwargs), args, state sp.Basic.__reduce_ex__ = basic_reduce_ex diff --git a/pystencils/utils.py b/pystencils/utils.py index 22d61d0bac6c402e10a7f48a07a55264ec4ddf27..f872ae48a54a2ae8c9437ec826be9b51c061f52e 100644 --- a/pystencils/utils.py +++ b/pystencils/utils.py @@ -96,6 +96,21 @@ def boolean_array_bounding_box(boolean_array): return bounds +def binary_numbers(n): + """Returns all binary numbers up to 2^n - 1 + + Example: + >>> binary_numbers(2) + [[0, 0], [0, 1], [1, 0], [1, 1]] + """ + result = list() + for i in range(1 << n): + binary_number = bin(i)[2:] + binary_number = '0' * (n - len(binary_number)) + binary_number + result.append((list(map(int, binary_number)))) + return result + + class LinearEquationSystem: """Symbolic linear system of equations - consisting of matrix and right hand side. diff --git a/pystencils_tests/test_boundary.py b/pystencils_tests/test_boundary.py index 4dc6439a079606b4536ef3331fa3ca5eeeb0f4aa..a94d3782020cd494a4b01009f04016e889fca9c0 100644 --- a/pystencils_tests/test_boundary.py +++ b/pystencils_tests/test_boundary.py @@ -97,7 +97,7 @@ def test_kernel_vs_copy_boundary(): def test_boundary_gpu(): - pytest.importorskip('pycuda') + pytest.importorskip('cupy') dh = SerialDataHandling(domain_size=(7, 7), default_target=Target.GPU) src = dh.add_array('src') dh.fill("src", 0.0, ghost_layers=True) diff --git a/pystencils_tests/test_buffer_gpu.py b/pystencils_tests/test_buffer_gpu.py index ae0a1548790fda79c50b6c6b6952868755009d44..d2ec6808e8db52eb69427aef9a94ce53631047eb 100644 --- a/pystencils_tests/test_buffer_gpu.py +++ b/pystencils_tests/test_buffer_gpu.py @@ -14,8 +14,7 @@ from pystencils.stencil import direction_string_to_offset try: # noinspection PyUnresolvedReferences - import pycuda.autoinit - import pycuda.gpuarray as gpuarray + import cupy as cp except ImportError: pass @@ -24,7 +23,7 @@ FIELD_SIZES = [(4, 3), (9, 3, 7)] def _generate_fields(dt=np.uint8, stencil_directions=1, layout='numpy'): - pytest.importorskip('pycuda') + pytest.importorskip('cupy') field_sizes = FIELD_SIZES if stencil_directions > 1: field_sizes = [s + (stencil_directions,) for s in field_sizes] @@ -39,10 +38,10 @@ def _generate_fields(dt=np.uint8, stencil_directions=1, layout='numpy'): src_arr.flat = add_ghost_layers(array_data, index_dimensions=1 if stencil_directions > 1 else 0).astype(dt).flat - gpu_src_arr = gpuarray.to_gpu(src_arr) - gpu_dst_arr = gpuarray.empty_like(gpu_src_arr) + gpu_src_arr = cp.asarray(src_arr) + gpu_dst_arr = cp.zeros_like(gpu_src_arr) size = int(np.prod(src_arr.shape)) - gpu_buffer_arr = gpuarray.zeros(size, dtype=dt) + gpu_buffer_arr = cp.zeros(size, dtype=dt) fields.append((src_arr, gpu_src_arr, gpu_dst_arr, gpu_buffer_arr)) return fields @@ -163,7 +162,7 @@ def test_all_cell_values(): def test_subset_cell_values(): - """Tests (un)packing a subset of cell values of the a field (from)to a buffer.""" + """Tests (un)packing a subset of cell values of a field (from)to a buffer.""" num_cell_values = 7 # Cell indices of the field to be (un)packed (from)to the buffer cell_indices = [1, 3, 5, 6] @@ -300,7 +299,7 @@ def test_iteration_slices(): # Fill the entire array with data src_arr[(slice(None, None, 1),) * dim] = np.arange(num_cell_values) - gpu_src_arr[(slice(None, None, 1),) * dim] = src_arr + gpu_src_arr.set(src_arr) gpu_dst_arr.fill(0) config = CreateKernelConfig(target=Target.GPU, iteration_slice=pack_slice, diff --git a/pystencils_tests/test_custom_backends.py b/pystencils_tests/test_custom_backends.py index 3d0088796e6d6ea6683f69124731cd64fad09507..c7bf7fe243dc6a9df08ba4152cf56ef6ea588bee 100644 --- a/pystencils_tests/test_custom_backends.py +++ b/pystencils_tests/test_custom_backends.py @@ -36,9 +36,9 @@ def test_custom_backends_cpu(): def test_custom_backends_gpu(): - pytest.importorskip('pycuda') - import pycuda.driver - import pystencils.gpucuda.cudajit + pytest.importorskip('cupy') + import cupy + import pystencils.gpu.gpujit z, x, y = pystencils.fields("z, y, x: [2d]") @@ -47,5 +47,5 @@ def test_custom_backends_gpu(): ast = pystencils.create_kernel(normal_assignments, target=Target.GPU) pystencils.show_code(ast, ScreamingGpuBackend()) - with pytest.raises(pycuda.driver.CompileError): - pystencils.gpucuda.cudajit.make_python_function(ast, custom_backend=ScreamingGpuBackend()) + with pytest.raises((cupy.cuda.compiler.JitifyException, cupy.cuda.compiler.CompileException)): + pystencils.gpu.gpujit.make_python_function(ast, custom_backend=ScreamingGpuBackend()) diff --git a/pystencils_tests/test_datahandling.py b/pystencils_tests/test_datahandling.py index afd5f70dac6795ee7bea2d32f3437eb7c3c057cc..15e9cd74baf7df4e8922ce5f4a624a1fc0f6fb75 100644 --- a/pystencils_tests/test_datahandling.py +++ b/pystencils_tests/test_datahandling.py @@ -6,7 +6,7 @@ import numpy as np import pystencils as ps from pystencils import create_data_handling, create_kernel -from pystencils.datahandling.pycuda import PyCudaArrayHandler +from pystencils.gpu.gpu_array_handler import GPUArrayHandler from pystencils.enums import Target try: @@ -15,6 +15,12 @@ except ImportError: import unittest.mock pytest = unittest.mock.MagicMock() +try: + import cupy.cuda.runtime + device_numbers = range(cupy.cuda.runtime.getDeviceCount()) +except ImportError: + device_numbers = [] + SCRIPT_FOLDER = Path(__file__).parent.absolute() INPUT_FOLDER = SCRIPT_FOLDER / "test_data" @@ -85,11 +91,7 @@ def access_and_gather(dh, domain_size): def synchronization(dh, test_gpu=False): field_name = 'comm_field_test' if test_gpu: - try: - from pycuda import driver - import pycuda.autoinit - except ImportError: - return + pytest.importorskip("cupy") field_name += 'Gpu' dh.add_array(field_name, ghost_layers=1, dtype=np.int8, cpu=True, gpu=test_gpu) @@ -215,7 +217,7 @@ def test_kernel(): reduction(dh) try: - import pycuda + import cupy dh = create_data_handling(domain_size=domain_shape, periodicity=True) kernel_execution_jacobi(dh, Target.GPU) except ImportError: @@ -226,7 +228,7 @@ def test_kernel(): def test_kernel_param(target): for domain_shape in [(4, 5), (3, 4, 5)]: if target == Target.GPU: - pytest.importorskip('pycuda') + pytest.importorskip('cupy') dh = create_data_handling(domain_size=domain_shape, periodicity=True, default_target=target) kernel_execution_jacobi(dh, target) @@ -255,6 +257,20 @@ def test_add_arrays(): assert y == dh.fields['y'] +@pytest.mark.parametrize('shape', [(17, 12), (7, 11, 18)]) +@pytest.mark.parametrize('layout', ['zyxf', 'fzyx']) +def test_add_arrays_with_layout(shape, layout): + pytest.importorskip('cupy') + + dh = create_data_handling(domain_size=shape, default_layout=layout, default_target=ps.Target.GPU) + f1 = dh.add_array("f1", values_per_cell=19) + dh.fill(f1.name, 1.0) + + assert dh.cpu_arrays[f1.name].shape == dh.gpu_arrays[f1.name].shape + assert dh.cpu_arrays[f1.name].strides == dh.gpu_arrays[f1.name].strides + assert dh.cpu_arrays[f1.name].dtype == dh.gpu_arrays[f1.name].dtype + + def test_get_kwarg(): domain_shape = (10, 10) field_description = 'src, dst' @@ -265,7 +281,7 @@ def test_get_kwarg(): dh.fill("dst", 0.0, ghost_layers=True) with pytest.raises(ValueError): - dh.add_array('src') + dh.add_array('src', values_per_cell=1) ur = ps.Assignment(src.center, dst.center) kernel = ps.create_kernel(ur).compile() @@ -276,22 +292,20 @@ def test_get_kwarg(): def test_add_custom_data(): - pytest.importorskip('pycuda') - - import pycuda.gpuarray as gpuarray - import pycuda.autoinit # noqa + pytest.importorskip('cupy') + import cupy as cp def cpu_data_create_func(): return np.ones((2, 2), dtype=np.float64) def gpu_data_create_func(): - return gpuarray.zeros((2, 2), dtype=np.float64) + return cp.zeros((2, 2), dtype=np.float64) def cpu_to_gpu_transfer_func(gpuarr, cpuarray): gpuarr.set(cpuarray) def gpu_to_cpu_transfer_func(gpuarr, cpuarray): - gpuarr.get(cpuarray) + cpuarray[:] = gpuarr.get() dh = create_data_handling(domain_size=(10, 10)) dh.add_custom_data('custom_data', @@ -357,10 +371,11 @@ def test_load_data(): assert np.all(dh.cpu_arrays['dst2']) == 0 -def test_array_handler(): +@pytest.mark.parametrize("device_number", device_numbers) +def test_array_handler(device_number): size = (2, 2) - pytest.importorskip('pycuda') - array_handler = PyCudaArrayHandler() + pytest.importorskip('cupy') + array_handler = GPUArrayHandler(device_number) zero_array = array_handler.zeros(size) cpu_array = np.empty(size) @@ -374,8 +389,23 @@ def test_array_handler(): empty = array_handler.empty(size) assert empty.strides == (16, 8) - empty = array_handler.empty(shape=size, layout=(1, 0)) + empty = array_handler.empty(shape=size, order="F") assert empty.strides == (8, 16) random_array = array_handler.randn(size) + cpu_array = np.empty((20, 40), dtype=np.float64) + gpu_array = array_handler.to_gpu(cpu_array) + + assert cpu_array.base is None + assert gpu_array.base is None + assert gpu_array.strides == cpu_array.strides + + cpu_array2 = np.empty((20, 40), dtype=np.float64) + cpu_array2 = cpu_array2.swapaxes(0, 1) + gpu_array2 = array_handler.to_gpu(cpu_array2) + + assert cpu_array2.base is not None + assert gpu_array2.base is not None + assert gpu_array2.strides == cpu_array2.strides + diff --git a/pystencils_tests/test_datahandling_parallel.py b/pystencils_tests/test_datahandling_parallel.py index dd18e4fb18a78ad96d3685e4400799852e2fa9d9..b5aa9832470b8e19d712f73697ab3af4549eaf7e 100644 --- a/pystencils_tests/test_datahandling_parallel.py +++ b/pystencils_tests/test_datahandling_parallel.py @@ -33,12 +33,12 @@ def test_access_and_gather(): dh = ParallelDataHandling(blocks, default_ghost_layers=2) access_and_gather(dh, cells) synchronization(dh, test_gpu=False) - if hasattr(wlb, 'cuda'): + if hasattr(wlb, 'gpu'): synchronization(dh, test_gpu=True) def test_gpu(): - pytest.importorskip('waLBerla.cuda') + pytest.importorskip('waLBerla.gpu') block_size = (4, 7, 1) num_blocks = (3, 2, 1) @@ -59,7 +59,7 @@ def test_gpu(): @pytest.mark.parametrize('target', (pystencils.Target.CPU, pystencils.Target.GPU)) def test_kernel(target): if target == pystencils.Target.GPU: - pytest.importorskip('waLBerla.cuda') + pytest.importorskip('waLBerla.gpu') # 3D blocks = wlb.createUniformBlockGrid(blocks=(3, 2, 4), cellsPerBlock=(3, 2, 5), oneBlockPerProcess=False) @@ -108,7 +108,7 @@ def test_block_iteration(): def test_getter_setter(): - pytest.importorskip('waLBerla.cuda') + pytest.importorskip('waLBerla.gpu') block_size = (2, 2, 2) num_blocks = (2, 2, 2) @@ -131,7 +131,7 @@ def test_getter_setter(): def test_parallel_datahandling_boundary_conditions(): - pytest.importorskip('waLBerla.cuda') + pytest.importorskip('waLBerla.gpu') dh = create_data_handling(domain_size=(7, 7), periodicity=True, parallel=True, default_target=pystencils.Target.GPU) diff --git a/pystencils_tests/test_fast_approximation.py b/pystencils_tests/test_fast_approximation.py index 5b7245af9b12a1127e67ede6e4ce231efd73e078..e211d6897135c0e35005404ddfb28d32b1384532 100644 --- a/pystencils_tests/test_fast_approximation.py +++ b/pystencils_tests/test_fast_approximation.py @@ -7,7 +7,7 @@ from pystencils.fast_approximation import ( def test_fast_sqrt(): - pytest.importorskip('pycuda') + pytest.importorskip('cupy') f, g = ps.fields("f, g: double[2D]") expr = sp.sqrt(f[0, 0] + f[1, 0]) @@ -30,7 +30,7 @@ def test_fast_sqrt(): def test_fast_divisions(): - pytest.importorskip('pycuda') + pytest.importorskip('cupy') f, g = ps.fields("f, g: double[2D]") expr = f[0, 0] / f[1, 0] assert len(insert_fast_divisions(expr).atoms(fast_division)) == 1 diff --git a/pystencils_tests/test_cudagpu.py b/pystencils_tests/test_gpu.py similarity index 80% rename from pystencils_tests/test_cudagpu.py rename to pystencils_tests/test_gpu.py index a65a08ba6d24b30002822e9916b2d3d44639d26a..df452e2b1bd2ec55ecc57c0325ba994a3dac894f 100644 --- a/pystencils_tests/test_cudagpu.py +++ b/pystencils_tests/test_gpu.py @@ -1,14 +1,21 @@ +import pytest + import numpy as np -import pycuda.autoinit -import pycuda.gpuarray as gpuarray +import cupy as cp import sympy as sp from scipy.ndimage import convolve from pystencils import Assignment, Field, fields, CreateKernelConfig, create_kernel, Target -from pystencils.gpucuda import BlockIndexing +from pystencils.gpu import BlockIndexing from pystencils.simp import sympy_cse_on_assignment_list from pystencils.slicing import add_ghost_layers, make_slice, remove_ghost_layers +try: + import cupy + device_numbers = range(cupy.cuda.runtime.getDeviceCount()) +except ImportError: + device_numbers = [] + def test_averaging_kernel(): size = (40, 55) @@ -25,10 +32,10 @@ def test_averaging_kernel(): ast = create_kernel(sympy_cse_on_assignment_list([update_rule]), config=config) kernel = ast.compile() - gpu_src_arr = gpuarray.to_gpu(src_arr) - gpu_dst_arr = gpuarray.to_gpu(dst_arr) + gpu_src_arr = cp.asarray(src_arr) + gpu_dst_arr = cp.asarray(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) - gpu_dst_arr.get(dst_arr) + dst_arr = gpu_dst_arr.get() stencil = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) / 4.0 reference = convolve(remove_ghost_layers(src_arr), stencil, mode='constant', cval=0.0) @@ -52,10 +59,10 @@ def test_variable_sized_fields(): src_arr = add_ghost_layers(src_arr) dst_arr = np.zeros_like(src_arr) - gpu_src_arr = gpuarray.to_gpu(src_arr) - gpu_dst_arr = gpuarray.to_gpu(dst_arr) + gpu_src_arr = cp.asarray(src_arr) + gpu_dst_arr = cp.asarray(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) - gpu_dst_arr.get(dst_arr) + dst_arr = gpu_dst_arr.get() stencil = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) / 4.0 reference = convolve(remove_ghost_layers(src_arr), stencil, mode='constant', cval=0.0) @@ -81,10 +88,10 @@ def test_multiple_index_dimensions(): ast = create_kernel([update_rule], config=config) kernel = ast.compile() - gpu_src_arr = gpuarray.to_gpu(src_arr) - gpu_dst_arr = gpuarray.to_gpu(dst_arr) + gpu_src_arr = cp.asarray(src_arr) + gpu_dst_arr = cp.asarray(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) - gpu_dst_arr.get(dst_arr) + dst_arr = gpu_dst_arr.get() reference = np.zeros_like(dst_arr) gl = np.max(np.abs(np.array(offset, dtype=int))) @@ -109,10 +116,10 @@ def test_ghost_layer(): ast = create_kernel(sympy_cse_on_assignment_list([update_rule]), config=config) kernel = ast.compile() - gpu_src_arr = gpuarray.to_gpu(src_arr) - gpu_dst_arr = gpuarray.to_gpu(dst_arr) + gpu_src_arr = cp.asarray(src_arr) + gpu_dst_arr = cp.asarray(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) - gpu_dst_arr.get(dst_arr) + dst_arr = gpu_dst_arr.get() reference = np.zeros_like(src_arr) reference[ghost_layers[0][0]:-ghost_layers[0][1], ghost_layers[1][0]:-ghost_layers[1][1]] = 1 @@ -121,7 +128,7 @@ def test_ghost_layer(): def test_setting_value(): arr_cpu = np.arange(25, dtype=np.float64).reshape(5, 5) - arr_gpu = gpuarray.to_gpu(arr_cpu) + arr_gpu = cp.asarray(arr_cpu) iteration_slice = make_slice[:, :] f = Field.create_generic("f", 2) @@ -136,11 +143,11 @@ def test_setting_value(): def test_periodicity(): - from pystencils.gpucuda.periodicity import get_periodic_boundary_functor as periodic_gpu + from pystencils.gpu.periodicity import get_periodic_boundary_functor as periodic_gpu from pystencils.slicing import get_periodic_boundary_functor as periodic_cpu arr_cpu = np.arange(50, dtype=np.float64).reshape(5, 5, 2) - arr_gpu = gpuarray.to_gpu(arr_cpu) + arr_gpu = cp.asarray(arr_cpu) periodicity_stencil = [(1, 0), (-1, 0), (1, 1)] periodic_gpu_kernel = periodic_gpu(periodicity_stencil, (5, 5), 1, 2) @@ -149,13 +156,13 @@ def test_periodicity(): cpu_result = np.copy(arr_cpu) periodic_cpu_kernel(cpu_result) - gpu_result = np.copy(arr_cpu) periodic_gpu_kernel(pdfs=arr_gpu) - arr_gpu.get(gpu_result) + gpu_result = arr_gpu.get() np.testing.assert_equal(cpu_result, gpu_result) -def test_block_indexing(): +@pytest.mark.parametrize("device_number", device_numbers) +def test_block_indexing(device_number): f = fields("f: [3D]") bi = BlockIndexing(f, make_slice[:, :, :], block_size=(16, 8, 2), permute_block_size_dependent_on_layout=False) assert bi.call_parameters((3, 2, 32))['block'] == (3, 2, 32) @@ -164,8 +171,19 @@ def test_block_indexing(): bi = BlockIndexing(f, make_slice[:, :, :], block_size=(32, 1, 1), permute_block_size_dependent_on_layout=False) assert bi.call_parameters((1, 16, 16))['block'] == (1, 16, 2) - bi = BlockIndexing(f, make_slice[:, :, :], block_size=(16, 8, 2), maximum_block_size="auto") + bi = BlockIndexing(f, make_slice[:, :, :], block_size=(16, 8, 2), + maximum_block_size="auto", device_number=device_number) + # This function should be used if number of needed registers is known. Can be determined with func.num_regs - blocks = bi.limit_block_size_by_register_restriction([1024, 1024, 1], 1000) + registers_per_thread = 1000 + blocks = bi.limit_block_size_by_register_restriction([1024, 1024, 1], registers_per_thread) + + if cp.cuda.runtime.is_hip: + max_registers_per_block = cp.cuda.runtime.deviceGetAttribute(71, device_number) + else: + device = cp.cuda.Device(device_number) + da = device.attributes + max_registers_per_block = da.get("MaxRegistersPerBlock") + + assert np.prod(blocks) * registers_per_thread < max_registers_per_block - assert sum(blocks) < sum([1024, 1024, 1]) diff --git a/pystencils_tests/test_half_precision.py b/pystencils_tests/test_half_precision.py new file mode 100644 index 0000000000000000000000000000000000000000..6d55d1f0e292fec7b27e9b5837b9771f6890d6b3 --- /dev/null +++ b/pystencils_tests/test_half_precision.py @@ -0,0 +1,41 @@ +import pytest +import platform + +import numpy as np +import pystencils as ps + + +@pytest.mark.parametrize('target', (ps.Target.CPU, ps.Target.GPU)) +def test_half_precison(target): + if target == ps.Target.CPU: + if not platform.machine() in ['arm64', 'aarch64']: + pytest.xfail("skipping half precision test on non arm platform") + + if 'clang' not in ps.cpu.cpujit.get_compiler_config()['command']: + pytest.xfail("skipping half precision because clang compiler is not used") + + if target == ps.Target.GPU: + pytest.importorskip("cupy") + + dh = ps.create_data_handling(domain_size=(10, 10), default_target=target) + + f1 = dh.add_array("f1", values_per_cell=1, dtype=np.float16) + dh.fill("f1", 1.0, ghost_layers=True) + f2 = dh.add_array("f2", values_per_cell=1, dtype=np.float16) + dh.fill("f2", 2.0, ghost_layers=True) + + f3 = dh.add_array("f3", values_per_cell=1, dtype=np.float16) + dh.fill("f3", 0.0, ghost_layers=True) + + up = ps.Assignment(f3.center, f1.center + 2.1 * f2.center) + + config = ps.CreateKernelConfig(target=dh.default_target, default_number_float=np.float32) + ast = ps.create_kernel(up, config=config) + + kernel = ast.compile() + + dh.run_kernel(kernel) + dh.all_to_cpu() + + assert np.all(dh.cpu_arrays[f3.name] == 5.2) + assert dh.cpu_arrays[f3.name].dtype == np.float16 diff --git a/pystencils_tests/test_indexed_kernels.py b/pystencils_tests/test_indexed_kernels.py index fa06a8f166702b53519a398bc544fcdc30f5cc94..c8c88ec86dc36ad5ee0bef1099e8ea1c080ecf14 100644 --- a/pystencils_tests/test_indexed_kernels.py +++ b/pystencils_tests/test_indexed_kernels.py @@ -1,4 +1,6 @@ import numpy as np +import pytest + import pystencils as ps from pystencils import Assignment, Field, CreateKernelConfig, create_kernel, Target @@ -24,35 +26,29 @@ def test_indexed_kernel(): np.testing.assert_allclose(arr[index_arr[i]['x'], index_arr[i]['y']], index_arr[i]['value'], atol=1e-13) -def test_indexed_cuda_kernel(): - try: - import pycuda - except ImportError: - pycuda = None - - if pycuda: - import pycuda.gpuarray as gpuarray - - arr = np.zeros((3, 4)) - dtype = np.dtype([('x', int), ('y', int), ('value', arr.dtype)]) - index_arr = np.zeros((3,), dtype=dtype) - index_arr[0] = (0, 2, 3.0) - index_arr[1] = (1, 3, 42.0) - index_arr[2] = (2, 1, 5.0) - - indexed_field = Field.create_from_numpy_array('index', index_arr) - normal_field = Field.create_from_numpy_array('f', arr) - update_rule = Assignment(normal_field[0, 0], indexed_field('value')) - - config = CreateKernelConfig(target=Target.GPU, index_fields=[indexed_field]) - ast = create_kernel([update_rule], config=config) - kernel = ast.compile() - - gpu_arr = gpuarray.to_gpu(arr) - gpu_index_arr = gpuarray.to_gpu(index_arr) - kernel(f=gpu_arr, index=gpu_index_arr) - gpu_arr.get(arr) - for i in range(index_arr.shape[0]): - np.testing.assert_allclose(arr[index_arr[i]['x'], index_arr[i]['y']], index_arr[i]['value'], atol=1e-13) - else: - print("Did not run test on GPU since no pycuda is available") +def test_indexed_gpu_kernel(): + pytest.importorskip("cupy") + import cupy as cp + + arr = np.zeros((3, 4)) + dtype = np.dtype([('x', int), ('y', int), ('value', arr.dtype)]) + index_arr = np.zeros((3,), dtype=dtype) + index_arr[0] = (0, 2, 3.0) + index_arr[1] = (1, 3, 42.0) + index_arr[2] = (2, 1, 5.0) + + indexed_field = Field.create_from_numpy_array('index', index_arr) + normal_field = Field.create_from_numpy_array('f', arr) + update_rule = Assignment(normal_field[0, 0], indexed_field('value')) + + config = CreateKernelConfig(target=Target.GPU, index_fields=[indexed_field]) + ast = create_kernel([update_rule], config=config) + kernel = ast.compile() + + gpu_arr = cp.asarray(arr) + gpu_index_arr = cp.ndarray(index_arr.shape, dtype=index_arr.dtype) + gpu_index_arr.set(index_arr) + kernel(f=gpu_arr, index=gpu_index_arr) + arr = gpu_arr.get() + for i in range(index_arr.shape[0]): + np.testing.assert_allclose(arr[index_arr[i]['x'], index_arr[i]['y']], index_arr[i]['value'], atol=1e-13) diff --git a/pystencils_tests/test_json_serializer.py b/pystencils_tests/test_json_serializer.py new file mode 100644 index 0000000000000000000000000000000000000000..f4600753559ae1f2052aa115cf55a85dec5c381c --- /dev/null +++ b/pystencils_tests/test_json_serializer.py @@ -0,0 +1,28 @@ +""" +Test the pystencils-specific JSON encoder and serializer as used in the Database class. +""" + +import numpy as np +import tempfile + +from pystencils.config import CreateKernelConfig +from pystencils import Target, Field +from pystencils.runhelper.db import Database, PystencilsJsonSerializer + + +def test_json_serializer(): + + dtype = np.float32 + + index_arr = np.zeros((3,), dtype=dtype) + indexed_field = Field.create_from_numpy_array('index', index_arr) + + # create pystencils config + config = CreateKernelConfig(target=Target.CPU, function_name='dummy_config', data_type=dtype, + index_fields=[indexed_field]) + + # create dummy database + temp_dir = tempfile.TemporaryDirectory() + db = Database(file=temp_dir.name, serializer_info=('pystencils_serializer', PystencilsJsonSerializer)) + + db.save(params={'config': config}, result={'test': 'dummy'}) diff --git a/pystencils_tests/test_loop_cutting.py b/pystencils_tests/test_loop_cutting.py index a21acb50aed510852b21e3d634c7c1e6aa66c610..0372c57398f9dcf4493baf8153d5f3fd7faf27e2 100644 --- a/pystencils_tests/test_loop_cutting.py +++ b/pystencils_tests/test_loop_cutting.py @@ -29,10 +29,6 @@ def offsets_in_plane(normal_plane, offset_int, dimension): return result -# TODO this fails because the condition of the Conditional is not simplified anymore: -# TODO: ---> transformation.simplify_conditionals -# TODO this should be fixed -@pytest.mark.xfail def test_staggered_iteration(): dim = 2 f_arr = np.arange(5**dim).reshape([5]*dim).astype(np.float64) diff --git a/pystencils_tests/test_math_functions.py b/pystencils_tests/test_math_functions.py index eacb490e9d84c8a47be7b16750951b7924adc80f..1fd39378847e6ec391c0e09ccfd56fac2a4e2e95 100644 --- a/pystencils_tests/test_math_functions.py +++ b/pystencils_tests/test_math_functions.py @@ -10,7 +10,7 @@ from pystencils.fast_approximation import fast_division @pytest.mark.parametrize('target', [ps.Target.CPU, ps.Target.GPU]) def test_two_arguments(dtype, func, target): if target == ps.Target.GPU: - pytest.importorskip("pycuda") + pytest.importorskip("cupy") dh = ps.create_data_handling(domain_size=(10, 10), periodicity=True, default_target=target) x = dh.add_array('x', values_per_cell=1, dtype=dtype) @@ -43,7 +43,7 @@ def test_two_arguments(dtype, func, target): @pytest.mark.parametrize('target', [ps.Target.CPU, ps.Target.GPU]) def test_single_arguments(dtype, func, target): if target == ps.Target.GPU: - pytest.importorskip("pycuda") + pytest.importorskip("cupy") dh = ps.create_data_handling(domain_size=(10, 10), periodicity=True, default_target=target) x = dh.add_array('x', values_per_cell=1, dtype=dtype) diff --git a/pystencils_tests/test_modulo.py b/pystencils_tests/test_modulo.py index 7f81ab6448fe8d326d618561b1e147e60e5faea5..959daddb9d8cbc01d6db0fed65c9a411746fd5a9 100644 --- a/pystencils_tests/test_modulo.py +++ b/pystencils_tests/test_modulo.py @@ -9,7 +9,7 @@ from pystencils.astnodes import LoopOverCoordinate, Conditional, Block, SympyAss @pytest.mark.parametrize('iteration_slice', [False, True]) def test_mod(target, iteration_slice): if target == ps.Target.GPU: - pytest.importorskip("pycuda") + pytest.importorskip("cupy") dh = ps.create_data_handling(domain_size=(5, 5), periodicity=True, default_target=ps.Target.CPU) loop_ctrs = [LoopOverCoordinate.get_loop_counter_symbol(i) for i in range(dh.dim)] diff --git a/pystencils_tests/test_phasefield_dentritic_3D.ipynb b/pystencils_tests/test_phasefield_dentritic_3D.ipynb index a9a51773e9e1dbbd487bea43b8d59005773c8f1b..41fddaeedea228b352d7f21a8e08f0188eaee379 100644 --- a/pystencils_tests/test_phasefield_dentritic_3D.ipynb +++ b/pystencils_tests/test_phasefield_dentritic_3D.ipynb @@ -2,17 +2,28 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "<module 'cupy' from '/home/markus/.local/lib/python3.11/site-packages/cupy/__init__.py'>" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import pytest\n", - "pytest.importorskip('pycuda')" + "pytest.importorskip('cupy')" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -32,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -78,38 +89,24 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\bar{\\epsilon} \\left(δ \\left(\\frac{{\\partial_{0} {{φ}_{(0,0,0)}}}^{4}}{\\left({\\partial_{0} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{1} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{2} {{φ}_{(0,0,0)}}}^{2}\\right)^{2}} + \\frac{{\\partial_{1} {{φ}_{(0,0,0)}}}^{4}}{\\left({\\partial_{0} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{1} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{2} {{φ}_{(0,0,0)}}}^{2}\\right)^{2}} + \\frac{{\\partial_{2} {{φ}_{(0,0,0)}}}^{4}}{\\left({\\partial_{0} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{1} {{φ}_{(0,0,0)}}}^{2} + {\\partial_{2} {{φ}_{(0,0,0)}}}^{2}\\right)^{2}}\\right) + 1\\right)$" + "$\\displaystyle \\bar{\\epsilon} \\left(δ \\left(\\frac{{\\partial_{0} {φ}_{(0,0,0)}}^{4}}{\\left({\\partial_{0} {φ}_{(0,0,0)}}^{2} + {\\partial_{1} {φ}_{(0,0,0)}}^{2} + {\\partial_{2} {φ}_{(0,0,0)}}^{2}\\right)^{2}} + \\frac{{\\partial_{1} {φ}_{(0,0,0)}}^{4}}{\\left({\\partial_{0} {φ}_{(0,0,0)}}^{2} + {\\partial_{1} {φ}_{(0,0,0)}}^{2} + {\\partial_{2} {φ}_{(0,0,0)}}^{2}\\right)^{2}} + \\frac{{\\partial_{2} {φ}_{(0,0,0)}}^{4}}{\\left({\\partial_{0} {φ}_{(0,0,0)}}^{2} + {\\partial_{1} {φ}_{(0,0,0)}}^{2} + {\\partial_{2} {φ}_{(0,0,0)}}^{2}\\right)^{2}}\\right) + 1\\right)$" ], "text/plain": [ - " ⎛ ⎛ 4 \n", - " ⎜ ⎜ D(φ[0,0,0]) \n", - "\\bar{\\epsilon}⋅⎜δ⋅⎜───────────────────────────────────────────── + ───────────\n", - " ⎜ ⎜ 2 \n", - " ⎜ ⎜⎛ 2 2 2⎞ ⎛ \n", - " ⎝ ⎝⎝D(φ[0,0,0]) + D(φ[0,0,0]) + D(φ[0,0,0]) ⎠ ⎝D(φ[0,0,0]\n", - "\n", - " 4 4 \n", - " D(φ[0,0,0]) D(φ[0,0,0]) \n", - "────────────────────────────────── + ─────────────────────────────────────────\n", - " 2 \n", - " 2 2 2⎞ ⎛ 2 2 \n", - ") + D(φ[0,0,0]) + D(φ[0,0,0]) ⎠ ⎝D(φ[0,0,0]) + D(φ[0,0,0]) + D(φ[0,0,0]\n", - "\n", - " ⎞ ⎞\n", - " ⎟ ⎟\n", - "────⎟ + 1⎟\n", - " 2⎟ ⎟\n", - " 2⎞ ⎟ ⎟\n", - ") ⎠ ⎠ ⎠" + " ⎛ ⎛ 4 4 4 ⎞ ⎞\n", + " ⎜ ⎜ D(φ[0,0,0]) D(φ[0,0,0]) D(φ[0,0,0]) ⎟ ⎟\n", + "\\bar{\\epsilon}⋅⎜δ⋅⎜───────────────────────────────────────────── + ───────────────────────────────────────────── + ─────────────────────────────────────────────⎟ + 1⎟\n", + " ⎜ ⎜ 2 2 2⎟ ⎟\n", + " ⎜ ⎜⎛ 2 2 2⎞ ⎛ 2 2 2⎞ ⎛ 2 2 2⎞ ⎟ ⎟\n", + " ⎝ ⎝⎝D(φ[0,0,0]) + D(φ[0,0,0]) + D(φ[0,0,0]) ⎠ ⎝D(φ[0,0,0]) + D(φ[0,0,0]) + D(φ[0,0,0]) ⎠ ⎝D(φ[0,0,0]) + D(φ[0,0,0]) + D(φ[0,0,0]) ⎠ ⎠ ⎠" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -137,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -153,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -162,21 +159,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/latex": [ "$\\displaystyle \\left\\{ \\pi : 3.14159265358979, \\ T_{eq} : 1.0, \\ \\bar{\\epsilon} : 0.01, \\ j : 6, \\ α : 0.9, \\ γ : 10, \\ δ : 0.3, \\ θ_{0} : 0.2, \\ κ : 1.8, \\ τ : 0.0003\\right\\}$" ], "text/plain": [ - "{π: 3.14159265358979, T_eq: 1.0, \\bar{\\epsilon}: 0.01, j: 6, α: 0.9, γ: 10, δ:\n", - " 0.3, θ₀: 0.2, κ: 1.8, τ: 0.0003}" + "{π: 3.14159265358979, T_eq: 1.0, \\bar{\\epsilon}: 0.01, j: 6, α: 0.9, γ: 10, δ: 0.3, θ₀: 0.2, κ: 1.8, τ: 0.0003}" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -199,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -219,21 +215,20 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\left[ {{T}_{(0,0,0)}} \\leftarrow 0.0111111111111111 {{T}_{(-1,0,0)}} + 0.0111111111111111 {{T}_{(0,-1,0)}} + 0.0111111111111111 {{T}_{(0,0,-1)}} + 0.933333333333333 {{T}_{(0,0,0)}} + 0.0111111111111111 {{T}_{(0,0,1)}} + 0.0111111111111111 {{T}_{(0,1,0)}} + 0.0111111111111111 {{T}_{(1,0,0)}} + 1.8 \\cdot 10^{-5} {{φ_D}_{(0,0,0)}}\\right]$" + "$\\displaystyle \\left[ {T}_{(0,0,0)} \\leftarrow 0.0111111111111111 {T}_{(0,0,-1)} + 0.933333333333333 {T}_{(0,0,0)} + 0.0111111111111111 {T}_{(1,0,0)} + 0.0111111111111111 {T}_{(0,1,0)} + 0.0111111111111111 {T}_{(0,-1,0)} + 0.0111111111111111 {T}_{(0,0,1)} + 0.0111111111111111 {T}_{(-1,0,0)} + 1.8 \\cdot 10^{-5} {φ_D}_{(0,0,0)}\\right]$" ], "text/plain": [ - "[T_C := 0.0111111111111111⋅T_W + 0.0111111111111111⋅T_S + 0.0111111111111111⋅T\n", - "_B + 0.933333333333333⋅T_C + 0.0111111111111111⋅T_T + 0.0111111111111111⋅T_N +\n", - " 0.0111111111111111⋅T_E + 1.8e-5⋅phidelta_C]" + "[T_C := 0.0111111111111111⋅T_B + 0.933333333333333⋅T_C + 0.0111111111111111⋅T_E + 0.0111111111111111⋅T_N + 0.0111111111111111⋅T_S + 0.0111111111111111⋅T_T + 0.0111111111111111⋅T_\n", + "W + 1.8e-5⋅phidelta_C]" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -244,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -254,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -296,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -313,14 +308,12 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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pptuUl1dXZ/7XLhwoX7yk59o5cqVevrpp/Xmm2/qrLPOystjBACUj3LKa3x7OAAgUCqV0o9+9CPNnDkzsM3ll1+uJ554Qi+++GJm2znnnKMdO3Zo1apVBZglAADB6uvr9YlPfEL33HOPJKmnp0djx47VxRdfrCuuuCL02HHjxunSSy/VpZdemlOfO3fu1BFHHKHly5fri1/8oiTplVde0cSJE9Xa2qoTTzwx/gcKACgL5ZTXDspLr3nW09OjN998U4ceeqhSqdRATwdAGfM8T++++67GjBmjior+Xby+Z88edXV1xTSzbJ7n9Xq+rKqqUlVVVb/7bm1tVWNjY9a2pqamXokQwchrAJKi1PJaV1eX2tradOWVV2a2VVRUqLGxUa2trX0aO0qfbW1t2rdvX1Z+nDBhgo466qiSf9GSnAYgKUotp0nll9eK8kXLN998U2PHjh3oaQBAxpYtW/SBD3ygz8fv2bNH4z84TO3bumOc1fuGDRumXbt2ZW1btGiRrrvuun733d7ertra2qxttbW16uzs1P/+7//q4IMP7vcYpY68BiBpSiWvvf322+ru7rbmqVdeeaVPY0fps729XZWVlRo+fHivNu3t7X0at1iQ0wAkTankNKn88lpRvmh56KGHSjrwH6+6unqAZwOgnHV2dmrs2LGZ56W+6urqUvu2bv132zhVHxrvxw13vtujD059vddzZhxXWSIe5DUASUFeQ3+R0wAkBTmt+BXli5bpy2arq6tJhAASIa63Pw07NKVhh8b7Vqoe5fc5s66urte3xnV0dKi6upqrLCMirwFImlLJayNHjtSgQYOseSroywhcovRZV1enrq4u7dixI+uqlP6MWyzIaQCSplRymlR+eY1vDwcA9EtDQ4PWrFmTtW316tVqaGgYoBkBAHBAZWWlpk6dmpWnenp6tGbNmj7nqSh9Tp06VYMHD85qs2nTJm3evJn8CADos3LLa0V5pSUAlKpur0fdXvx95mLXrl36wx/+kLn/2muvaePGjRoxYoSOOuooXXnllXrjjTf08MMPS5IuvPBC3XPPPfr617+uv/7rv9batWv1/e9/X0888USsjwMAUHySkNdaWlo0Z84cTZs2TdOnT9cdd9yh3bt3a+7cuZKk8847T0ceeaQWL14s6cDbAH/7299mfn/jjTe0ceNGDRs2TB/+8Icj9VlTU6N5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GzZs0OTJk9XU1KRt27ZZ2z/77LM699xzNW/ePP3617/WzJkzNXPmTL344otZ7WbMmKGtW7dmbv/yL/+StX/27Nl66aWXtHr1aj3++ON65plndMEFF+QWwGLGeda7Lc9FxMjWBzEip+WonPIaL1oCAJAUYSvMNmFFpO24oPu2otXVX1Ax618NN9sE9RE0ryiPIaidbW5RjiNG7uOIkfu4UohRCbnttts0f/58zZ07V5MmTdLSpUs1dOhQLVu2zNr+zjvv1IwZM/S1r31NEydO1I033qgTTjhB99xzT1a7qqoq1dXVZW6HHXZYZt/LL7+sVatW6b777lN9fb0+9alP6e6779ajjz6qN998M6+PNzE4z7Lv81xEjIgROS0m5ZTXeNESABIk/eHOcd9QxMzCLWiVPehYWwFo9h21qDWLS9vvirDdtT/X1XFi5EaM3IhRXgx0Xuvq6lJbW5saGxsz2yoqKtTY2KjW1lbrMa2trVntJampqalX+3Xr1mnUqFE65phjdNFFF+mdd97J6mP48OGaNm1aZltjY6MqKiq0fv36yPMvOZxnbsTIjRi5EaO8GOicJpVfXuOLeAAASBp/sej/mcuKub+97TizsLMVelFW8oP6DFuV72sxahuLGLnHIkbusYhRUers7My6X1VVpaqqqqxtb7/9trq7u1VbW5u1vba2Vq+88oq13/b2dmv79vb2zP0ZM2borLPO0vjx4/Xqq6/qqquu0mc/+1m1trZq0KBBam9v16hRo7L6OOiggzRixIisfsoC55kbMXIjRm7EqKhFyWlS+eU1XrQEgATpUUo9MX8GJd9IV0TM4jGogDNXuKMUg2a7oCLQC9lntsl1HrZx+3LlgO1xECP7/MLGJka9+yNGsctnXhs7dmzW9kWLFum6666Ldawg55xzTub34447Tscff7w+9KEPad26dTr99NMLMofEI6e58VzkRozciFHBlGpOk5Kb13jREgCApLEVgf4Cz1UU+tnamH2aY4ZtS283C86+Fo9hx9gKYttxxCj7vu04YpR933YcMSo6W7ZsUXV1dea+7YqUkSNHatCgQero6Mja3tHRobq6Omu/dXV1ObWXpKOPPlojR47UH/7wB51++umqq6vr9YUI+/fv1/bt20P7KUmcZ/Y+eS7qjRiFj2Hrkxj1VsI5TSq/vMYHnQFAgnhKHVjBi/HmFWPW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", "text/plain": [ - "<Figure size 1152x432 with 6 Axes>" + "<Figure size 1600x600 with 6 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -334,7 +327,172 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step 0 25.45903586700115 0.9934522628963286\n", + "Step 1 17.733385490000728 0.993928549434581\n", + "Step 2 17.385464679000506 0.9969817492516411\n", + "Step 3 17.73187294499985 0.9987018046573852\n", + "Step 4 17.42424472499988 0.9994581962161123\n", + "Step 5 17.39850756800115 0.9997730200431632\n", + "Step 6 17.38586500100064 0.9999032282027154\n", + "Step 7 17.41260802599936 0.9999573480152241\n", + "Step 8 17.873442951999095 0.9999802946360343\n", + "Step 9 17.04619025899956 0.9999955995645813\n", + "Step 10 17.099138269000832 0.9999996727969152\n", + "Step 11 17.099542428999484 0.999999973143393\n", + "Step 12 17.139662244000647 0.999999997546683\n", + "Step 13 17.218893876999573 0.9999999997490552\n", + "Step 14 17.084921174000556 0.999999999971159\n", + "Step 15 17.033554589999767 0.9999999999962744\n", + "Step 16 17.010074742000143 0.9999999999994603\n", + "Step 17 17.104563296001288 0.9999999999999127\n", + "Step 18 17.021247803000733 0.9999999999999842\n", + "Step 19 17.07957060999979 0.9999999999999966\n", + "Step 20 17.05240749100085 0.9999999999999966\n", + "Step 21 17.00356302900036 0.9999999999999966\n", + "Step 22 17.1113736719999 0.9999999999999966\n", + "Step 23 17.013587127999926 0.9999999999999966\n", + "Step 24 17.004048287999467 0.9999999999999966\n", + "Step 25 17.01311813599932 0.9999999999999966\n", + "Step 26 17.018968939000843 0.9999999999999966\n", + "Step 27 17.01230432599914 0.9999999999999966\n", + "Step 28 17.016388629001085 0.9999999999999966\n", + "Step 29 17.036423421999643 0.9999999999999966\n", + "Step 30 17.013809308999043 0.9999999999999966\n", + "Step 31 17.02102562500113 0.9999999999999966\n", + "Step 32 17.125694684000337 0.9999999999999966\n", + "Step 33 17.018816687999788 0.9999999999999966\n", + "Step 34 17.033273111001108 0.9999999999999966\n", + "Step 35 17.031105800999285 0.9999999999999966\n", + "Step 36 17.344186886000898 0.9999999999999966\n", + "Step 37 17.00491729500027 0.9999999999999966\n", + "Step 38 17.044662663000054 0.9999999999999966\n", + "Step 39 17.01994404600009 0.9999999999999966\n", + "Step 40 17.01687352800036 0.9999999999999966\n", + "Step 41 17.03885115400044 0.9999999999999966\n", + "Step 42 17.025812523999775 0.9999999999999966\n", + "Step 43 17.029889327999626 0.9999999999999966\n", + "Step 44 17.065132745001392 0.9999999999999966\n", + "Step 45 17.03455267100071 0.9999999999999966\n", + "Step 46 17.042484248999244 0.9999999999999966\n", + "Step 47 17.135204002001046 0.9999999999999966\n", + "Step 48 17.049361208000846 0.9999999999999966\n", + "Step 49 17.051931253001385 0.9999999999999966\n", + "Step 50 17.05464122400008 0.9999999999999966\n", + "Step 51 17.042147963999014 0.9999999999999966\n", + "Step 52 17.066642416000832 0.9999999999999966\n", + "Step 53 17.0870322819992 0.9999999999999966\n", + "Step 54 17.071626777000347 0.9999999999999966\n", + "Step 55 17.11173596700064 0.9999999999999966\n", + "Step 56 17.18877132200032 0.9999999999999966\n", + "Step 57 17.154270471000928 0.9999999999999966\n", + "Step 58 17.672991446001106 0.9999999999999966\n", + "Step 59 17.674105590998806 0.9999999999999966\n", + "Step 60 17.347509929999433 0.9999999999999966\n", + "Step 61 17.54230526399988 0.9999999999999966\n", + "Step 62 17.694092154999453 0.9999999999999966\n", + "Step 63 17.531714112999907 0.9999999999999966\n", + "Step 64 17.98786205900069 0.9999999999999966\n", + "Step 65 17.59379430700028 0.9999999999999966\n", + "Step 66 17.496220975999677 0.9999999999999966\n", + "Step 67 17.61460809500022 0.9999999999999966\n", + "Step 68 17.81554028100072 0.9999999999999966\n", + "Step 69 17.50470085699999 0.9999999999999966\n", + "Step 70 18.22215127399977 0.9999999999999966\n", + "Step 71 17.95782054099982 0.9999999999999966\n", + "Step 72 18.02512274399851 0.9999999999999966\n", + "Step 73 17.519333276000907 0.9999999999999966\n", + "Step 74 18.148525913999038 0.9999999999999966\n", + "Step 75 17.768654807998246 0.9999999999999966\n", + "Step 76 17.68822824000017 0.9999999999999966\n", + "Step 77 17.630756663000284 0.9999999999999966\n", + "Step 78 17.73377000599976 0.9999999999999966\n", + "Step 79 17.553744683998957 0.9999999999999966\n", + "Step 80 17.616365314001087 0.9999999999999966\n", + "Step 81 17.520774246000656 0.9999999999999966\n", + "Step 82 17.824773792999622 0.9999999999999966\n", + "Step 83 18.162243766000756 0.9999999999999966\n", + "Step 84 17.59411170199928 0.9999999999999966\n", + "Step 85 17.78331206599978 0.9999999999999966\n", + "Step 86 18.16322874999969 0.9999999999999966\n", + "Step 87 17.877422854000542 0.9999999999999966\n", + "Step 88 17.723775387999922 0.9999999999999966\n", + "Step 89 17.93192093200014 0.9999999999999966\n", + "Step 90 18.18813704400054 0.9999999999999966\n", + "Step 91 17.924124131999633 0.9999999999999966\n", + "Step 92 17.7537402930011 0.9999999999999966\n", + "Step 93 18.066451909000534 0.9999999999999966\n", + "Step 94 18.1830705400007 0.9999999999999966\n", + "Step 95 18.144785267999396 0.9999999999999966\n", + "Step 96 17.771601014001135 0.9999999999999966\n", + "Step 97 18.371283865000805 0.9999999999999966\n", + "Step 98 18.569847105998633 0.9999999999999966\n", + "Step 99 18.27999508600078 0.9999999999999966\n", + "Step 100 17.876706947999992 0.9999999999999966\n", + "Step 101 18.362252414000977 0.9999999999999966\n", + "Step 102 18.184471571999893 0.9999999999999966\n", + "Step 103 17.953990222000357 0.9999999999999966\n", + "Step 104 18.139474450999842 0.9999999999999966\n", + "Step 105 17.951657051999064 0.9999999999999966\n", + "Step 106 17.9079576109998 0.9999999999999966\n", + "Step 107 17.87303800600057 0.9999999999999966\n", + "Step 108 17.93147389799924 0.9999999999999966\n", + "Step 109 18.11586603000069 0.9999999999999966\n", + "Step 110 17.81402047099982 0.9999999999999966\n", + "Step 111 18.042384932999994 0.9999999999999966\n", + "Step 112 18.28486302300007 0.9999999999999966\n", + "Step 113 18.207277753999733 0.9999999999999966\n", + "Step 114 17.95677446300033 0.9999999999999966\n", + "Step 115 18.060943858001338 0.9999999999999966\n", + "Step 116 18.289367157000015 0.9999999999999966\n", + "Step 117 17.892628915000387 0.9999999999999966\n", + "Step 118 17.864017376999982 0.9999999999999966\n", + "Step 119 18.149063675000434 0.9999999999999966\n", + "Step 120 18.52748107499974 0.9999999999999966\n", + "Step 121 18.263750603000517 0.9999999999999966\n", + "Step 122 18.062445188999845 0.9999999999999966\n", + "Step 123 18.676733229000092 0.9999999999999966\n", + "Step 124 17.94438390400137 0.9999999999999966\n", + "Step 125 18.117840117000014 0.9999999999999966\n", + "Step 126 18.08436953599994 0.9999999999999966\n", + "Step 127 17.971794098000828 0.9999999999999966\n", + "Step 128 18.37189302399929 0.9999999999999966\n", + "Step 129 18.186950645000252 0.9999999999999966\n", + "Step 130 18.30828943600136 0.9999999999999966\n", + "Step 131 18.53486498699931 0.9999999999999966\n", + "Step 132 18.302330796001115 0.9999999999999966\n", + "Step 133 18.28120723899883 0.9999999999999966\n", + "Step 134 18.4264274319994 0.9999999999999966\n", + "Step 135 18.156916502000968 0.9999999999999966\n", + "Step 136 18.33176715799891 0.9999999999999966\n", + "Step 137 18.704046654000194 0.9999999999999966\n", + "Step 138 18.061599176000527 0.9999999999999966\n", + "Step 139 18.313615737000873 0.9999999999999966\n", + "Step 140 19.13900512299915 0.9999999999999966\n", + "Step 141 18.634621335999327 0.9999999999999966\n", + "Step 142 18.48925181300001 0.9999999999999966\n", + "Step 143 18.603877730000022 0.9999999999999966\n", + "Step 144 18.455599974000506 0.9999999999999966\n", + "Step 145 18.61112040399894 0.9999999999999966\n", + "Step 146 18.832362896999257 0.9999999999999966\n", + "Step 147 18.292130691001148 0.9999999999999966\n", + "Step 148 18.38444646700009 0.9999999999999966\n", + "Step 149 18.14168985700053 0.9999999999999966\n", + "Step 150 18.834586269000283 0.9999999999999966\n", + "Step 151 18.90085793199978 0.9999999999999966\n", + "Step 152 18.301890503000322 0.9999999999999966\n", + "Step 153 18.99428056400029 0.9999999999999966\n", + "Step 154 18.442107730001226 0.9999999999999966\n", + "Step 155 18.12089733100038 0.9999999999999966\n", + "Step 156 18.185502423999424 0.9999999999999966\n", + "Step 157 18.189794200001415 0.9999999999999966\n" + ] + } + ], "source": [ "if 'is_test_run' in globals():\n", " time_loop(2)\n", @@ -355,7 +513,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -369,9 +527,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.0rc1" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/pystencils_tests/test_print_infinity.py b/pystencils_tests/test_print_infinity.py index c4cbb0a88ab4684363ee4ee21e5d38052a448d47..62c83e68a8e87ab01a702608b3d7e53884511255 100644 --- a/pystencils_tests/test_print_infinity.py +++ b/pystencils_tests/test_print_infinity.py @@ -18,7 +18,7 @@ def test_print_infinity(type, negative, target): ast = pystencils.create_kernel(assignment, data_type=type, target=target) if target == pystencils.Target.GPU: - pytest.importorskip('pycuda') + pytest.importorskip('cupy') ast.compile() diff --git a/pystencils_tests/test_random.py b/pystencils_tests/test_random.py index 535d62ac99664cf1ca3bb2872dde8d5838c91210..77d06b5133d21cfe3e3742703a6c4eb0106221be 100644 --- a/pystencils_tests/test_random.py +++ b/pystencils_tests/test_random.py @@ -29,7 +29,7 @@ if get_compiler_config()['os'] == 'windows': @pytest.mark.parametrize('dtype', ('float', 'double')) def test_rng(target, rng, precision, dtype, t=124, offsets=(0, 0), keys=(0, 0), offset_values=None): if target == Target.GPU: - pytest.importorskip('pycuda') + pytest.importorskip('cupy') if instruction_sets and {'neon', 'sve', 'vsx', 'rvv'}.intersection(instruction_sets) and rng == 'aesni': pytest.xfail('AES not yet implemented for this architecture') if rng == 'aesni' and len(keys) == 2: diff --git a/pystencils_tests/test_simplifications.py b/pystencils_tests/test_simplifications.py index ef8ae7ce61a07c992d09807933061c73e61484a1..61d009d03bd341032896076b65fabcb3630859d5 100644 --- a/pystencils_tests/test_simplifications.py +++ b/pystencils_tests/test_simplifications.py @@ -148,7 +148,7 @@ def test_add_subexpressions_for_field_reads(): @pytest.mark.skipif((vs.major, vs.minor, vs.micro) == (3, 8, 2), reason="does not work on python 3.8.2 for some reason") def test_sympy_optimizations(target, dtype): if target == ps.Target.GPU: - pytest.importorskip("pycuda") + pytest.importorskip("cupy") src, dst = ps.fields(f'src, dst: {dtype}[2d]') assignments = ps.AssignmentCollection({ @@ -172,7 +172,7 @@ def test_sympy_optimizations(target, dtype): @pytest.mark.skipif((vs.major, vs.minor, vs.micro) == (3, 8, 2), reason="does not work on python 3.8.2 for some reason") def test_evaluate_constant_terms(target, simplification): if target == ps.Target.GPU: - pytest.importorskip("pycuda") + pytest.importorskip("cupy") src, dst = ps.fields('src, dst: float32[2d]') # cos of a number will always be simplified diff --git a/setup.py b/setup.py index 62282470e3713cb94da0b4e7fcdf34a7b761489d..31392a747a564de22b4224e1d02e6ad1078fc1aa 100644 --- a/setup.py +++ b/setup.py @@ -112,7 +112,7 @@ setuptools.setup(name='pystencils', "Source Code": "https://i10git.cs.fau.de/pycodegen/pystencils", }, extras_require={ - 'gpu': ['pycuda'], + 'gpu': ['cupy'], 'alltrafos': ['islpy', 'py-cpuinfo'], 'bench_db': ['blitzdb', 'pymongo', 'pandas'], 'interactive': ['matplotlib', 'ipy_table', 'imageio', 'jupyter', 'pyevtk', 'rich', 'graphviz'],