David-Durst / aetherling

Create auto-scheduled data-parallel pipelines in hardware with user-friendly Python
MIT License
12 stars 1 forks source link

1D Stencil Is Very Slow #25

Open David-Durst opened 4 years ago

David-Durst commented 4 years ago

The test https://github.com/David-Durst/embeddedHaskellAetherling/blob/2afef5715c0109e2b212656f890426bfe169bfac/test/Test_Slowdown.hs#L484-L485 is extremely slow.

λ: :set +s
λ: stencil_1d_results'
[Fault_Success]
(88.27 secs, 8,028,856 bytes)

The issue is not with Haskell. The generated magma circuit file takes 89 seconds to run by itself:

(ae2) david@david-VirtualBox:~/dev/aetherling/aetherling/examples$ time python /tmp/ae_circuit24998-6.py
/home/david/anaconda3/envs/ae2/lib/python3.7/site-packages/pysmt/walkers/generic.py:43: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collecti
ons.abc' is deprecated, and in 3.8 it will stop working
  if len(nodetypes) == 1 and isinstance(nodetypes[0], collections.Iterable):
/home/david/anaconda3/envs/ae2/lib/python3.7/site-packages/ast_tools/immutable_ast.py:10: UserWarning: /home/david/anaconda3/envs/ae2/lib/python3.7/site-packages/ast_tools/immutabl
e_ast.py generated for (3, 6)does not match system version (3, 7)
  warnings.warn(f"{__file__} generated for (3, 6)"
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/binary/coreir.cpp:188 Running Runningvpasses
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:10 In Run Generators
/home/david/dev/coreir/src/passes/transform/rungenerators.cpp:26 Done running generators
/home/david/dev/coreir/src/binary/coreir.cpp:197 Running vpasses
/home/david/dev/coreir/src/binary/coreir.cpp:238 Modified?: No

real    1m29.479s
user    1m28.773s
sys     0m1.692s

I know this is the right python file as it's the most recent one in /tmp and that command is the most recent on I ran that generated files in /tmp. The fault_stderr file is not related.

(ae2) david@david-VirtualBox:~/dev/fault$ ls -lat /tmp | head -n4
total 17544
drwxrwxrwt 35 root  root  286720 Oct  6 13:13 .
-rw-------  1 david david   4938 Oct  6 13:10 ae_circuit_fault_stderr24998-8.txt
-rw-------  1 david david   7568 Oct  6 13:09 ae_circuit24998-6.py
David-Durst commented 4 years ago

All the time is spent in CoreIR: stencil_1d_slow

David-Durst commented 4 years ago

@rdaly525 how do I count the number of instances in a file? The produced json is 70 MB, but I'm not sure why it's so large. In particular, I believe the large size is due to a lot of wire rather than instances.

The json file is in the attached zip ae_example.zip

David-Durst commented 4 years ago

@rdaly525 the file that generates the slow circuit is: https://github.com/David-Durst/aetherling/blob/master/aetherling/examples/ae_circuit24998-6.py

rdaly525 commented 4 years ago

I know that flattening can be a slow operation. Are you flattening?

David-Durst commented 4 years ago

Yes, I am flattening.

David-Durst commented 4 years ago

The entirety of the issue appears to be caused by the reshape at https://github.com/David-Durst/aetherling/blob/master/aetherling/examples/ae_circuit24998-6.py#L102.

The circuit is small but it has a lot of wires. The Reshape makes creating 3 RAMs, each with a port that is 150 ints wide. The circuit is small, but it's a lot of wires.

Is that a resonable circuit for simulation? It seems fine to me but I'd like to get your thoughts @rdaly525 . If this is reasonable, then this appears to be largely a CoreIR wiring issue.