From 0568f6f8f8c5b86e6e9e1f1a09a938cd5e3fd8cf Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafaelravedutti@gmail.com> Date: Thu, 17 Feb 2022 23:16:50 +0100 Subject: [PATCH] Transformations and analysis refactoring Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com> --- examples/kernels | 1537 ++++++++--------- examples/kernels.pdf | Bin 44937 -> 44739 bytes examples/lj_func.py | 3 +- examples/lj_ns.cpp | 20 +- setup.py | 1 + src/pairs/analysis/__init__.py | 28 + src/pairs/analysis/bin_ops.py | 54 + .../LICM.py => analysis/blocks.py} | 98 -- src/pairs/analysis/modules.py | 34 + src/pairs/sim/simulation.py | 30 +- src/pairs/transformations/__init__.py | 66 + .../{merge_adjacent_blocks.py => blocks.py} | 5 - .../{add_device_copies.py => devices.py} | 0 ...rioritize_scalar_ops.py => expressions.py} | 42 +- src/pairs/transformations/loops.py | 53 + src/pairs/transformations/lower.py | 8 - src/pairs/transformations/modules.py | 54 +- src/pairs/transformations/replace_symbols.py | 14 - src/pairs/transformations/set_used_bin_ops.py | 22 - src/pairs/transformations/simplify.py | 36 - 20 files changed, 1062 insertions(+), 1043 deletions(-) create mode 100644 src/pairs/analysis/__init__.py create mode 100644 src/pairs/analysis/bin_ops.py rename src/pairs/{transformations/LICM.py => analysis/blocks.py} (56%) create mode 100644 src/pairs/analysis/modules.py rename src/pairs/transformations/{merge_adjacent_blocks.py => blocks.py} (85%) rename src/pairs/transformations/{add_device_copies.py => devices.py} (100%) rename src/pairs/transformations/{prioritize_scalar_ops.py => expressions.py} (64%) create mode 100644 src/pairs/transformations/loops.py delete mode 100644 src/pairs/transformations/replace_symbols.py delete mode 100644 src/pairs/transformations/set_used_bin_ops.py delete mode 100644 src/pairs/transformations/simplify.py diff --git a/examples/kernels b/examples/kernels index f167b2d..3109f52 100644 --- a/examples/kernels +++ b/examples/kernels @@ -1,775 +1,770 @@ digraph AST { node [color=lightblue2 style=filled] size="6,6" - n139969368120288 [label=Block] - n139969367650200 [label=Module] - n139969368120288 -> n139969367650200 - n139969367650256 [label=Module] - n139969368120288 -> n139969367650256 - n139969367650200 [label=Module] - n139969367650144 [label=Block] - n139969367650200 -> n139969367650144 - n139969367650144 [label=Block] - n139969367647400 [label=ParticleFor] - n139969367650144 -> n139969367647400 - n139969367647400 [label=ParticleFor] - n139969366898952 [label=Block] - n139969367647400 -> n139969366898952 - n139969370135744 [label=nlocal] - n139969367647400 -> n139969370135744 - n139969366898952 [label=Block] - n139969366899120 [label=For] - n139969366898952 -> n139969366899120 - n139969366899400 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366899400 -> n139969366898784 - n139969367646952 [label=neighborlist_capacity] - n139969366899400 -> n139969367646952 - n139969366898784 [label="Iter(14)"] - n139969367646952 [label=neighborlist_capacity] - n139969366899624 [label=PropertyAccess] - n139969368120512 [label=position] - n139969366899624 -> n139969368120512 - n139969366898784 [label="Iter(14)"] - n139969366899624 -> n139969366898784 - n139969366925440 [label="*"] - n139969366899624 -> n139969366925440 - n139969366927288 [label="+"] - n139969366899624 -> n139969366927288 - n139969366929080 [label="+"] - n139969366899624 -> n139969366929080 - n139969368120512 [label=position] - n139969366925440 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366925440 -> n139969366898784 - n139969366925496 [label=3] - n139969366925440 -> n139969366925496 - n139969366925496 [label=3] - n139969366927288 [label="+"] - n139969366927120 [label="*"] - n139969366927288 -> n139969366927120 - n139969366927344 [label=1] - n139969366927288 -> n139969366927344 - n139969366927120 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366927120 -> n139969366898784 - n139969366927176 [label=3] - n139969366927120 -> n139969366927176 - n139969366927176 [label=3] - n139969366927344 [label=1] - n139969366929080 [label="+"] - n139969366928912 [label="*"] - n139969366929080 -> n139969366928912 - n139969366929136 [label=2] - n139969366929080 -> n139969366929136 - n139969366928912 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366928912 -> n139969366898784 - n139969366928968 [label=3] - n139969366928912 -> n139969366928968 - n139969366928968 [label=3] - n139969366929136 [label=2] - n139969366900016 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366900016 -> n139969366898784 - n139969366900072 [label=3] - n139969366900016 -> n139969366900072 - n139969366900072 [label=3] - n139969366926336 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366926336 -> n139969366898784 - n139969366926392 [label=3] - n139969366926336 -> n139969366926392 - n139969366926392 [label=3] - n139969366926504 [label="+"] - n139969366926336 [label="*"] - n139969366926504 -> n139969366926336 - n139969366926560 [label=1] - n139969366926504 -> n139969366926560 - n139969366926560 [label=1] - n139969366928128 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969366928128 -> n139969366898784 - n139969366928184 [label=3] - n139969366928128 -> n139969366928184 - n139969366928184 [label=3] - n139969366928296 [label="+"] - n139969366928128 [label="*"] - n139969366928296 -> n139969366928128 - n139969366928352 [label=2] - n139969366928296 -> n139969366928352 - n139969366928352 [label=2] - n139969367692344 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367692344 -> n139969366898784 - n139969367692288 [label=3] - n139969367692344 -> n139969367692288 - n139969367692288 [label=3] - n139969367691616 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367691616 -> n139969366898784 - n139969367691672 [label=3] - n139969367691616 -> n139969367691672 - n139969367691672 [label=3] - n139969367692120 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367692120 -> n139969366898784 - n139969367692176 [label=3] - n139969367692120 -> n139969367692176 - n139969367692176 [label=3] - n139969367692456 [label="+"] - n139969367692120 [label="*"] - n139969367692456 -> n139969367692120 - n139969367692512 [label=1] - n139969367692456 -> n139969367692512 - n139969367692512 [label=1] - n139969367692624 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367692624 -> n139969366898784 - n139969367692680 [label=3] - n139969367692624 -> n139969367692680 - n139969367692680 [label=3] - n139969367694024 [label="+"] - n139969367692624 [label="*"] - n139969367694024 -> n139969367692624 - n139969367692792 [label=1] - n139969367694024 -> n139969367692792 - n139969367692792 [label=1] - n139969367694248 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367694248 -> n139969366898784 - n139969367694640 [label=3] - n139969367694248 -> n139969367694640 - n139969367694640 [label=3] - n139969367694808 [label="+"] - n139969367694248 [label="*"] - n139969367694808 -> n139969367694248 - n139969367695088 [label=2] - n139969367694808 -> n139969367695088 - n139969367695088 [label=2] - n139969367695256 [label="*"] - n139969366898784 [label="Iter(14)"] - n139969367695256 -> n139969366898784 - n139969367695312 [label=3] - n139969367695256 -> n139969367695312 - n139969367695312 [label=3] - n139969367826560 [label="+"] - n139969367695256 [label="*"] - n139969367826560 -> n139969367695256 - n139969367826616 [label=2] - n139969367826560 -> n139969367826616 - n139969367826616 [label=2] - n139969366899120 [label=For] - n139969366899176 [label="Iter(15)"] - n139969366899120 -> n139969366899176 - n139969366899288 [label=Block] - n139969366899120 -> n139969366899288 - n139969366899232 [label=0] - n139969366899120 -> n139969366899232 - n139969366899064 [label=ArrayAccess] - n139969366899120 -> n139969366899064 - n139969366899176 [label="Iter(15)"] - n139969366899288 [label=Block] - n139969366958768 [label=Filter] - n139969366899288 -> n139969366958768 - n139969366899512 [label="+"] - n139969366899400 [label="*"] - n139969366899512 -> n139969366899400 - n139969366899176 [label="Iter(15)"] - n139969366899512 -> n139969366899176 - n139969366899736 [label=PropertyAccess] - n139969368120512 [label=position] - n139969366899736 -> n139969368120512 - n139969366899344 [label=ArrayAccess] - n139969366899736 -> n139969366899344 - n139969366925776 [label="*"] - n139969366899736 -> n139969366925776 - n139969366927624 [label="+"] - n139969366899736 -> n139969366927624 - n139969366958152 [label="+"] - n139969366899736 -> n139969366958152 - n139969366899344 [label=ArrayAccess] - n139969367647008 [label=neighborlists] - n139969366899344 -> n139969367647008 - n139969366899512 [label="+"] - n139969366899344 -> n139969366899512 - n139969367647008 [label=neighborlists] - n139969366925776 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366925776 -> n139969366899344 - n139969366925832 [label=3] - n139969366925776 -> n139969366925832 - n139969366925832 [label=3] - n139969366927624 [label="+"] - n139969366927456 [label="*"] - n139969366927624 -> n139969366927456 - n139969366927680 [label=1] - n139969366927624 -> n139969366927680 - n139969366927456 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366927456 -> n139969366899344 - n139969366927512 [label=3] - n139969366927456 -> n139969366927512 - n139969366927512 [label=3] - n139969366927680 [label=1] - n139969366958152 [label="+"] - n139969366929248 [label="*"] - n139969366958152 -> n139969366929248 - n139969366958208 [label=2] - n139969366958152 -> n139969366958208 - n139969366929248 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366929248 -> n139969366899344 - n139969366929304 [label=3] - n139969366929248 -> n139969366929304 - n139969366929304 [label=3] - n139969366958208 [label=2] - n139969366899848 [label="-"] - n139969366899624 [label=PropertyAccess] - n139969366899848 -> n139969366899624 - n139969366899736 [label=PropertyAccess] - n139969366899848 -> n139969366899736 - n139969366900352 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366900352 -> n139969366899344 - n139969366900408 [label=3] - n139969366900352 -> n139969366900408 - n139969366900408 [label=3] - n139969366926168 [label="*"] - n139969366900688 [label=VectorAccess] - n139969366926168 -> n139969366900688 - n139969366926112 [label=VectorAccess] - n139969366926168 -> n139969366926112 - n139969366900688 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366900688 -> n139969366899848 - n139969366926112 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366926112 -> n139969366899848 - n139969366926672 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366926672 -> n139969366899344 - n139969366926728 [label=3] - n139969366926672 -> n139969366926728 - n139969366926728 [label=3] - n139969366926840 [label="+"] - n139969366926672 [label="*"] - n139969366926840 -> n139969366926672 - n139969366926896 [label=1] - n139969366926840 -> n139969366926896 - n139969366926896 [label=1] - n139969366927848 [label="*"] - n139969366927008 [label=VectorAccess] - n139969366927848 -> n139969366927008 - n139969366927792 [label=VectorAccess] - n139969366927848 -> n139969366927792 - n139969366927008 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366927008 -> n139969366899848 - n139969366927792 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366927792 -> n139969366899848 - n139969366927960 [label="+"] - n139969366926168 [label="*"] - n139969366927960 -> n139969366926168 - n139969366927848 [label="*"] - n139969366927960 -> n139969366927848 - n139969366928464 [label="*"] - n139969366899344 [label=ArrayAccess] - n139969366928464 -> n139969366899344 - n139969366928520 [label=3] - n139969366928464 -> n139969366928520 - n139969366928520 [label=3] - n139969366928632 [label="+"] - n139969366928464 [label="*"] - n139969366928632 -> n139969366928464 - n139969366928688 [label=2] - n139969366928632 -> n139969366928688 - n139969366928688 [label=2] - n139969366958376 [label="*"] - n139969366928800 [label=VectorAccess] - n139969366958376 -> n139969366928800 - n139969366958320 [label=VectorAccess] - n139969366958376 -> n139969366958320 - n139969366928800 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366928800 -> n139969366899848 - n139969366958320 [label=VectorAccess] - n139969366899848 [label="-"] - n139969366958320 -> n139969366899848 - n139969366958488 [label="+"] - n139969366927960 [label="+"] - n139969366958488 -> n139969366927960 - n139969366958376 [label="*"] - n139969366958488 -> n139969366958376 - n139969366958600 [label="<"] - n139969366958488 [label="+"] - n139969366958600 -> n139969366958488 - n139969366958656 [label=2.5] - n139969366958600 -> n139969366958656 - n139969366958656 [label=2.5] - n139969366958768 [label=Filter] - n139969366958600 [label="<"] - n139969366958768 -> n139969366958600 - n139969367650088 [label=Block] - n139969366958768 -> n139969367650088 - n139969367650088 [label=Block] - n139969367693296 [label=Assign] - n139969367650088 -> n139969367693296 - n139969367694976 [label="/"] - n139969367694864 [label=1.0] - n139969367694976 -> n139969367694864 - n139969366958488 [label="+"] - n139969367694976 -> n139969366958488 - n139969367694864 [label=1.0] - n139969367694696 [label="*"] - n139969367694976 [label="/"] - n139969367694696 -> n139969367694976 - n139969367694976 [label="/"] - n139969367694696 -> n139969367694976 - n139969367694472 [label="*"] - n139969367694696 [label="*"] - n139969367694472 -> n139969367694696 - n139969367694976 [label="/"] - n139969367694472 -> n139969367694976 - n139969367694920 [label=PropertyAccess] - n139969368120624 [label=force] - n139969367694920 -> n139969368120624 - n139969366898784 [label="Iter(14)"] - n139969367694920 -> n139969366898784 - n139969367691616 [label="*"] - n139969367694920 -> n139969367691616 - n139969367694024 [label="+"] - n139969367694920 -> n139969367694024 - n139969367826560 [label="+"] - n139969367694920 -> n139969367826560 - n139969368120624 [label=force] - n139969367693856 [label="*"] - n139969366899848 [label="-"] - n139969367693856 -> n139969366899848 - n139969367693744 [label=48.0] - n139969367693856 -> n139969367693744 - n139969367693744 [label=48.0] - n139969367693632 [label="*"] - n139969366899848 [label="-"] - n139969367693632 -> n139969366899848 - n139969367370328 [label="*"] - n139969367693632 -> n139969367370328 - n139969367370328 [label="*"] - n139969367693744 [label=48.0] - n139969367370328 -> n139969367693744 - n139969367694472 [label="*"] - n139969367370328 -> n139969367694472 - n139969367693464 [label="-"] - n139969367694472 [label="*"] - n139969367693464 -> n139969367694472 - n139969367693520 [label=0.5] - n139969367693464 -> n139969367693520 - n139969367693520 [label=0.5] - n139969367693352 [label="*"] - n139969366899848 [label="-"] - n139969367693352 -> n139969366899848 - n139969367370440 [label="*"] - n139969367693352 -> n139969367370440 - n139969367370440 [label="*"] - n139969367370328 [label="*"] - n139969367370440 -> n139969367370328 - n139969367693464 [label="-"] - n139969367370440 -> n139969367693464 - n139969367692904 [label="*"] - n139969366899848 [label="-"] - n139969367692904 -> n139969366899848 - n139969366959328 [label="*"] - n139969367692904 -> n139969366959328 - n139969366959328 [label="*"] - n139969367370440 [label="*"] - n139969366959328 -> n139969367370440 - n139969367694976 [label="/"] - n139969366959328 -> n139969367694976 - n139969367693016 [label="*"] - n139969366899848 [label="-"] - n139969367693016 -> n139969366899848 - n139969366959328 [label="*"] - n139969367693016 -> n139969366959328 - n139969367693240 [label="+"] - n139969367694920 [label=PropertyAccess] - n139969367693240 -> n139969367694920 - n139969367693016 [label="*"] - n139969367693240 -> n139969367693016 - n139969367693296 [label=Assign] - n139969367692008 [label=VectorAccess] - n139969367693296 -> n139969367692008 - n139969367691560 [label=VectorAccess] - n139969367693296 -> n139969367691560 - n139969367694192 [label=VectorAccess] - n139969367693296 -> n139969367694192 - n139969367692568 [label=VectorAccess] - n139969367693296 -> n139969367692568 - n139969367826784 [label=VectorAccess] - n139969367693296 -> n139969367826784 - n139969367695200 [label=VectorAccess] - n139969367693296 -> n139969367695200 - n139969367692008 [label=VectorAccess] - n139969367694920 [label=PropertyAccess] - n139969367692008 -> n139969367694920 - n139969367691560 [label=VectorAccess] - n139969367693240 [label="+"] - n139969367691560 -> n139969367693240 - n139969367694192 [label=VectorAccess] - n139969367694920 [label=PropertyAccess] - n139969367694192 -> n139969367694920 - n139969367692568 [label=VectorAccess] - n139969367693240 [label="+"] - n139969367692568 -> n139969367693240 - n139969367826784 [label=VectorAccess] - n139969367694920 [label=PropertyAccess] - n139969367826784 -> n139969367694920 - n139969367695200 [label=VectorAccess] - n139969367693240 [label="+"] - n139969367695200 -> n139969367693240 - n139969366899232 [label=0] - n139969366899064 [label=ArrayAccess] - n139969367647064 [label=numneighs] - n139969366899064 -> n139969367647064 - n139969366898784 [label="Iter(14)"] - n139969366899064 -> n139969366898784 - n139969367647064 [label=numneighs] - n139969370135744 [label=nlocal] - n139969367650256 [label=Module] - n139969367647512 [label=Block] - n139969367650256 -> n139969367647512 - n139969367647512 [label=Block] - n139969367649808 [label=ParticleFor] - n139969367647512 -> n139969367649808 - n139969367649808 [label=ParticleFor] - n139969367647736 [label=Block] - n139969367649808 -> n139969367647736 - n139969370135744 [label=nlocal] - n139969367649808 -> n139969370135744 - n139969367647736 [label=Block] - n139969367827568 [label=Assign] - n139969367647736 -> n139969367827568 - n139969367344464 [label=Assign] - n139969367647736 -> n139969367344464 - n139969367826896 [label=PropertyAccess] - n139969368120568 [label=velocity] - n139969367826896 -> n139969368120568 - n139969367648800 [label="Iter(0)"] - n139969367826896 -> n139969367648800 - n139969367828072 [label="*"] - n139969367826896 -> n139969367828072 - n139969367829808 [label="+"] - n139969367826896 -> n139969367829808 - n139969367343680 [label="+"] - n139969367826896 -> n139969367343680 - n139969368120568 [label=velocity] - n139969367648800 [label="Iter(0)"] - n139969367828072 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367828072 -> n139969367648800 - n139969367828464 [label=3] - n139969367828072 -> n139969367828464 - n139969367828464 [label=3] - n139969367829808 [label="+"] - n139969367829304 [label="*"] - n139969367829808 -> n139969367829304 - n139969367829864 [label=1] - n139969367829808 -> n139969367829864 - n139969367829304 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367829304 -> n139969367648800 - n139969367829696 [label=3] - n139969367829304 -> n139969367829696 - n139969367829696 [label=3] - n139969367829864 [label=1] - n139969367343680 [label="+"] - n139969367343176 [label="*"] - n139969367343680 -> n139969367343176 - n139969367343736 [label=2] - n139969367343680 -> n139969367343736 - n139969367343176 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367343176 -> n139969367648800 - n139969367343568 [label=3] - n139969367343176 -> n139969367343568 - n139969367343568 [label=3] - n139969367343736 [label=2] - n139969367827008 [label=PropertyAccess] - n139969368120624 [label=force] - n139969367827008 -> n139969368120624 - n139969367648800 [label="Iter(0)"] - n139969367827008 -> n139969367648800 - n139969367828128 [label="*"] - n139969367827008 -> n139969367828128 - n139969367829528 [label="+"] - n139969367827008 -> n139969367829528 - n139969367343400 [label="+"] - n139969367827008 -> n139969367343400 - n139969367828128 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367828128 -> n139969367648800 - n139969367828184 [label=3] - n139969367828128 -> n139969367828184 - n139969367828184 [label=3] - n139969367829528 [label="+"] - n139969367829360 [label="*"] - n139969367829528 -> n139969367829360 - n139969367829584 [label=1] - n139969367829528 -> n139969367829584 - n139969367829360 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367829360 -> n139969367648800 - n139969367829416 [label=3] - n139969367829360 -> n139969367829416 - n139969367829416 [label=3] - n139969367829584 [label=1] - n139969367343400 [label="+"] - n139969367343232 [label="*"] - n139969367343400 -> n139969367343232 - n139969367343456 [label=2] - n139969367343400 -> n139969367343456 - n139969367343232 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367343232 -> n139969367648800 - n139969367343288 [label=3] - n139969367343232 -> n139969367343288 - n139969367343288 [label=3] - n139969367343456 [label=2] - n139969367827120 [label="*"] - n139969367827176 [label=0.005] - n139969367827120 -> n139969367827176 - n139969367827008 [label=PropertyAccess] - n139969367827120 -> n139969367827008 - n139969367827176 [label=0.005] - n139969367827288 [label=PropertyAccess] - n139969368120456 [label=mass] - n139969367827288 -> n139969368120456 - n139969367648800 [label="Iter(0)"] - n139969367827288 -> n139969367648800 - n139969368120456 [label=mass] - n139969367827344 [label="/"] - n139969367827120 [label="*"] - n139969367827344 -> n139969367827120 - n139969367827288 [label=PropertyAccess] - n139969367827344 -> n139969367827288 - n139969367827456 [label="+"] - n139969367826896 [label=PropertyAccess] - n139969367827456 -> n139969367826896 - n139969367827344 [label="/"] - n139969367827456 -> n139969367827344 - n139969367827680 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367827680 -> n139969367648800 - n139969367827736 [label=3] - n139969367827680 -> n139969367827736 - n139969367827736 [label=3] - n139969367828912 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367828912 -> n139969367648800 - n139969367828968 [label=3] - n139969367828912 -> n139969367828968 - n139969367828968 [label=3] - n139969367829080 [label="+"] - n139969367828912 [label="*"] - n139969367829080 -> n139969367828912 - n139969367829136 [label=1] - n139969367829080 -> n139969367829136 - n139969367829136 [label=1] - n139969367830144 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367830144 -> n139969367648800 - n139969367830200 [label=3] - n139969367830144 -> n139969367830200 - n139969367830200 [label=3] - n139969367830312 [label="+"] - n139969367830144 [label="*"] - n139969367830312 -> n139969367830144 - n139969367830368 [label=2] - n139969367830312 -> n139969367830368 - n139969367830368 [label=2] - n139969367827568 [label=Assign] - n139969367828800 [label=VectorAccess] - n139969367827568 -> n139969367828800 - n139969367828016 [label=VectorAccess] - n139969367827568 -> n139969367828016 - n139969367830032 [label=VectorAccess] - n139969367827568 -> n139969367830032 - n139969367829248 [label=VectorAccess] - n139969367827568 -> n139969367829248 - n139969367343904 [label=VectorAccess] - n139969367827568 -> n139969367343904 - n139969367830480 [label=VectorAccess] - n139969367827568 -> n139969367830480 - n139969367828800 [label=VectorAccess] - n139969367826896 [label=PropertyAccess] - n139969367828800 -> n139969367826896 - n139969367828016 [label=VectorAccess] - n139969367827456 [label="+"] - n139969367828016 -> n139969367827456 - n139969367830032 [label=VectorAccess] - n139969367826896 [label=PropertyAccess] - n139969367830032 -> n139969367826896 - n139969367829248 [label=VectorAccess] - n139969367827456 [label="+"] - n139969367829248 -> n139969367827456 - n139969367343904 [label=VectorAccess] - n139969367826896 [label=PropertyAccess] - n139969367343904 -> n139969367826896 - n139969367830480 [label=VectorAccess] - n139969367827456 [label="+"] - n139969367830480 -> n139969367827456 - n139969367343960 [label=PropertyAccess] - n139969368120512 [label=position] - n139969367343960 -> n139969368120512 - n139969367648800 [label="Iter(0)"] - n139969367343960 -> n139969367648800 - n139969367345304 [label="*"] - n139969367343960 -> n139969367345304 - n139969367346704 [label="+"] - n139969367343960 -> n139969367346704 - n139969367368480 [label="+"] - n139969367343960 -> n139969367368480 - n139969367345304 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367345304 -> n139969367648800 - n139969367345360 [label=3] - n139969367345304 -> n139969367345360 - n139969367345360 [label=3] - n139969367346704 [label="+"] - n139969367346536 [label="*"] - n139969367346704 -> n139969367346536 - n139969367346760 [label=1] - n139969367346704 -> n139969367346760 - n139969367346536 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367346536 -> n139969367648800 - n139969367346592 [label=3] - n139969367346536 -> n139969367346592 - n139969367346592 [label=3] - n139969367346760 [label=1] - n139969367368480 [label="+"] - n139969367368312 [label="*"] - n139969367368480 -> n139969367368312 - n139969367368536 [label=2] - n139969367368480 -> n139969367368536 - n139969367368312 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367368312 -> n139969367648800 - n139969367368368 [label=3] - n139969367368312 -> n139969367368368 - n139969367368368 [label=3] - n139969367368536 [label=2] - n139969367344072 [label=PropertyAccess] - n139969368120568 [label=velocity] - n139969367344072 -> n139969368120568 - n139969367648800 [label="Iter(0)"] - n139969367344072 -> n139969367648800 - n139969367344968 [label="*"] - n139969367344072 -> n139969367344968 - n139969367346368 [label="+"] - n139969367344072 -> n139969367346368 - n139969367368144 [label="+"] - n139969367344072 -> n139969367368144 - n139969367344968 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367344968 -> n139969367648800 - n139969367345024 [label=3] - n139969367344968 -> n139969367345024 - n139969367345024 [label=3] - n139969367346368 [label="+"] - n139969367346200 [label="*"] - n139969367346368 -> n139969367346200 - n139969367346424 [label=1] - n139969367346368 -> n139969367346424 - n139969367346200 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367346200 -> n139969367648800 - n139969367346256 [label=3] - n139969367346200 -> n139969367346256 - n139969367346256 [label=3] - n139969367346424 [label=1] - n139969367368144 [label="+"] - n139969367367976 [label="*"] - n139969367368144 -> n139969367367976 - n139969367368200 [label=2] - n139969367368144 -> n139969367368200 - n139969367367976 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367367976 -> n139969367648800 - n139969367368032 [label=3] - n139969367367976 -> n139969367368032 - n139969367368032 [label=3] - n139969367368200 [label=2] - n139969367344184 [label="*"] - n139969367344240 [label=0.005] - n139969367344184 -> n139969367344240 - n139969367344072 [label=PropertyAccess] - n139969367344184 -> n139969367344072 - n139969367344240 [label=0.005] - n139969367344352 [label="+"] - n139969367343960 [label=PropertyAccess] - n139969367344352 -> n139969367343960 - n139969367344184 [label="*"] - n139969367344352 -> n139969367344184 - n139969367344576 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367344576 -> n139969367648800 - n139969367344632 [label=3] - n139969367344576 -> n139969367344632 - n139969367344632 [label=3] - n139969367345808 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367345808 -> n139969367648800 - n139969367345864 [label=3] - n139969367345808 -> n139969367345864 - n139969367345864 [label=3] - n139969367345976 [label="+"] - n139969367345808 [label="*"] - n139969367345976 -> n139969367345808 - n139969367346032 [label=1] - n139969367345976 -> n139969367346032 - n139969367346032 [label=1] - n139969367347040 [label="*"] - n139969367648800 [label="Iter(0)"] - n139969367347040 -> n139969367648800 - n139969367347096 [label=3] - n139969367347040 -> n139969367347096 - n139969367347096 [label=3] - n139969367367752 [label="+"] - n139969367347040 [label="*"] - n139969367367752 -> n139969367347040 - n139969367367808 [label=2] - n139969367367752 -> n139969367367808 - n139969367367808 [label=2] - n139969367344464 [label=Assign] - n139969367345696 [label=VectorAccess] - n139969367344464 -> n139969367345696 - n139969367344912 [label=VectorAccess] - n139969367344464 -> n139969367344912 - n139969367346928 [label=VectorAccess] - n139969367344464 -> n139969367346928 - n139969367346144 [label=VectorAccess] - n139969367344464 -> n139969367346144 - n139969367368704 [label=VectorAccess] - n139969367344464 -> n139969367368704 - n139969367367920 [label=VectorAccess] - n139969367344464 -> n139969367367920 - n139969367345696 [label=VectorAccess] - n139969367343960 [label=PropertyAccess] - n139969367345696 -> n139969367343960 - n139969367344912 [label=VectorAccess] - n139969367344352 [label="+"] - n139969367344912 -> n139969367344352 - n139969367346928 [label=VectorAccess] - n139969367343960 [label=PropertyAccess] - n139969367346928 -> n139969367343960 - n139969367346144 [label=VectorAccess] - n139969367344352 [label="+"] - n139969367346144 -> n139969367344352 - n139969367368704 [label=VectorAccess] - n139969367343960 [label=PropertyAccess] - n139969367368704 -> n139969367343960 - n139969367367920 [label=VectorAccess] - n139969367344352 [label="+"] - n139969367367920 -> n139969367344352 + n140343105889616 [label=Block] + n140343105956160 [label=Module] + n140343105889616 -> n140343105956160 + n140343105956216 [label=Module] + n140343105889616 -> n140343105956216 + n140343105956160 [label=Module] + n140343105956104 [label=Block] + n140343105956160 -> n140343105956104 + n140343105956104 [label=Block] + n140343105954200 [label=ParticleFor] + n140343105956104 -> n140343105954200 + n140343105954200 [label=ParticleFor] + n140343105184936 [label=Block] + n140343105954200 -> n140343105184936 + n140343108419712 [label=nlocal] + n140343105954200 -> n140343108419712 + n140343105184936 [label=Block] + n140343105185104 [label=For] + n140343105184936 -> n140343105185104 + n140343105185384 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105185384 -> n140343105184768 + n140343105891352 [label=neighborlist_capacity] + n140343105185384 -> n140343105891352 + n140343105184768 [label="Iter(14)"] + n140343105891352 [label=neighborlist_capacity] + n140343105185608 [label=PropertyAccess] + n140343105889840 [label=position] + n140343105185608 -> n140343105889840 + n140343105184768 [label="Iter(14)"] + n140343105185608 -> n140343105184768 + n140343105186784 [label="*"] + n140343105185608 -> n140343105186784 + n140343105225560 [label="+"] + n140343105185608 -> n140343105225560 + n140343105227352 [label="+"] + n140343105185608 -> n140343105227352 + n140343105889840 [label=position] + n140343105186784 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105186784 -> n140343105184768 + n140343105186840 [label=3] + n140343105186784 -> n140343105186840 + n140343105186840 [label=3] + n140343105225560 [label="+"] + n140343105225392 [label="*"] + n140343105225560 -> n140343105225392 + n140343105225616 [label=1] + n140343105225560 -> n140343105225616 + n140343105225392 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105225392 -> n140343105184768 + n140343105225448 [label=3] + n140343105225392 -> n140343105225448 + n140343105225448 [label=3] + n140343105225616 [label=1] + n140343105227352 [label="+"] + n140343105227184 [label="*"] + n140343105227352 -> n140343105227184 + n140343105227408 [label=2] + n140343105227352 -> n140343105227408 + n140343105227184 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105227184 -> n140343105184768 + n140343105227240 [label=3] + n140343105227184 -> n140343105227240 + n140343105227240 [label=3] + n140343105227408 [label=2] + n140343105186000 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105186000 -> n140343105184768 + n140343105186056 [label=3] + n140343105186000 -> n140343105186056 + n140343105186056 [label=3] + n140343105187680 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105187680 -> n140343105184768 + n140343105187736 [label=3] + n140343105187680 -> n140343105187736 + n140343105187736 [label=3] + n140343105224776 [label="+"] + n140343105187680 [label="*"] + n140343105224776 -> n140343105187680 + n140343105224832 [label=1] + n140343105224776 -> n140343105224832 + n140343105224832 [label=1] + n140343105226400 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343105226400 -> n140343105184768 + n140343105226456 [label=3] + n140343105226400 -> n140343105226456 + n140343105226456 [label=3] + n140343105226568 [label="+"] + n140343105226400 [label="*"] + n140343105226568 -> n140343105226400 + n140343105226624 [label=2] + n140343105226568 -> n140343105226624 + n140343105226624 [label=2] + n140343106084936 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106084936 -> n140343105184768 + n140343106084992 [label=3] + n140343106084936 -> n140343106084992 + n140343106084992 [label=3] + n140343106085328 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106085328 -> n140343105184768 + n140343106085384 [label=3] + n140343106085328 -> n140343106085384 + n140343106085384 [label=3] + n140343106085832 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106085832 -> n140343105184768 + n140343106085888 [label=3] + n140343106085832 -> n140343106085888 + n140343106085888 [label=3] + n140343106086000 [label="+"] + n140343106085832 [label="*"] + n140343106086000 -> n140343106085832 + n140343106086056 [label=1] + n140343106086000 -> n140343106086056 + n140343106086056 [label=1] + n140343106086224 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106086224 -> n140343105184768 + n140343106086280 [label=3] + n140343106086224 -> n140343106086280 + n140343106086280 [label=3] + n140343106086392 [label="+"] + n140343106086224 [label="*"] + n140343106086392 -> n140343106086224 + n140343106086448 [label=1] + n140343106086392 -> n140343106086448 + n140343106086448 [label=1] + n140343106086728 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106086728 -> n140343105184768 + n140343106086784 [label=3] + n140343106086728 -> n140343106086784 + n140343106086784 [label=3] + n140343106086896 [label="+"] + n140343106086728 [label="*"] + n140343106086896 -> n140343106086728 + n140343106086952 [label=2] + n140343106086896 -> n140343106086952 + n140343106086952 [label=2] + n140343106087120 [label="*"] + n140343105184768 [label="Iter(14)"] + n140343106087120 -> n140343105184768 + n140343106087176 [label=3] + n140343106087120 -> n140343106087176 + n140343106087176 [label=3] + n140343106087288 [label="+"] + n140343106087120 [label="*"] + n140343106087288 -> n140343106087120 + n140343106087344 [label=2] + n140343106087288 -> n140343106087344 + n140343106087344 [label=2] + n140343105185104 [label=For] + n140343105185160 [label="Iter(15)"] + n140343105185104 -> n140343105185160 + n140343105185272 [label=Block] + n140343105185104 -> n140343105185272 + n140343105185216 [label=0] + n140343105185104 -> n140343105185216 + n140343105185048 [label=ArrayAccess] + n140343105185104 -> n140343105185048 + n140343105185160 [label="Iter(15)"] + n140343105185272 [label=Block] + n140343105228304 [label=Filter] + n140343105185272 -> n140343105228304 + n140343105185496 [label="+"] + n140343105185384 [label="*"] + n140343105185496 -> n140343105185384 + n140343105185160 [label="Iter(15)"] + n140343105185496 -> n140343105185160 + n140343105185720 [label=PropertyAccess] + n140343105889840 [label=position] + n140343105185720 -> n140343105889840 + n140343105185328 [label=ArrayAccess] + n140343105185720 -> n140343105185328 + n140343105187120 [label="*"] + n140343105185720 -> n140343105187120 + n140343105225896 [label="+"] + n140343105185720 -> n140343105225896 + n140343105227688 [label="+"] + n140343105185720 -> n140343105227688 + n140343105185328 [label=ArrayAccess] + n140343105891408 [label=neighborlists] + n140343105185328 -> n140343105891408 + n140343105185496 [label="+"] + n140343105185328 -> n140343105185496 + n140343105891408 [label=neighborlists] + n140343105187120 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105187120 -> n140343105185328 + n140343105187176 [label=3] + n140343105187120 -> n140343105187176 + n140343105187176 [label=3] + n140343105225896 [label="+"] + n140343105225728 [label="*"] + n140343105225896 -> n140343105225728 + n140343105225952 [label=1] + n140343105225896 -> n140343105225952 + n140343105225728 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105225728 -> n140343105185328 + n140343105225784 [label=3] + n140343105225728 -> n140343105225784 + n140343105225784 [label=3] + n140343105225952 [label=1] + n140343105227688 [label="+"] + n140343105227520 [label="*"] + n140343105227688 -> n140343105227520 + n140343105227744 [label=2] + n140343105227688 -> n140343105227744 + n140343105227520 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105227520 -> n140343105185328 + n140343105227576 [label=3] + n140343105227520 -> n140343105227576 + n140343105227576 [label=3] + n140343105227744 [label=2] + n140343105185832 [label="-"] + n140343105185608 [label=PropertyAccess] + n140343105185832 -> n140343105185608 + n140343105185720 [label=PropertyAccess] + n140343105185832 -> n140343105185720 + n140343105186336 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105186336 -> n140343105185328 + n140343105186392 [label=3] + n140343105186336 -> n140343105186392 + n140343105186392 [label=3] + n140343105187512 [label="*"] + n140343105186672 [label=VectorAccess] + n140343105187512 -> n140343105186672 + n140343105187456 [label=VectorAccess] + n140343105187512 -> n140343105187456 + n140343105186672 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105186672 -> n140343105185832 + n140343105187456 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105187456 -> n140343105185832 + n140343105224944 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105224944 -> n140343105185328 + n140343105225000 [label=3] + n140343105224944 -> n140343105225000 + n140343105225000 [label=3] + n140343105225112 [label="+"] + n140343105224944 [label="*"] + n140343105225112 -> n140343105224944 + n140343105225168 [label=1] + n140343105225112 -> n140343105225168 + n140343105225168 [label=1] + n140343105226120 [label="*"] + n140343105225280 [label=VectorAccess] + n140343105226120 -> n140343105225280 + n140343105226064 [label=VectorAccess] + n140343105226120 -> n140343105226064 + n140343105225280 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105225280 -> n140343105185832 + n140343105226064 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105226064 -> n140343105185832 + n140343105226232 [label="+"] + n140343105187512 [label="*"] + n140343105226232 -> n140343105187512 + n140343105226120 [label="*"] + n140343105226232 -> n140343105226120 + n140343105226736 [label="*"] + n140343105185328 [label=ArrayAccess] + n140343105226736 -> n140343105185328 + n140343105226792 [label=3] + n140343105226736 -> n140343105226792 + n140343105226792 [label=3] + n140343105226904 [label="+"] + n140343105226736 [label="*"] + n140343105226904 -> n140343105226736 + n140343105226960 [label=2] + n140343105226904 -> n140343105226960 + n140343105226960 [label=2] + n140343105227912 [label="*"] + n140343105227072 [label=VectorAccess] + n140343105227912 -> n140343105227072 + n140343105227856 [label=VectorAccess] + n140343105227912 -> n140343105227856 + n140343105227072 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105227072 -> n140343105185832 + n140343105227856 [label=VectorAccess] + n140343105185832 [label="-"] + n140343105227856 -> n140343105185832 + n140343105228024 [label="+"] + n140343105226232 [label="+"] + n140343105228024 -> n140343105226232 + n140343105227912 [label="*"] + n140343105228024 -> n140343105227912 + n140343105228136 [label="<"] + n140343105228024 [label="+"] + n140343105228136 -> n140343105228024 + n140343105228192 [label=2.5] + n140343105228136 -> n140343105228192 + n140343105228192 [label=2.5] + n140343105228304 [label=Filter] + n140343105228136 [label="<"] + n140343105228304 -> n140343105228136 + n140343105956048 [label=Block] + n140343105228304 -> n140343105956048 + n140343105956048 [label=Block] + n140343105891968 [label=Assign] + n140343105956048 -> n140343105891968 + n140343105956384 [label="/"] + n140343105956440 [label=1.0] + n140343105956384 -> n140343105956440 + n140343105228024 [label="+"] + n140343105956384 -> n140343105228024 + n140343105956440 [label=1.0] + n140343105956552 [label="*"] + n140343105956384 [label="/"] + n140343105956552 -> n140343105956384 + n140343105956384 [label="/"] + n140343105956552 -> n140343105956384 + n140343105956664 [label="*"] + n140343105956552 [label="*"] + n140343105956664 -> n140343105956552 + n140343105956384 [label="/"] + n140343105956664 -> n140343105956384 + n140343105956328 [label=PropertyAccess] + n140343105889952 [label=force] + n140343105956328 -> n140343105889952 + n140343105184768 [label="Iter(14)"] + n140343105956328 -> n140343105184768 + n140343106085328 [label="*"] + n140343105956328 -> n140343106085328 + n140343106086392 [label="+"] + n140343105956328 -> n140343106086392 + n140343106087288 [label="+"] + n140343105956328 -> n140343106087288 + n140343105889952 [label=force] + n140343105957000 [label="*"] + n140343105185832 [label="-"] + n140343105957000 -> n140343105185832 + n140343105957056 [label=48.0] + n140343105957000 -> n140343105957056 + n140343105957056 [label=48.0] + n140343105957336 [label="*"] + n140343105185832 [label="-"] + n140343105957336 -> n140343105185832 + n140343105601432 [label="*"] + n140343105957336 -> n140343105601432 + n140343105601432 [label="*"] + n140343105957056 [label=48.0] + n140343105601432 -> n140343105957056 + n140343105956664 [label="*"] + n140343105601432 -> n140343105956664 + n140343105957448 [label="-"] + n140343105956664 [label="*"] + n140343105957448 -> n140343105956664 + n140343105957504 [label=0.5] + n140343105957448 -> n140343105957504 + n140343105957504 [label=0.5] + n140343105957616 [label="*"] + n140343105185832 [label="-"] + n140343105957616 -> n140343105185832 + n140343105597904 [label="*"] + n140343105957616 -> n140343105597904 + n140343105597904 [label="*"] + n140343105601432 [label="*"] + n140343105597904 -> n140343105601432 + n140343105957448 [label="-"] + n140343105597904 -> n140343105957448 + n140343105892024 [label="*"] + n140343105185832 [label="-"] + n140343105892024 -> n140343105185832 + n140343105597624 [label="*"] + n140343105892024 -> n140343105597624 + n140343105597624 [label="*"] + n140343105597904 [label="*"] + n140343105597624 -> n140343105597904 + n140343105956384 [label="/"] + n140343105597624 -> n140343105956384 + n140343105892304 [label="+"] + n140343105956328 [label=PropertyAccess] + n140343105892304 -> n140343105956328 + n140343105892024 [label="*"] + n140343105892304 -> n140343105892024 + n140343105891968 [label=Assign] + n140343106085720 [label=VectorAccess] + n140343105891968 -> n140343106085720 + n140343106085272 [label=VectorAccess] + n140343105891968 -> n140343106085272 + n140343106086616 [label=VectorAccess] + n140343105891968 -> n140343106086616 + n140343106086168 [label=VectorAccess] + n140343105891968 -> n140343106086168 + n140343106087512 [label=VectorAccess] + n140343105891968 -> n140343106087512 + n140343106087064 [label=VectorAccess] + n140343105891968 -> n140343106087064 + n140343106085720 [label=VectorAccess] + n140343105956328 [label=PropertyAccess] + n140343106085720 -> n140343105956328 + n140343106085272 [label=VectorAccess] + n140343105892304 [label="+"] + n140343106085272 -> n140343105892304 + n140343106086616 [label=VectorAccess] + n140343105956328 [label=PropertyAccess] + n140343106086616 -> n140343105956328 + n140343106086168 [label=VectorAccess] + n140343105892304 [label="+"] + n140343106086168 -> n140343105892304 + n140343106087512 [label=VectorAccess] + n140343105956328 [label=PropertyAccess] + n140343106087512 -> n140343105956328 + n140343106087064 [label=VectorAccess] + n140343105892304 [label="+"] + n140343106087064 -> n140343105892304 + n140343105185216 [label=0] + n140343105185048 [label=ArrayAccess] + n140343105891464 [label=numneighs] + n140343105185048 -> n140343105891464 + n140343105184768 [label="Iter(14)"] + n140343105185048 -> n140343105184768 + n140343105891464 [label=numneighs] + n140343108419712 [label=nlocal] + n140343105956216 [label=Module] + n140343105954368 [label=Block] + n140343105956216 -> n140343105954368 + n140343105954368 [label=Block] + n140343105955768 [label=ParticleFor] + n140343105954368 -> n140343105955768 + n140343105955768 [label=ParticleFor] + n140343105957280 [label=Block] + n140343105955768 -> n140343105957280 + n140343108419712 [label=nlocal] + n140343105955768 -> n140343108419712 + n140343105957280 [label=Block] + n140343106088352 [label=Assign] + n140343105957280 -> n140343106088352 + n140343105601152 [label=Assign] + n140343105957280 -> n140343105601152 + n140343106087624 [label=PropertyAccess] + n140343105889896 [label=velocity] + n140343106087624 -> n140343105889896 + n140343105954872 [label="Iter(0)"] + n140343106087624 -> n140343105954872 + n140343106088856 [label="*"] + n140343106087624 -> n140343106088856 + n140343105599136 [label="+"] + n140343106087624 -> n140343105599136 + n140343105600368 [label="+"] + n140343106087624 -> n140343105600368 + n140343105889896 [label=velocity] + n140343105954872 [label="Iter(0)"] + n140343106088856 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343106088856 -> n140343105954872 + n140343105597792 [label=3] + n140343106088856 -> n140343105597792 + n140343105597792 [label=3] + n140343105599136 [label="+"] + n140343105598632 [label="*"] + n140343105599136 -> n140343105598632 + n140343105599192 [label=1] + n140343105599136 -> n140343105599192 + n140343105598632 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105598632 -> n140343105954872 + n140343105599024 [label=3] + n140343105598632 -> n140343105599024 + n140343105599024 [label=3] + n140343105599192 [label=1] + n140343105600368 [label="+"] + n140343105599864 [label="*"] + n140343105600368 -> n140343105599864 + n140343105600424 [label=2] + n140343105600368 -> n140343105600424 + n140343105599864 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105599864 -> n140343105954872 + n140343105600256 [label=3] + n140343105599864 -> n140343105600256 + n140343105600256 [label=3] + n140343105600424 [label=2] + n140343106087736 [label=PropertyAccess] + n140343105889952 [label=force] + n140343106087736 -> n140343105889952 + n140343105954872 [label="Iter(0)"] + n140343106087736 -> n140343105954872 + n140343106088912 [label="*"] + n140343106087736 -> n140343106088912 + n140343105598856 [label="+"] + n140343106087736 -> n140343105598856 + n140343105600088 [label="+"] + n140343106087736 -> n140343105600088 + n140343106088912 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343106088912 -> n140343105954872 + n140343105597512 [label=3] + n140343106088912 -> n140343105597512 + n140343105597512 [label=3] + n140343105598856 [label="+"] + n140343105598688 [label="*"] + n140343105598856 -> n140343105598688 + n140343105598912 [label=1] + n140343105598856 -> n140343105598912 + n140343105598688 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105598688 -> n140343105954872 + n140343105598744 [label=3] + n140343105598688 -> n140343105598744 + n140343105598744 [label=3] + n140343105598912 [label=1] + n140343105600088 [label="+"] + n140343105599920 [label="*"] + n140343105600088 -> n140343105599920 + n140343105600144 [label=2] + n140343105600088 -> n140343105600144 + n140343105599920 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105599920 -> n140343105954872 + n140343105599976 [label=3] + n140343105599920 -> n140343105599976 + n140343105599976 [label=3] + n140343105600144 [label=2] + n140343106087848 [label="*"] + n140343106087904 [label=0.005] + n140343106087848 -> n140343106087904 + n140343106087736 [label=PropertyAccess] + n140343106087848 -> n140343106087736 + n140343106087904 [label=0.005] + n140343106088016 [label=PropertyAccess] + n140343105889784 [label=mass] + n140343106088016 -> n140343105889784 + n140343105954872 [label="Iter(0)"] + n140343106088016 -> n140343105954872 + n140343105889784 [label=mass] + n140343106088128 [label="/"] + n140343106087848 [label="*"] + n140343106088128 -> n140343106087848 + n140343106088016 [label=PropertyAccess] + n140343106088128 -> n140343106088016 + n140343106088240 [label="+"] + n140343106087624 [label=PropertyAccess] + n140343106088240 -> n140343106087624 + n140343106088128 [label="/"] + n140343106088240 -> n140343106088128 + n140343106088464 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343106088464 -> n140343105954872 + n140343106088520 [label=3] + n140343106088464 -> n140343106088520 + n140343106088520 [label=3] + n140343105598240 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105598240 -> n140343105954872 + n140343105598296 [label=3] + n140343105598240 -> n140343105598296 + n140343105598296 [label=3] + n140343105598408 [label="+"] + n140343105598240 [label="*"] + n140343105598408 -> n140343105598240 + n140343105598464 [label=1] + n140343105598408 -> n140343105598464 + n140343105598464 [label=1] + n140343105599472 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105599472 -> n140343105954872 + n140343105599528 [label=3] + n140343105599472 -> n140343105599528 + n140343105599528 [label=3] + n140343105599640 [label="+"] + n140343105599472 [label="*"] + n140343105599640 -> n140343105599472 + n140343105599696 [label=2] + n140343105599640 -> n140343105599696 + n140343105599696 [label=2] + n140343106088352 [label=Assign] + n140343105598128 [label=VectorAccess] + n140343106088352 -> n140343105598128 + n140343106088800 [label=VectorAccess] + n140343106088352 -> n140343106088800 + n140343105599360 [label=VectorAccess] + n140343106088352 -> n140343105599360 + n140343105598576 [label=VectorAccess] + n140343106088352 -> n140343105598576 + n140343105600592 [label=VectorAccess] + n140343106088352 -> n140343105600592 + n140343105599808 [label=VectorAccess] + n140343106088352 -> n140343105599808 + n140343105598128 [label=VectorAccess] + n140343106087624 [label=PropertyAccess] + n140343105598128 -> n140343106087624 + n140343106088800 [label=VectorAccess] + n140343106088240 [label="+"] + n140343106088800 -> n140343106088240 + n140343105599360 [label=VectorAccess] + n140343106087624 [label=PropertyAccess] + n140343105599360 -> n140343106087624 + n140343105598576 [label=VectorAccess] + n140343106088240 [label="+"] + n140343105598576 -> n140343106088240 + n140343105600592 [label=VectorAccess] + n140343106087624 [label=PropertyAccess] + n140343105600592 -> n140343106087624 + n140343105599808 [label=VectorAccess] + n140343106088240 [label="+"] + n140343105599808 -> n140343106088240 + n140343105600648 [label=PropertyAccess] + n140343105889840 [label=position] + n140343105600648 -> n140343105889840 + n140343105954872 [label="Iter(0)"] + n140343105600648 -> n140343105954872 + n140343105630728 [label="*"] + n140343105600648 -> n140343105630728 + n140343105632128 [label="+"] + n140343105600648 -> n140343105632128 + n140343105633360 [label="+"] + n140343105600648 -> n140343105633360 + n140343105630728 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105630728 -> n140343105954872 + n140343105630784 [label=3] + n140343105630728 -> n140343105630784 + n140343105630784 [label=3] + n140343105632128 [label="+"] + n140343105631960 [label="*"] + n140343105632128 -> n140343105631960 + n140343105632184 [label=1] + n140343105632128 -> n140343105632184 + n140343105631960 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105631960 -> n140343105954872 + n140343105632016 [label=3] + n140343105631960 -> n140343105632016 + n140343105632016 [label=3] + n140343105632184 [label=1] + n140343105633360 [label="+"] + n140343105633192 [label="*"] + n140343105633360 -> n140343105633192 + n140343105633416 [label=2] + n140343105633360 -> n140343105633416 + n140343105633192 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105633192 -> n140343105954872 + n140343105633248 [label=3] + n140343105633192 -> n140343105633248 + n140343105633248 [label=3] + n140343105633416 [label=2] + n140343105600760 [label=PropertyAccess] + n140343105889896 [label=velocity] + n140343105600760 -> n140343105889896 + n140343105954872 [label="Iter(0)"] + n140343105600760 -> n140343105954872 + n140343105630392 [label="*"] + n140343105600760 -> n140343105630392 + n140343105631792 [label="+"] + n140343105600760 -> n140343105631792 + n140343105633024 [label="+"] + n140343105600760 -> n140343105633024 + n140343105630392 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105630392 -> n140343105954872 + n140343105630448 [label=3] + n140343105630392 -> n140343105630448 + n140343105630448 [label=3] + n140343105631792 [label="+"] + n140343105631624 [label="*"] + n140343105631792 -> n140343105631624 + n140343105631848 [label=1] + n140343105631792 -> n140343105631848 + n140343105631624 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105631624 -> n140343105954872 + n140343105631680 [label=3] + n140343105631624 -> n140343105631680 + n140343105631680 [label=3] + n140343105631848 [label=1] + n140343105633024 [label="+"] + n140343105632856 [label="*"] + n140343105633024 -> n140343105632856 + n140343105633080 [label=2] + n140343105633024 -> n140343105633080 + n140343105632856 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105632856 -> n140343105954872 + n140343105632912 [label=3] + n140343105632856 -> n140343105632912 + n140343105632912 [label=3] + n140343105633080 [label=2] + n140343105600872 [label="*"] + n140343105600928 [label=0.005] + n140343105600872 -> n140343105600928 + n140343105600760 [label=PropertyAccess] + n140343105600872 -> n140343105600760 + n140343105600928 [label=0.005] + n140343105601040 [label="+"] + n140343105600648 [label=PropertyAccess] + n140343105601040 -> n140343105600648 + n140343105600872 [label="*"] + n140343105601040 -> n140343105600872 + n140343105601264 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105601264 -> n140343105954872 + n140343105601320 [label=3] + n140343105601264 -> n140343105601320 + n140343105601320 [label=3] + n140343105631232 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105631232 -> n140343105954872 + n140343105631288 [label=3] + n140343105631232 -> n140343105631288 + n140343105631288 [label=3] + n140343105631400 [label="+"] + n140343105631232 [label="*"] + n140343105631400 -> n140343105631232 + n140343105631456 [label=1] + n140343105631400 -> n140343105631456 + n140343105631456 [label=1] + n140343105632464 [label="*"] + n140343105954872 [label="Iter(0)"] + n140343105632464 -> n140343105954872 + n140343105632520 [label=3] + n140343105632464 -> n140343105632520 + n140343105632520 [label=3] + n140343105632632 [label="+"] + n140343105632464 [label="*"] + n140343105632632 -> n140343105632464 + n140343105632688 [label=2] + n140343105632632 -> n140343105632688 + n140343105632688 [label=2] + n140343105601152 [label=Assign] + n140343105631120 [label=VectorAccess] + n140343105601152 -> n140343105631120 + n140343105630336 [label=VectorAccess] + n140343105601152 -> n140343105630336 + n140343105632352 [label=VectorAccess] + n140343105601152 -> n140343105632352 + n140343105631568 [label=VectorAccess] + n140343105601152 -> n140343105631568 + n140343105633584 [label=VectorAccess] + n140343105601152 -> n140343105633584 + n140343105632800 [label=VectorAccess] + n140343105601152 -> n140343105632800 + n140343105631120 [label=VectorAccess] + n140343105600648 [label=PropertyAccess] + n140343105631120 -> n140343105600648 + n140343105630336 [label=VectorAccess] + n140343105601040 [label="+"] + n140343105630336 -> n140343105601040 + n140343105632352 [label=VectorAccess] + n140343105600648 [label=PropertyAccess] + n140343105632352 -> n140343105600648 + n140343105631568 [label=VectorAccess] + n140343105601040 [label="+"] + n140343105631568 -> n140343105601040 + n140343105633584 [label=VectorAccess] + n140343105600648 [label=PropertyAccess] + n140343105633584 -> n140343105600648 + n140343105632800 [label=VectorAccess] + n140343105601040 [label="+"] + n140343105632800 -> n140343105601040 } diff --git a/examples/kernels.pdf b/examples/kernels.pdf index 56dd14b421cb95edcb4f5acd752c28738c52aa3f..f16bb711858657aee5396a32b5e93be43df0a19d 100644 GIT binary patch delta 27590 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μuHTtJt+wZ9Wlw^q6oPEyp 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 JmQ<EP`d|K}TJ!(_ delta 27816 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 diff --git a/examples/lj_func.py b/examples/lj_func.py index 162d88d..61c8119 100644 --- a/examples/lj_func.py +++ b/examples/lj_func.py @@ -31,5 +31,6 @@ psim.periodic(2.8) psim.vtk_output("output/test") psim.compute(lj, cutoff_radius, {'sigma6': sigma6, 'epsilon': epsilon}) psim.compute(euler, symbols={'dt': dt}) -psim.target(pairs.target_gpu()) +psim.target(pairs.target_cpu()) +#psim.target(pairs.target_gpu()) psim.generate() diff --git a/examples/lj_ns.cpp b/examples/lj_ns.cpp index a0c06bf..c9cccf4 100644 --- a/examples/lj_ns.cpp +++ b/examples/lj_ns.cpp @@ -671,8 +671,8 @@ int main() { int *numneighs = (int *) malloc((sizeof(int) * particle_capacity)); int *pbc_map = (int *) malloc((sizeof(int) * pbc_capacity)); int *pbc_mult = (int *) malloc((sizeof(int) * (pbc_capacity * 3))); - unsigned long long int prop_hflags[1] = {18446744073709551615}; - unsigned long long int prop_dflags[1] = {0}; + unsigned long long int prop_hflags[1] = {18446744073709551615ULL}; + unsigned long long int prop_dflags[1] = {0ULL}; double *mass = (double *) malloc((sizeof(double) * (particle_capacity + pbc_capacity))); ps->addProperty(Property(0, "mass", mass, Prop_Float)); double *position = (double *) malloc((sizeof(double) * ((particle_capacity + pbc_capacity) * 3))); @@ -871,28 +871,28 @@ int main() { prop_hflags[0] = e531; module_0(neighborlist_capacity, nlocal, neighborlists, numneighs, position, force); const unsigned long long int a131 = prop_dflags[0]; - const unsigned long long int e532 = a131 & 1; + const unsigned long long int e532 = a131 & 8; const bool e533 = e532 == 0; if(e533) { - pairs::copy_to_device(mass) + pairs::copy_to_device(force) } const unsigned long long int a132 = prop_dflags[0]; - const unsigned long long int e534 = a132 & 8; + const unsigned long long int e534 = a132 & 2; const bool e535 = e534 == 0; if(e535) { - pairs::copy_to_device(force) + pairs::copy_to_device(position) } const unsigned long long int a133 = prop_dflags[0]; - const unsigned long long int e536 = a133 & 2; + const unsigned long long int e536 = a133 & 4; const bool e537 = e536 == 0; if(e537) { - pairs::copy_to_device(position) + pairs::copy_to_device(velocity) } const unsigned long long int a134 = prop_dflags[0]; - const unsigned long long int e538 = a134 & 4; + const unsigned long long int e538 = a134 & 1; const bool e539 = e538 == 0; if(e539) { - pairs::copy_to_device(velocity) + pairs::copy_to_device(mass) } const unsigned long long int a136 = prop_dflags[0]; const unsigned long long int e540 = a136 | 15; diff --git a/setup.py b/setup.py index 09e8506..018a268 100644 --- a/setup.py +++ b/setup.py @@ -7,6 +7,7 @@ def readme(): modules = [ + 'analysis', 'code_gen', 'coupling', 'graph', diff --git a/src/pairs/analysis/__init__.py b/src/pairs/analysis/__init__.py new file mode 100644 index 0000000..5cd89c2 --- /dev/null +++ b/src/pairs/analysis/__init__.py @@ -0,0 +1,28 @@ +from pairs.analysis.bin_ops import SetBinOpTerminals, SetUsedBinOps +from pairs.analysis.blocks import SetBlockVariants, SetParentBlock +from pairs.analysis.modules import FetchModulesReferences + + +class Analysis: + def __init__(self, ast): + self._ast = ast + self._set_used_bin_ops = SetUsedBinOps(ast) + self._set_bin_op_terminals = SetBinOpTerminals(ast) + self._set_block_variants = SetBlockVariants(ast) + self._set_parent_block = SetParentBlock(ast) + self._fetch_modules_references = FetchModulesReferences(ast) + + def set_used_bin_ops(self): + self._set_used_bin_ops.visit() + + def set_bin_op_terminals(self): + self._set_bin_op_terminals.visit() + + def set_block_variants(self): + self._set_block_variants.mutate() + + def set_parent_block(self): + self._set_parent_block.visit() + + def fetch_modules_references(self): + self._fetch_modules_references.visit() diff --git a/src/pairs/analysis/bin_ops.py b/src/pairs/analysis/bin_ops.py new file mode 100644 index 0000000..3750caa --- /dev/null +++ b/src/pairs/analysis/bin_ops.py @@ -0,0 +1,54 @@ +from pairs.ir.visitor import Visitor + + +class SetBinOpTerminals(Visitor): + def __init__(self, ast): + super().__init__(ast) + self.elems = [] + + def push_terminal(self, ast_node): + for e in self.elems: + e.add_terminal(ast_node.name()) + + def visit_BinOp(self, ast_node): + self.elems.append(ast_node) + self.visit_children(ast_node) + self.elems.pop() + + def visit_PropertyAccess(self, ast_node): + self.elems.append(ast_node) + self.visit_children(ast_node) + self.elems.pop() + + def visit_Array(self, ast_node): + self.push_terminal(ast_node) + + # TODO: Array should be enough + def visit_ArrayND(self, ast_node): + self.push_terminal(ast_node) + + def visit_Iter(self, ast_node): + self.push_terminal(ast_node) + + def visit_Property(self, ast_node): + self.push_terminal(ast_node) + + def visit_Var(self, ast_node): + self.push_terminal(ast_node) + + +class SetUsedBinOps(Visitor): + def __init__(self, ast): + super().__init__(ast) + self.bin_ops = [] + + def visit_BinOp(self, ast_node): + ast_node.decl.used = True + self.visit_children(ast_node) + + def visit_Decl(self, ast_node): + pass + + def visit_PropertyAccess(self, ast_node): + ast_node.decl.used = True + self.visit_children(ast_node) diff --git a/src/pairs/transformations/LICM.py b/src/pairs/analysis/blocks.py similarity index 56% rename from src/pairs/transformations/LICM.py rename to src/pairs/analysis/blocks.py index 264aa37..ec4b7b6 100644 --- a/src/pairs/transformations/LICM.py +++ b/src/pairs/analysis/blocks.py @@ -1,7 +1,5 @@ -from pairs.ir.bin_op import BinOp from pairs.ir.loops import For, While from pairs.ir.mutator import Mutator -from pairs.ir.properties import PropertyAccess from pairs.ir.visitor import Visitor @@ -121,99 +119,3 @@ class SetParentBlock(Visitor): assert isinstance(ast_node, (For, While)), "Node must be a loop!" loop_id = id(ast_node) return self.parents[loop_id] if loop_id in self.parents else None - - -class SetBinOpTerminals(Visitor): - def __init__(self, ast): - super().__init__(ast) - self.elems = [] - - def push_terminal(self, ast_node): - for e in self.elems: - e.add_terminal(ast_node.name()) - - def visit_BinOp(self, ast_node): - self.elems.append(ast_node) - self.visit_children(ast_node) - self.elems.pop() - - def visit_PropertyAccess(self, ast_node): - self.elems.append(ast_node) - self.visit_children(ast_node) - self.elems.pop() - - def visit_Array(self, ast_node): - self.push_terminal(ast_node) - - # TODO: Array should be enough - def visit_ArrayND(self, ast_node): - self.push_terminal(ast_node) - - def visit_Iter(self, ast_node): - self.push_terminal(ast_node) - - def visit_Property(self, ast_node): - self.push_terminal(ast_node) - - def visit_Var(self, ast_node): - self.push_terminal(ast_node) - - -class LICM(Mutator): - def __init__(self, ast): - super().__init__(ast) - self.lifts = {} - self.loops = [] - - def mutate_For(self, ast_node): - self.lifts[id(ast_node)] = [] - self.loops.append(ast_node) - ast_node.iterator = self.mutate(ast_node.iterator) - ast_node.block = self.mutate(ast_node.block) - self.loops.pop() - return ast_node - - def mutate_While(self, ast_node): - self.lifts[id(ast_node)] = [] - self.loops.append(ast_node) - ast_node.cond = self.mutate(ast_node.cond) - ast_node.block = self.mutate(ast_node.block) - self.loops.pop() - return ast_node - - def mutate_Decl(self, ast_node): - if self.loops and isinstance(ast_node.elem, (BinOp, PropertyAccess)): - last_loop = self.loops[-1] - #print(f"variants = {last_loop.block.variants}, terminals = {ast_node.elem.terminals}") - if not last_loop.block.variants.intersection(ast_node.elem.terminals): - #print(f'lifting {ast_node.elem.id()}') - self.lifts[id(last_loop)].append(ast_node) - return None - - return ast_node - - def mutate_Block(self, ast_node): - new_stmts = [] - stmts = [self.mutate(s) for s in ast_node.stmts] - - for s in stmts: - if s is not None: - s_id = id(s) - if isinstance(s, (For, While)) and s_id in self.lifts: - new_stmts = new_stmts + self.lifts[s_id] - - new_stmts.append(s) - - ast_node.stmts = new_stmts - return ast_node - - -def move_loop_invariant_code(ast): - set_parent_block = SetParentBlock(ast) - set_parent_block.visit() - set_block_variants = SetBlockVariants(ast) - set_block_variants.mutate() - set_bin_op_terminals = SetBinOpTerminals(ast) - set_bin_op_terminals.visit() - licm = LICM(ast) - licm.mutate() diff --git a/src/pairs/analysis/modules.py b/src/pairs/analysis/modules.py new file mode 100644 index 0000000..4da4846 --- /dev/null +++ b/src/pairs/analysis/modules.py @@ -0,0 +1,34 @@ +from pairs.ir.visitor import Visitor + + +class FetchModulesReferences(Visitor): + def __init__(self, ast): + super().__init__(ast) + self.module_stack = [] + self.writing = False + + def visit_Assign(self, ast_node): + self.writing = True + for c in ast_node.destinations(): + self.visit(c) + + self.writing = False + for c in ast_node.sources(): + self.visit(c) + + def visit_Module(self, ast_node): + self.module_stack.append(ast_node) + self.visit_children(ast_node) + self.module_stack.pop() + + def visit_Array(self, ast_node): + for m in self.module_stack: + m.add_array(ast_node, self.writing) + + def visit_Property(self, ast_node): + for m in self.module_stack: + m.add_property(ast_node, self.writing) + + def visit_Var(self, ast_node): + for m in self.module_stack: + m.add_variable(ast_node, self.writing) diff --git a/src/pairs/sim/simulation.py b/src/pairs/sim/simulation.py index 5aa9c4c..d5ad6fe 100644 --- a/src/pairs/sim/simulation.py +++ b/src/pairs/sim/simulation.py @@ -20,15 +20,7 @@ from pairs.sim.read_from_file import ReadFromFile from pairs.sim.timestep import Timestep from pairs.sim.variables import VariablesDecl from pairs.sim.vtk import VTKWrite -from pairs.transformations.add_device_copies import AddDeviceCopies -from pairs.transformations.prioritize_scalar_ops import prioritize_scalar_ops -from pairs.transformations.set_used_bin_ops import set_used_bin_ops -from pairs.transformations.simplify import simplify_expressions -from pairs.transformations.LICM import move_loop_invariant_code -from pairs.transformations.lower import lower_everything -from pairs.transformations.merge_adjacent_blocks import merge_adjacent_blocks -from pairs.transformations.modules import modularize -from pairs.transformations.replace_symbols import replace_symbols +from pairs.transformations import Transformations class Simulation: @@ -248,22 +240,10 @@ class Simulation: ]) program = Module(self, name='main', block=Block.merge_blocks(decls, body)) - if self._target.is_gpu(): - add_copies = AddDeviceCopies(program) - - # Transformations - lower_everything(program) - replace_symbols(program) - merge_adjacent_blocks(program) - prioritize_scalar_ops(program) - simplify_expressions(program) - move_loop_invariant_code(program) - set_used_bin_ops(program) - modularize(program) - merge_adjacent_blocks(program) - - if self._target.is_gpu(): - add_copies.mutate() + + # Apply transformations + transformations = Transformations(program, self._target) + transformations.apply_all() # For this part on, all bin ops are generated without usage verification self.check_decl_usage = False diff --git a/src/pairs/transformations/__init__.py b/src/pairs/transformations/__init__.py index e69de29..edd3b33 100644 --- a/src/pairs/transformations/__init__.py +++ b/src/pairs/transformations/__init__.py @@ -0,0 +1,66 @@ +from pairs.analysis import Analysis +from pairs.transformations.blocks import MergeAdjacentBlocks +from pairs.transformations.devices import AddDeviceCopies +from pairs.transformations.expressions import ReplaceSymbols, SimplifyExpressions, PrioritizeScalarOps +from pairs.transformations.loops import LICM +from pairs.transformations.lower import Lower +from pairs.transformations.modules import DereferenceWriteVariables, AddResizeLogic, ReplaceModulesByCalls + + +class Transformations: + def __init__(self, ast, target): + self._ast = ast + self._target = target + self._analysis = Analysis(ast) + self._merge_adjacent_blocks = MergeAdjacentBlocks(ast) + self._replace_symbols = ReplaceSymbols(ast) + self._simplify_expressions = SimplifyExpressions(ast) + self._prioritize_scalar_ops = PrioritizeScalarOps(ast) + self._licm = LICM(ast) + self._dereference_write_variables = DereferenceWriteVariables(ast) + self._add_resize_logic = AddResizeLogic(ast) + self._replace_modules_by_calls = ReplaceModulesByCalls(ast) + + if target.is_gpu(): + self._add_device_copies = AddDeviceCopies(ast) + + def lower_everything(self): + nlowered = 1 + while nlowered > 0: + lower = Lower(self._ast) + lower.mutate() + nlowered = lower.lowered_nodes + + self._merge_adjacent_blocks.mutate() + + def optimize_expressions(self): + self._replace_symbols.mutate() + self._simplify_expressions.mutate() + self._prioritize_scalar_ops.mutate() + self._simplify_expressions.mutate() + self._analysis.set_used_bin_ops() + + def licm(self): + self._analysis.set_parent_block() + self._analysis.set_block_variants() + self._analysis.set_bin_op_terminals() + self._licm.mutate() + + def modularize(self): + self._add_resize_logic.mutate() + self._analysis.fetch_modules_references() + self._dereference_write_variables.mutate() + self._replace_modules_by_calls.set_module_resizes(self._add_resize_logic.module_resizes) + self._replace_modules_by_calls.mutate() + self._merge_adjacent_blocks.mutate() + + def add_device_copies(self): + if self._target.is_gpu(): + self._add_device_copies.mutate() + + def apply_all(self): + self.lower_everything() + self.optimize_expressions() + self.licm() + self.modularize() + self.add_device_copies() diff --git a/src/pairs/transformations/merge_adjacent_blocks.py b/src/pairs/transformations/blocks.py similarity index 85% rename from src/pairs/transformations/merge_adjacent_blocks.py rename to src/pairs/transformations/blocks.py index 1095144..e2f7964 100644 --- a/src/pairs/transformations/merge_adjacent_blocks.py +++ b/src/pairs/transformations/blocks.py @@ -18,8 +18,3 @@ class MergeAdjacentBlocks(Mutator): ast_node.stmts = new_stmts return ast_node - - -def merge_adjacent_blocks(ast): - merge = MergeAdjacentBlocks(ast) - merge.mutate() diff --git a/src/pairs/transformations/add_device_copies.py b/src/pairs/transformations/devices.py similarity index 100% rename from src/pairs/transformations/add_device_copies.py rename to src/pairs/transformations/devices.py diff --git a/src/pairs/transformations/prioritize_scalar_ops.py b/src/pairs/transformations/expressions.py similarity index 64% rename from src/pairs/transformations/prioritize_scalar_ops.py rename to src/pairs/transformations/expressions.py index f43637d..068f434 100644 --- a/src/pairs/transformations/prioritize_scalar_ops.py +++ b/src/pairs/transformations/expressions.py @@ -1,8 +1,45 @@ from pairs.ir.bin_op import BinOp +from pairs.ir.lit import Lit from pairs.ir.mutator import Mutator from pairs.ir.types import Types +class ReplaceSymbols(Mutator): + def __init__(self, ast): + super().__init__(ast) + + def mutate_Symbol(self, ast_node): + return ast_node.assign_to + + +class SimplifyExpressions(Mutator): + def __init__(self, ast): + super().__init__(ast) + + def mutate_BinOp(self, ast_node): + sim = ast_node.lhs.sim + ast_node.lhs = self.mutate(ast_node.lhs) + ast_node.rhs = self.mutate(ast_node.rhs) + ast_node.expressions = {i: self.mutate(e) for i, e in ast_node.expressions.items()} + + if ast_node.op in ['+', '-'] and ast_node.rhs == 0: + return ast_node.lhs + + if ast_node.op in ['+'] and ast_node.lhs == 0: + return ast_node.rhs + + if ast_node.op in ['*', '/'] and ast_node.rhs == 1: + return ast_node.lhs + + if ast_node.op == '*' and ast_node.lhs == 1: + return ast_node.rhs + + if ast_node.op == '*' and ast_node.lhs == 0: + return Lit(sim, 0 if Types.is_integer(ast_node.type()) else 0.0) + + return ast_node + + class PrioritizeScalarOps(Mutator): def __init__(self, ast): super().__init__(ast) @@ -43,8 +80,3 @@ class PrioritizeScalarOps(Mutator): #return BinOp(sim, rhs.rhs, BinOp(sim, rhs.lhs, lhs, op), op) return ast_node - - -def prioritize_scalar_ops(ast_node): - prioritize = PrioritizeScalarOps(ast_node) - prioritize.mutate() diff --git a/src/pairs/transformations/loops.py b/src/pairs/transformations/loops.py new file mode 100644 index 0000000..1b3c3b5 --- /dev/null +++ b/src/pairs/transformations/loops.py @@ -0,0 +1,53 @@ +from pairs.ir.bin_op import BinOp +from pairs.ir.loops import For, While +from pairs.ir.mutator import Mutator +from pairs.ir.properties import PropertyAccess + + +class LICM(Mutator): + def __init__(self, ast): + super().__init__(ast) + self.lifts = {} + self.loops = [] + + def mutate_For(self, ast_node): + self.lifts[id(ast_node)] = [] + self.loops.append(ast_node) + ast_node.iterator = self.mutate(ast_node.iterator) + ast_node.block = self.mutate(ast_node.block) + self.loops.pop() + return ast_node + + def mutate_While(self, ast_node): + self.lifts[id(ast_node)] = [] + self.loops.append(ast_node) + ast_node.cond = self.mutate(ast_node.cond) + ast_node.block = self.mutate(ast_node.block) + self.loops.pop() + return ast_node + + def mutate_Decl(self, ast_node): + if self.loops and isinstance(ast_node.elem, (BinOp, PropertyAccess)): + last_loop = self.loops[-1] + #print(f"variants = {last_loop.block.variants}, terminals = {ast_node.elem.terminals}") + if not last_loop.block.variants.intersection(ast_node.elem.terminals): + #print(f'lifting {ast_node.elem.id()}') + self.lifts[id(last_loop)].append(ast_node) + return None + + return ast_node + + def mutate_Block(self, ast_node): + new_stmts = [] + stmts = [self.mutate(s) for s in ast_node.stmts] + + for s in stmts: + if s is not None: + s_id = id(s) + if isinstance(s, (For, While)) and s_id in self.lifts: + new_stmts = new_stmts + self.lifts[s_id] + + new_stmts.append(s) + + ast_node.stmts = new_stmts + return ast_node diff --git a/src/pairs/transformations/lower.py b/src/pairs/transformations/lower.py index c2fb14f..7bb0c47 100644 --- a/src/pairs/transformations/lower.py +++ b/src/pairs/transformations/lower.py @@ -13,11 +13,3 @@ class Lower(Mutator): return ast_node.lower() return ast_node - - -def lower_everything(ast): - nlowered = 1 - while nlowered > 0: - lower = Lower(ast) - lower.mutate() - nlowered = lower.lowered_nodes diff --git a/src/pairs/transformations/modules.py b/src/pairs/transformations/modules.py index d2a0127..a0801d5 100644 --- a/src/pairs/transformations/modules.py +++ b/src/pairs/transformations/modules.py @@ -11,45 +11,11 @@ from pairs.ir.mutator import Mutator from pairs.ir.properties import UpdateProperty from pairs.ir.types import Types from pairs.ir.variables import Var, Deref -from pairs.ir.visitor import Visitor from functools import reduce import operator -class FetchModulesReferences(Visitor): - def __init__(self, ast): - super().__init__(ast) - self.module_stack = [] - self.writing = False - - def visit_Assign(self, ast_node): - self.writing = True - for c in ast_node.destinations(): - self.visit(c) - - self.writing = False - for c in ast_node.sources(): - self.visit(c) - - def visit_Module(self, ast_node): - self.module_stack.append(ast_node) - self.visit_children(ast_node) - self.module_stack.pop() - - def visit_Array(self, ast_node): - for m in self.module_stack: - m.add_array(ast_node, self.writing) - - def visit_Property(self, ast_node): - for m in self.module_stack: - m.add_property(ast_node, self.writing) - - def visit_Var(self, ast_node): - for m in self.module_stack: - m.add_variable(ast_node, self.writing) - - -class AddDereferencesToWriteVariables(Mutator): +class DereferenceWriteVariables(Mutator): def __init__(self, ast): super().__init__(ast) self.module_stack = [] @@ -153,11 +119,14 @@ class AddResizeLogic(Mutator): class ReplaceModulesByCalls(Mutator): - def __init__(self, ast, module_resizes, grow_fn=None): + def __init__(self, ast, grow_fn=None): super().__init__(ast) - self.module_resizes = module_resizes + self.module_resizes = None self.grow_fn = grow_fn if grow_fn is not None else (lambda x: x * 2) + def set_module_resizes(self, module_resizes): + self.module_resizes = module_resizes + def mutate_Module(self, ast_node): ast_node._block = self.mutate(ast_node._block) if ast_node.name == 'main': @@ -194,14 +163,3 @@ class ReplaceModulesByCalls(Mutator): return Block(sim, init_stmts + [While(sim, branch_cond, Block(sim, reset_stmts + [call] + resize_stmts))]) return call - - -def modularize(ast): - add_resize_logic = AddResizeLogic(ast) - add_resize_logic.mutate() - fetch_refs = FetchModulesReferences(ast) - fetch_refs.visit() - add_derefs_to_write_vars = AddDereferencesToWriteVariables(ast) - add_derefs_to_write_vars.mutate() - replace = ReplaceModulesByCalls(ast, add_resize_logic.module_resizes) - replace.mutate() diff --git a/src/pairs/transformations/replace_symbols.py b/src/pairs/transformations/replace_symbols.py deleted file mode 100644 index a23a5a2..0000000 --- a/src/pairs/transformations/replace_symbols.py +++ /dev/null @@ -1,14 +0,0 @@ -from pairs.ir.mutator import Mutator - - -class ReplaceSymbols(Mutator): - def __init__(self, ast): - super().__init__(ast) - - def mutate_Symbol(self, ast_node): - return ast_node.assign_to - - -def replace_symbols(ast): - replace = ReplaceSymbols(ast) - replace.mutate() diff --git a/src/pairs/transformations/set_used_bin_ops.py b/src/pairs/transformations/set_used_bin_ops.py deleted file mode 100644 index ac26bf1..0000000 --- a/src/pairs/transformations/set_used_bin_ops.py +++ /dev/null @@ -1,22 +0,0 @@ -from pairs.ir.visitor import Visitor - - -class SetUsedBinOps(Visitor): - def __init__(self, ast): - super().__init__(ast) - self.bin_ops = [] - - def visit_BinOp(self, ast_node): - ast_node.decl.used = True - self.visit_children(ast_node) - - def visit_Decl(self, ast_node): - pass - - def visit_PropertyAccess(self, ast_node): - ast_node.decl.used = True - self.visit_children(ast_node) - -def set_used_bin_ops(ast): - set_used_binops = SetUsedBinOps(ast) - set_used_binops.visit() diff --git a/src/pairs/transformations/simplify.py b/src/pairs/transformations/simplify.py deleted file mode 100644 index 4491f2c..0000000 --- a/src/pairs/transformations/simplify.py +++ /dev/null @@ -1,36 +0,0 @@ -from pairs.ir.lit import Lit -from pairs.ir.mutator import Mutator -from pairs.ir.types import Types - - -class SimplifyExpressions(Mutator): - def __init__(self, ast): - super().__init__(ast) - - def mutate_BinOp(self, ast_node): - sim = ast_node.lhs.sim - ast_node.lhs = self.mutate(ast_node.lhs) - ast_node.rhs = self.mutate(ast_node.rhs) - ast_node.expressions = {i: self.mutate(e) for i, e in ast_node.expressions.items()} - - if ast_node.op in ['+', '-'] and ast_node.rhs == 0: - return ast_node.lhs - - if ast_node.op in ['+'] and ast_node.lhs == 0: - return ast_node.rhs - - if ast_node.op in ['*', '/'] and ast_node.rhs == 1: - return ast_node.lhs - - if ast_node.op == '*' and ast_node.lhs == 1: - return ast_node.rhs - - if ast_node.op == '*' and ast_node.lhs == 0: - return Lit(sim, 0 if Types.is_integer(ast_node.type()) else 0.0) - - return ast_node - - -def simplify_expressions(ast_node): - simplify = SimplifyExpressions(ast_node) - simplify.mutate() -- GitLab