From b80046d2aa17afa6442c82d286e4dd73c10c8e17 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Fri, 11 Mar 2022 11:13:07 +0800 Subject: [PATCH 01/12] False implC --- .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/taco.iml | 2 + .idea/vcs.xml | 8 + .idea/workspace.xml | 168 +++++++++++++++++++ include/taco/lower/lowerer_impl_c.h | 28 ++++ include/taco/lower/lowerer_impl_imperative.h | 4 +- src/lower/lower.cpp | 7 +- src/lower/lowerer_impl_c.cpp | 58 +++++++ 9 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/taco.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 include/taco/lower/lowerer_impl_c.h create mode 100644 src/lower/lowerer_impl_c.cpp diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..79b3c9483 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..1653b7f37 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/taco.iml b/.idea/taco.iml new file mode 100644 index 000000000..f08604bb6 --- /dev/null +++ b/.idea/taco.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..90d9ac8bf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..4bbba6212 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1646959829745 + + + + + + + + + \ No newline at end of file diff --git a/include/taco/lower/lowerer_impl_c.h b/include/taco/lower/lowerer_impl_c.h new file mode 100644 index 000000000..ea2f9b844 --- /dev/null +++ b/include/taco/lower/lowerer_impl_c.h @@ -0,0 +1,28 @@ +// +// Created by 张 on 2022/3/10. +// + +#ifndef TACO_LOWERER_IMPL_C_H +#define TACO_LOWERER_IMPL_C_H + +#include +#include "taco/lower/lowerer_impl_imperative.h" +namespace taco { + class LowererImplC: public LowererImplImperative { + public: + LowererImplC(); + virtual ~LowererImplC() = default; + + /// Lower an index statement to an IR function. +// ir::Stmt lower(IndexStmt stmt, std::string name, +// bool assemble, bool compute, bool pack, bool unpack); + + private: + class Visitor; + friend class Visitor; + std::shared_ptr visitor; + }; +} + + +#endif //TACO_LOWERER_IMPL_C_H diff --git a/include/taco/lower/lowerer_impl_imperative.h b/include/taco/lower/lowerer_impl_imperative.h index 4498b37f0..9d3b4de18 100644 --- a/include/taco/lower/lowerer_impl_imperative.h +++ b/include/taco/lower/lowerer_impl_imperative.h @@ -488,6 +488,8 @@ class LowererImplImperative : public LowererImpl { /// loop iterator variable should be incremented when the guard is fired. ir::Stmt strideBoundsGuard(Iterator iterator, ir::Expr access, bool incrementPosVar); + util::ScopedSet accessibleIterators; + private: bool assemble; bool compute; @@ -578,7 +580,7 @@ class LowererImplImperative : public LowererImpl { std::map reducedValueVars; /// Set of locate-capable iterators that can be legally accessed. - util::ScopedSet accessibleIterators; + /// Visitor methods can add code to emit it to the function header. std::vector header; diff --git a/src/lower/lower.cpp b/src/lower/lower.cpp index 511dcb442..9e763e6bc 100644 --- a/src/lower/lower.cpp +++ b/src/lower/lower.cpp @@ -16,6 +16,7 @@ #include "taco/lower/lowerer_impl.h" #include "taco/lower/lowerer_impl_imperative.h" +#include "taco/lower/lowerer_impl_c.h" #include "taco/lower/iterator.h" #include "mode_access.h" @@ -34,9 +35,11 @@ namespace taco { // class Lowerer -Lowerer::Lowerer() : impl(new LowererImplImperative()) { -} +//Lowerer::Lowerer() : impl(new LowererImplImperative()) { +//} +Lowerer::Lowerer() :impl(new LowererImplC()) { +} Lowerer::Lowerer(LowererImpl* impl) : impl(impl) { } diff --git a/src/lower/lowerer_impl_c.cpp b/src/lower/lowerer_impl_c.cpp new file mode 100644 index 000000000..d9469d52f --- /dev/null +++ b/src/lower/lowerer_impl_c.cpp @@ -0,0 +1,58 @@ +// +// Created by 张 on 2022/3/10. +// + +#include "taco/lower/lowerer_impl_c.h" +#include "taco/index_notation/index_notation_visitor.h" + +using namespace std; +using namespace taco::ir; + +namespace taco { + class LowererImplC::Visitor : public IndexNotationVisitorStrict { + public: + Visitor(LowererImplC* impl):impl(impl) {} + Stmt lower(IndexStmt stmt) { + this->stmt = Stmt(); + impl->accessibleIterators.scope(); + IndexStmtVisitorStrict::visit(stmt); + impl->accessibleIterators.unscope(); + return this->stmt; + } + Expr lower(IndexExpr expr) { + this->expr = Expr(); + IndexExprVisitorStrict::visit(expr); + return this->expr; + } + + private: + LowererImplC* impl; + Expr expr; + Stmt stmt; + using IndexNotationVisitorStrict::visit; + void visit(const AssignmentNode* node) { stmt = impl->lowerAssignment(node); } + void visit(const YieldNode* node) { stmt = impl->lowerYield(node); } + void visit(const ForallNode* node) { stmt = impl->lowerForall(node); } + void visit(const WhereNode* node) { stmt = impl->lowerWhere(node); } + void visit(const MultiNode* node) { stmt = impl->lowerMulti(node); } + void visit(const SuchThatNode* node) { stmt = impl->lowerSuchThat(node); } + void visit(const SequenceNode* node) { stmt = impl->lowerSequence(node); } + void visit(const AssembleNode* node) { stmt = impl->lowerAssemble(node); } + void visit(const AccessNode* node) { expr = impl->lowerAccess(node); } + void visit(const LiteralNode* node) { expr = impl->lowerLiteral(node); } + void visit(const NegNode* node) { expr = impl->lowerNeg(node); } + void visit(const AddNode* node) { expr = impl->lowerAdd(node); } + void visit(const SubNode* node) { expr = impl->lowerSub(node); } + void visit(const MulNode* node) { expr = impl->lowerMul(node); } + void visit(const DivNode* node) { expr = impl->lowerDiv(node); } + void visit(const SqrtNode* node) { expr = impl->lowerSqrt(node); } + void visit(const CastNode* node) { expr = impl->lowerCast(node); } + void visit(const CallIntrinsicNode* node) { expr = impl->lowerCallIntrinsic(node); } + void visit(const CallNode* node) { expr = impl->lowerTensorOp(node); } + void visit(const ReductionNode* node) { + taco_ierror << "Reduction nodes not supported in concrete index notation"; + } + void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } + }; + LowererImplC::LowererImplC(): visitor(new Visitor(this)) {} +} \ No newline at end of file From 0cd498450c774b03429317ef8c633540bb338e6c Mon Sep 17 00:00:00 2001 From: zhang677 Date: Fri, 11 Mar 2022 11:14:47 +0800 Subject: [PATCH 02/12] Fix implC --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 16389f34e..5534e1753 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,5 @@ lib/ *cmake_install.cmake CMakeCache.txt doc - +.idea/ apps/tensor_times_vector/tensor_times_vector From a9c460899cc17fb85115728f7ae85dfad3ba2a52 Mon Sep 17 00:00:00 2001 From: Genghan Zhang <58754328+zhang677@users.noreply.github.com> Date: Fri, 11 Mar 2022 11:16:16 +0800 Subject: [PATCH 03/12] Delete .idea directory --- .idea/misc.xml | 4 -- .idea/modules.xml | 8 --- .idea/taco.iml | 2 - .idea/vcs.xml | 8 --- .idea/workspace.xml | 168 -------------------------------------------- 5 files changed, 190 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/taco.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 79b3c9483..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1653b7f37..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/taco.iml b/.idea/taco.iml deleted file mode 100644 index f08604bb6..000000000 --- a/.idea/taco.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 90d9ac8bf..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 4bbba6212..000000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1646959829745 - - - - - - - - - \ No newline at end of file From a76a25ee4964c3c03e121ebd9c01fc6ac807e9d9 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Sat, 12 Mar 2022 10:41:18 +0800 Subject: [PATCH 04/12] Add lowerer_impl_c --- .../.cmake/api/v1/query/cache-v2 | 0 .../.cmake/api/v1/query/cmakeFiles-v1 | 0 .../.cmake/api/v1/query/codemodel-v2 | 0 .../.cmake/api/v1/query/toolchains-v1 | 0 .../reply/cache-v2-b0bce09660420f4c8db0.json | 1439 +++++++++++++++++ .../cmakeFiles-v1-3c94c8171e5a42c5d686.json | 334 ++++ .../codemodel-v2-be224adb32a17dc42790.json | 205 +++ ...irectory-.-Debug-80c35a89e71fcc05a0b4.json | 62 + ...ctory-apps-Debug-76fddd1453400e648719.json | 14 + ...mes_vector-Debug-0f9a8e629be7aed69a2d.json | 14 + ...ectory-src-Debug-b1ed034fe315973a00fc.json | 45 + ...ctory-test-Debug-451c0598f41488bb20b9.json | 14 + ...tory-tools-Debug-dbed3b70f7bdd5bb451e.json | 45 + .../reply/index-2022-03-12T02-40-10-0965.json | 108 ++ ...target-src-Debug-962ca0d82f886e361309.json | 66 + ...arget-taco-Debug-8bd57ebc8160cc0fd5c9.json | 1279 +++++++++++++++ ...taco-gtest-Debug-7947a6c84e487a4991f5.json | 155 ++ ...-taco-test-Debug-739e70dd559657a4c531.json | 516 ++++++ ...-taco-tool-Debug-acb02dc48eac8b470300.json | 208 +++ ...mes_vector-Debug-d42707e1cd9fd09d0efa.json | 166 ++ .../toolchains-v1-0d3819654bbd2cf5f1ee.json | 88 + cmake-build-debug/CTestTestfile.cmake | 10 + .../Testing/Temporary/LastTest.log | 3 + cmake-build-debug/apps/CTestTestfile.cmake | 7 + .../tensor_times_vector/CTestTestfile.cmake | 6 + .../tensor_times_vector.cbp | 216 +++ cmake-build-debug/include/taco/version.h | 24 + cmake-build-debug/src/CTestTestfile.cmake | 6 + cmake-build-debug/taco.cbp | 1119 +++++++++++++ cmake-build-debug/test/CTestTestfile.cmake | 488 ++++++ cmake-build-debug/tools/CTestTestfile.cmake | 6 + include/taco/lower/lowerer_impl_c.h | 4 - include/taco/lower/lowerer_impl_cuda.h | 23 + src/lower/lower.cpp | 7 +- src/lower/lowerer_impl_cuda.cpp | 58 + test/tests-scheduling-eval.cpp | 19 +- 36 files changed, 6743 insertions(+), 11 deletions(-) create mode 100644 cmake-build-debug/.cmake/api/v1/query/cache-v2 create mode 100644 cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 create mode 100644 cmake-build-debug/.cmake/api/v1/query/codemodel-v2 create mode 100644 cmake-build-debug/.cmake/api/v1/query/toolchains-v1 create mode 100644 cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json create mode 100644 cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json create mode 100644 cmake-build-debug/CTestTestfile.cmake create mode 100644 cmake-build-debug/Testing/Temporary/LastTest.log create mode 100644 cmake-build-debug/apps/CTestTestfile.cmake create mode 100644 cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake create mode 100644 cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp create mode 100644 cmake-build-debug/include/taco/version.h create mode 100644 cmake-build-debug/src/CTestTestfile.cmake create mode 100644 cmake-build-debug/taco.cbp create mode 100644 cmake-build-debug/test/CTestTestfile.cmake create mode 100644 cmake-build-debug/tools/CTestTestfile.cmake create mode 100644 include/taco/lower/lowerer_impl_cuda.h create mode 100644 src/lower/lowerer_impl_cuda.cpp diff --git a/cmake-build-debug/.cmake/api/v1/query/cache-v2 b/cmake-build-debug/.cmake/api/v1/query/cache-v2 new file mode 100644 index 000000000..e69de29bb diff --git a/cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 b/cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 new file mode 100644 index 000000000..e69de29bb diff --git a/cmake-build-debug/.cmake/api/v1/query/codemodel-v2 b/cmake-build-debug/.cmake/api/v1/query/codemodel-v2 new file mode 100644 index 000000000..e69de29bb diff --git a/cmake-build-debug/.cmake/api/v1/query/toolchains-v1 b/cmake-build-debug/.cmake/api/v1/query/toolchains-v1 new file mode 100644 index 000000000..e69de29bb diff --git a/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json b/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json new file mode 100644 index 000000000..d5a18f526 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json @@ -0,0 +1,1439 @@ +{ + "entries" : + [ + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_ADDR2LINE-NOTFOUND" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ar" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/zhang/Desktop/taco/cmake-build-debug" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "21" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_CODEBLOCKS_COMPILER_ID", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Id string of the compiler for the CodeBlocks IDE. Automatically detected when left empty" + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CODEBLOCKS_EXECUTABLE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CodeBlocks executable" + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_CODEBLOCKS_EXECUTABLE-NOTFOUND" + }, + { + "name" : "CMAKE_CODEBLOCKS_MAKE_ARGUMENTS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Additional command line arguments when CodeBlocks invokes make. Enter e.g. -j to get parallel builds" + } + ], + "type" : "STRING", + "value" : "-j16" + }, + { + "name" : "CMAKE_COLOR_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable color output during build." + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/usr/bin/g++" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/usr/bin/gcc" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "MACHO" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of compile commands during generation." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "CodeBlocks" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "CXX compiler system defined macros" + } + ], + "type" : "INTERNAL", + "value" : "__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_STDC_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__cpp_rtti;199711L;__cpp_exceptions;199711L;__cpp_threadsafe_static_init;200806L;__cpp_impl_destroying_delete;201806L;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__EXCEPTIONS;1;__GXX_RTTI;1;__DEPRECATED;1;__GNUG__;4;__GXX_WEAK__;1;__private_extern__;extern;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_GNU_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GLIBCXX_TYPE_INT_N_0;__int128;__GLIBCXX_BITSIZE_INT_N_0;128;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__cplusplus;199711L;__STDCPP_DEFAULT_NEW_ALIGNMENT__;16UL;__STDC_UTF_16__;1;__STDC_UTF_32__;1" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "CXX compiler system include directories" + } + ], + "type" : "INTERNAL", + "value" : "/usr/local/include;/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1;/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include;/Library/Developer/CommandLineTools/usr/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "C compiler system defined macros" + } + ], + "type" : "INTERNAL", + "value" : "__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_STDC_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "C compiler system include directories" + } + ], + "type" : "INTERNAL", + "value" : "/usr/local/include;/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include;/Library/Developer/CommandLineTools/usr/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Unix Makefiles" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/zhang/Desktop/taco" + }, + { + "name" : "CMAKE_INSTALL_NAME_TOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/install_name_tool" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/make" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "6" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_OBJCOPY-NOTFOUND" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/objdump" + }, + { + "name" : "CMAKE_OSX_ARCHITECTURES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build architectures for OSX" + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_OSX_DEPLOYMENT_TARGET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_OSX_SYSROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The product will be built against the headers and libraries located inside the indicated SDK." + } + ], + "type" : "PATH", + "value" : "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "taco" + }, + { + "name" : "CMAKE_PROJECT_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "0.1" + }, + { + "name" : "CMAKE_PROJECT_VERSION_MAJOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "0" + }, + { + "name" : "CMAKE_PROJECT_VERSION_MINOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_VERSION_PATCH", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_VERSION_TWEAK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_READELF-NOTFOUND" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/strip" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "COVERAGE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build with code coverage analysis" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "CUDA", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build for NVIDIA GPU (CUDA must be preinstalled)" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "GIT_EXECUTABLE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Git command line client" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/git" + }, + { + "name" : "GIT_SUBMODULE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Check submodules during build" + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "OPENMP", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build with OpenMP execution support" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "OPTIMIZE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Optimization level" + } + ], + "type" : "STRING", + "value" : "-O3" + }, + { + "name" : "PYTHON", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build TACO for python environment" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "ProcessorCount_cmd_sysctl", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/sbin/sysctl" + }, + { + "name" : "TACO_SHARED_LIBRARY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build as a shared library" + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "taco_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/zhang/Desktop/taco/cmake-build-debug" + }, + { + "name" : "taco_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "taco_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/zhang/Desktop/taco" + }, + { + "name" : "tensor_times_vector_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/zhang/Desktop/taco/cmake-build-debug/apps/tensor_times_vector" + }, + { + "name" : "tensor_times_vector_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "OFF" + }, + { + "name" : "tensor_times_vector_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/zhang/Desktop/taco/apps/tensor_times_vector" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json b/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json new file mode 100644 index 000000000..8f0973413 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json @@ -0,0 +1,334 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isGenerated" : true, + "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Darwin-Initialize.cmake" + }, + { + "isGenerated" : true, + "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeCCompiler.cmake" + }, + { + "isGenerated" : true, + "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Darwin.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeFindCodeBlocks.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/ProcessorCount.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/AppleClang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-AppleClang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/AppleClang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-AppleClang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindGit.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindPackageMessage.cmake" + }, + { + "path" : "include/taco/version.h.in" + }, + { + "path" : "src/CMakeLists.txt" + }, + { + "path" : "test/CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake" + }, + { + "path" : "test/expr_factory.cpp" + }, + { + "path" : "test/test-iteration_algebra.cpp" + }, + { + "path" : "test/test-typedcomponent-memory.cpp" + }, + { + "path" : "test/test.cpp" + }, + { + "path" : "test/test_properties.cpp" + }, + { + "path" : "test/test_tensors.cpp" + }, + { + "path" : "test/tests-api.cpp" + }, + { + "path" : "test/tests-copyprop.cpp" + }, + { + "path" : "test/tests-error.cpp" + }, + { + "path" : "test/tests-expr-reduction.cpp" + }, + { + "path" : "test/tests-expr.cpp" + }, + { + "path" : "test/tests-expr_storage.cpp" + }, + { + "path" : "test/tests-format-mm-permute.cpp" + }, + { + "path" : "test/tests-format.cpp" + }, + { + "path" : "test/tests-index.cpp" + }, + { + "path" : "test/tests-index_notation.cpp" + }, + { + "path" : "test/tests-indexexpr.cpp" + }, + { + "path" : "test/tests-indexstmt.cpp" + }, + { + "path" : "test/tests-io.cpp" + }, + { + "path" : "test/tests-lower.cpp" + }, + { + "path" : "test/tests-merge_lattice.cpp" + }, + { + "path" : "test/tests-parafac.cpp" + }, + { + "path" : "test/tests-qcd.cpp" + }, + { + "path" : "test/tests-regression.cpp" + }, + { + "path" : "test/tests-schedule-parser.cpp" + }, + { + "path" : "test/tests-scheduling-eval.cpp" + }, + { + "path" : "test/tests-scheduling.cpp" + }, + { + "path" : "test/tests-storage.cpp" + }, + { + "path" : "test/tests-storage_alloc.cpp" + }, + { + "path" : "test/tests-tensor.cpp" + }, + { + "path" : "test/tests-tensor_types.cpp" + }, + { + "path" : "test/tests-transformation.cpp" + }, + { + "path" : "test/tests-transpose.cpp" + }, + { + "path" : "test/tests-type.cpp" + }, + { + "path" : "test/tests-windowing.cpp" + }, + { + "path" : "test/tests-workspaces.cpp" + }, + { + "path" : "test/expr_factory.h" + }, + { + "path" : "test/op_factory.h" + }, + { + "path" : "test/test.h" + }, + { + "path" : "test/test_tensors.h" + }, + { + "path" : "tools/CMakeLists.txt" + }, + { + "path" : "apps/CMakeLists.txt" + }, + { + "path" : "apps/tensor_times_vector/CMakeLists.txt" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/zhang/Desktop/taco/cmake-build-debug", + "source" : "/Users/zhang/Desktop/taco" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json b/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json new file mode 100644 index 000000000..43a6470c5 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json @@ -0,0 +1,205 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "childIndexes" : + [ + 1, + 2, + 3, + 4 + ], + "hasInstallRule" : true, + "jsonFile" : "directory-.-Debug-80c35a89e71fcc05a0b4.json", + "minimumCMakeVersion" : + { + "string" : "3.4.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + }, + { + "build" : "src", + "hasInstallRule" : true, + "jsonFile" : "directory-src-Debug-b1ed034fe315973a00fc.json", + "minimumCMakeVersion" : + { + "string" : "3.4.0" + }, + "parentIndex" : 0, + "projectIndex" : 0, + "source" : "src", + "targetIndexes" : + [ + 1 + ] + }, + { + "build" : "test", + "jsonFile" : "directory-test-Debug-451c0598f41488bb20b9.json", + "minimumCMakeVersion" : + { + "string" : "3.4.0" + }, + "parentIndex" : 0, + "projectIndex" : 0, + "source" : "test", + "targetIndexes" : + [ + 2, + 3 + ] + }, + { + "build" : "tools", + "hasInstallRule" : true, + "jsonFile" : "directory-tools-Debug-dbed3b70f7bdd5bb451e.json", + "minimumCMakeVersion" : + { + "string" : "3.4.0" + }, + "parentIndex" : 0, + "projectIndex" : 0, + "source" : "tools", + "targetIndexes" : + [ + 4 + ] + }, + { + "build" : "apps", + "childIndexes" : + [ + 5 + ], + "jsonFile" : "directory-apps-Debug-76fddd1453400e648719.json", + "minimumCMakeVersion" : + { + "string" : "3.4.0" + }, + "parentIndex" : 0, + "projectIndex" : 0, + "source" : "apps" + }, + { + "build" : "apps/tensor_times_vector", + "jsonFile" : "directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json", + "minimumCMakeVersion" : + { + "string" : "2.8.12" + }, + "parentIndex" : 4, + "projectIndex" : 1, + "source" : "apps/tensor_times_vector", + "targetIndexes" : + [ + 5 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "childIndexes" : + [ + 1 + ], + "directoryIndexes" : + [ + 0, + 1, + 2, + 3, + 4 + ], + "name" : "taco", + "targetIndexes" : + [ + 0, + 1, + 2, + 3, + 4 + ] + }, + { + "directoryIndexes" : + [ + 5 + ], + "name" : "tensor_times_vector", + "parentIndex" : 0, + "targetIndexes" : + [ + 5 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "src::@6890427a1f51a3e7e1df", + "jsonFile" : "target-src-Debug-962ca0d82f886e361309.json", + "name" : "src", + "projectIndex" : 0 + }, + { + "directoryIndex" : 1, + "id" : "taco::@145eef247bfb46b6828c", + "jsonFile" : "target-taco-Debug-8bd57ebc8160cc0fd5c9.json", + "name" : "taco", + "projectIndex" : 0 + }, + { + "directoryIndex" : 2, + "id" : "taco-gtest::@36f028580bb02cc8272a", + "jsonFile" : "target-taco-gtest-Debug-7947a6c84e487a4991f5.json", + "name" : "taco-gtest", + "projectIndex" : 0 + }, + { + "directoryIndex" : 2, + "id" : "taco-test::@36f028580bb02cc8272a", + "jsonFile" : "target-taco-test-Debug-739e70dd559657a4c531.json", + "name" : "taco-test", + "projectIndex" : 0 + }, + { + "directoryIndex" : 3, + "id" : "taco-tool::@b9a00e55f22b3d77656c", + "jsonFile" : "target-taco-tool-Debug-acb02dc48eac8b470300.json", + "name" : "taco-tool", + "projectIndex" : 0 + }, + { + "directoryIndex" : 5, + "id" : "tensor_times_vector::@83aeefedd7c945dabd1b", + "jsonFile" : "target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json", + "name" : "tensor_times_vector", + "projectIndex" : 1 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/zhang/Desktop/taco/cmake-build-debug", + "source" : "/Users/zhang/Desktop/taco" + }, + "version" : + { + "major" : 2, + "minor" : 3 + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json b/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json new file mode 100644 index 000000000..64637ec6a --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json @@ -0,0 +1,62 @@ +{ + "backtraceGraph" : + { + "commands" : + [ + "install" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 116, + "parent" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 188, + "parent" : 0 + } + ] + }, + "installers" : + [ + { + "backtrace" : 1, + "component" : "Unspecified", + "destination" : "include", + "paths" : + [ + { + "from" : "include", + "to" : "." + } + ], + "type" : "directory" + }, + { + "backtrace" : 2, + "component" : "Unspecified", + "destination" : "include/taco", + "paths" : + [ + "cmake-build-debug/include/taco/version.h" + ], + "type" : "file" + } + ], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json b/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json new file mode 100644 index 000000000..092b2af75 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : "apps", + "source" : "apps" + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json b/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json new file mode 100644 index 000000000..a7df9e322 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : "apps/tensor_times_vector", + "source" : "apps/tensor_times_vector" + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json b/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json new file mode 100644 index 000000000..2146bf155 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json @@ -0,0 +1,45 @@ +{ + "backtraceGraph" : + { + "commands" : + [ + "install" + ], + "files" : + [ + "src/CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 27, + "parent" : 0 + } + ] + }, + "installers" : + [ + { + "backtrace" : 1, + "component" : "Unspecified", + "destination" : "lib", + "paths" : + [ + "lib/libtaco.dylib" + ], + "targetId" : "taco::@145eef247bfb46b6828c", + "targetIndex" : 1, + "type" : "target" + } + ], + "paths" : + { + "build" : "src", + "source" : "src" + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json b/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json new file mode 100644 index 000000000..4826a5979 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : "test", + "source" : "test" + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json b/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json new file mode 100644 index 000000000..b6e3ae27d --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json @@ -0,0 +1,45 @@ +{ + "backtraceGraph" : + { + "commands" : + [ + "install" + ], + "files" : + [ + "tools/CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 9, + "parent" : 0 + } + ] + }, + "installers" : + [ + { + "backtrace" : 1, + "component" : "Unspecified", + "destination" : "bin", + "paths" : + [ + "bin/taco" + ], + "targetId" : "taco-tool::@b9a00e55f22b3d77656c", + "targetIndex" : 4, + "type" : "target" + } + ], + "paths" : + { + "build" : "tools", + "source" : "tools" + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json b/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json new file mode 100644 index 000000000..ee66a0b71 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json @@ -0,0 +1,108 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Unix Makefiles" + }, + "paths" : + { + "cmake" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake", + "cpack" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cpack", + "ctest" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/ctest", + "root" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 21, + "patch" : 1, + "string" : "3.21.1", + "suffix" : "" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-be224adb32a17dc42790.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + { + "jsonFile" : "cache-v2-b0bce09660420f4c8db0.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-3c94c8171e5a42c5d686.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + { + "jsonFile" : "toolchains-v1-0d3819654bbd2cf5f1ee.json", + "kind" : "toolchains", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-b0bce09660420f4c8db0.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-3c94c8171e5a42c5d686.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-be224adb32a17dc42790.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + "toolchains-v1" : + { + "jsonFile" : "toolchains-v1-0d3819654bbd2cf5f1ee.json", + "kind" : "toolchains", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + } +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json b/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json new file mode 100644 index 000000000..287f3473d --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json @@ -0,0 +1,66 @@ +{ + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_custom_target" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 164, + "parent" : 0 + } + ] + }, + "id" : "src::@6890427a1f51a3e7e1df", + "name" : "src", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "", + "sourceIndexes" : + [ + 0 + ] + }, + { + "name" : "CMake Rules", + "sourceIndexes" : + [ + 1 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "isGenerated" : true, + "path" : "cmake-build-debug/CMakeFiles/src", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 0, + "isGenerated" : true, + "path" : "cmake-build-debug/CMakeFiles/src.rule", + "sourceGroupIndex" : 1 + } + ], + "type" : "UTILITY" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json new file mode 100644 index 000000000..1f5481805 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json @@ -0,0 +1,1279 @@ +{ + "artifacts" : + [ + { + "path" : "lib/libtaco.dylib" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "install", + "add_definitions", + "include_directories" + ], + "files" : + [ + "src/CMakeLists.txt", + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 22, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 27, + "parent" : 0 + }, + { + "file" : 1 + }, + { + "command" : 2, + "file" : 1, + "line" : 48, + "parent" : 3 + }, + { + "command" : 2, + "file" : 1, + "line" : 73, + "parent" : 3 + }, + { + "command" : 2, + "file" : 1, + "line" : 47, + "parent" : 3 + }, + { + "command" : 3, + "file" : 1, + "line" : 112, + "parent" : 3 + }, + { + "command" : 3, + "file" : 0, + "line" : 21, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -fPIC" + } + ], + "defines" : + [ + { + "backtrace" : 4, + "define" : "TACO_ASSERTS" + }, + { + "backtrace" : 5, + "define" : "TACO_DARWIN" + }, + { + "backtrace" : 6, + "define" : "TACO_DEBUG" + }, + { + "define" : "taco_EXPORTS" + } + ], + "includes" : + [ + { + "backtrace" : 7, + "path" : "/Users/zhang/Desktop/taco/include" + }, + { + "backtrace" : 8, + "path" : "/Users/zhang/Desktop/taco/src" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ] + } + ], + "id" : "taco::@145eef247bfb46b6828c", + "install" : + { + "destinations" : + [ + { + "backtrace" : 2, + "path" : "lib" + }, + { + "backtrace" : 2, + "path" : "lib" + } + ], + "prefix" : + { + "path" : "/usr/local" + } + }, + "link" : + { + "commandFragments" : + [ + { + "fragment" : "", + "role" : "flags" + } + ], + "language" : "CXX" + }, + "name" : "taco", + "nameOnDisk" : "libtaco.dylib", + "paths" : + { + "build" : "src", + "source" : "src" + }, + "sourceGroups" : + [ + { + "name" : "Header Files", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87 + ] + }, + { + "name" : "Source Files", + "sourceIndexes" : + [ + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "path" : "include/taco/component.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/coordinate.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/cuda.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/error.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/format.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir_tags.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/taco_tensor_t.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/target.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/tensor.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/type.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/codegen/module.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/error/error_messages.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation_nodes.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation_nodes_abstract.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation_printer.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation_rewriter.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/index_notation_visitor.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/intrinsic.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/iteration_algebra.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/iteration_algebra_printer.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/kernel.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/properties.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/property_pointers.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/provenance_graph.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/schedule.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/tensor_operator.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/index_notation/transformations.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir_generators.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir_printer.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir_rewriter.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir_verifier.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/ir_visitor.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/simplify.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/ir/workspace_rewriter.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/iterator.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/lower.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/lowerer_impl.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/lowerer_impl_c.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/lowerer_impl_cuda.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/lowerer_impl_imperative.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/merge_lattice.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/mode.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/mode_format_compressed.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/mode_format_dense.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/mode_format_impl.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/lower/mode_format_singleton.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/parser/einsum_parser.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/parser/lexer.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/parser/parser.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/parser/schedule_parser.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/array.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/coordinate.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/file_io_mtx.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/file_io_rb.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/file_io_tns.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/index.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/pack.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/storage.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/typed_index.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/typed_value.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/storage/typed_vector.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/collections.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/comparable.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/env.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/files.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/fill.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/functions.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/intrusive_ptr.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/name_generator.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/printable.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/scopedmap.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/scopedset.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/singleton.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/strings.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/timers.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/uncopyable.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "include/taco/util/variadic.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/codegen/codegen.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/codegen/codegen_c.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/codegen/codegen_cuda.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/error/error_checks.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/lower/expr_tools.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/lower/iteration_forest.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/lower/iteration_graph.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/lower/mode_access.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "src/lower/tensor_path.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/cuda.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/error.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/format.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir_tags.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/taco_tensor_t.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/target.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/tensor.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/type.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/codegen/codegen.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/codegen/codegen_c.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/codegen/codegen_cuda.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/codegen/module.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/error/error_checks.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/error/error_messages.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation_nodes.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation_nodes_abstract.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation_printer.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation_rewriter.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/index_notation_visitor.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/intrinsic.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/iteration_algebra.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/iteration_algebra_printer.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/kernel.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/properties.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/property_pointers.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/provenance_graph.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/schedule.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/tensor_operator.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/index_notation/transformations.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir_generators.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir_printer.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir_rewriter.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir_verifier.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/ir_visitor.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/simplify.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ir/workspace_rewriter.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/expr_tools.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/iteration_forest.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/iteration_graph.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/iterator.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/lower.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/lowerer_impl.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/lowerer_impl_c.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/lowerer_impl_cuda.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/lowerer_impl_imperative.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/merge_lattice.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode_access.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode_format_compressed.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode_format_dense.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode_format_impl.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/mode_format_singleton.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/lower/tensor_path.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/parser/einsum_parser.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/parser/lexer.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/parser/parser.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/parser/schedule_parser.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/array.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/file_io_mtx.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/file_io_rb.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/file_io_tns.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/index.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/pack.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/storage.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/typed_index.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/storage/typed_value.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/util/env.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/util/files.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/util/name_generator.cpp", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/util/strings.cpp", + "sourceGroupIndex" : 1 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json new file mode 100644 index 000000000..2e29186c8 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json @@ -0,0 +1,155 @@ +{ + "archive" : {}, + "artifacts" : + [ + { + "path" : "lib/libtaco-gtest.a" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "add_definitions", + "include_directories" + ], + "files" : + [ + "test/CMakeLists.txt", + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "file" : 1 + }, + { + "command" : 1, + "file" : 1, + "line" : 48, + "parent" : 2 + }, + { + "command" : 1, + "file" : 1, + "line" : 73, + "parent" : 2 + }, + { + "command" : 1, + "file" : 1, + "line" : 47, + "parent" : 2 + }, + { + "command" : 2, + "file" : 1, + "line" : 112, + "parent" : 2 + }, + { + "command" : 2, + "file" : 0, + "line" : 3, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" + } + ], + "defines" : + [ + { + "backtrace" : 3, + "define" : "TACO_ASSERTS" + }, + { + "backtrace" : 4, + "define" : "TACO_DARWIN" + }, + { + "backtrace" : 5, + "define" : "TACO_DEBUG" + } + ], + "includes" : + [ + { + "backtrace" : 6, + "path" : "/Users/zhang/Desktop/taco/include" + }, + { + "backtrace" : 7, + "path" : "/Users/zhang/Desktop/taco/test" + }, + { + "backtrace" : 7, + "path" : "/Users/zhang/Desktop/taco/src" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 1 + ] + } + ], + "id" : "taco-gtest::@36f028580bb02cc8272a", + "name" : "taco-gtest", + "nameOnDisk" : "libtaco-gtest.a", + "paths" : + { + "build" : "test", + "source" : "test" + }, + "sourceGroups" : + [ + { + "name" : "Header Files", + "sourceIndexes" : + [ + 0 + ] + }, + { + "name" : "Source Files", + "sourceIndexes" : + [ + 1 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "path" : "test/gtest/gtest.h", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/gtest/gtest-all.cc", + "sourceGroupIndex" : 1 + } + ], + "type" : "STATIC_LIBRARY" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json new file mode 100644 index 000000000..930a30200 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json @@ -0,0 +1,516 @@ +{ + "artifacts" : + [ + { + "path" : "bin/taco-test" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_executable", + "target_link_libraries", + "add_definitions", + "include_directories" + ], + "files" : + [ + "test/CMakeLists.txt", + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 10, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 11, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 12, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 13, + "parent" : 0 + }, + { + "file" : 1 + }, + { + "command" : 2, + "file" : 1, + "line" : 48, + "parent" : 5 + }, + { + "command" : 2, + "file" : 1, + "line" : 73, + "parent" : 5 + }, + { + "command" : 2, + "file" : 1, + "line" : 47, + "parent" : 5 + }, + { + "command" : 3, + "file" : 1, + "line" : 112, + "parent" : 5 + }, + { + "command" : 3, + "file" : 0, + "line" : 3, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" + } + ], + "defines" : + [ + { + "backtrace" : 6, + "define" : "TACO_ASSERTS" + }, + { + "backtrace" : 7, + "define" : "TACO_DARWIN" + }, + { + "backtrace" : 8, + "define" : "TACO_DEBUG" + } + ], + "includes" : + [ + { + "backtrace" : 9, + "path" : "/Users/zhang/Desktop/taco/include" + }, + { + "backtrace" : 10, + "path" : "/Users/zhang/Desktop/taco/test" + }, + { + "backtrace" : 10, + "path" : "/Users/zhang/Desktop/taco/src" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + } + ], + "dependencies" : + [ + { + "backtrace" : 4, + "id" : "taco::@145eef247bfb46b6828c" + }, + { + "backtrace" : 2, + "id" : "taco-gtest::@36f028580bb02cc8272a" + } + ], + "id" : "taco-test::@36f028580bb02cc8272a", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g", + "role" : "flags" + }, + { + "fragment" : "", + "role" : "flags" + }, + { + "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", + "role" : "libraries" + }, + { + "backtrace" : 2, + "fragment" : "../lib/libtaco-gtest.a", + "role" : "libraries" + }, + { + "backtrace" : 3, + "fragment" : "-lpthread", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "../lib/libtaco.dylib", + "role" : "libraries" + } + ], + "language" : "CXX" + }, + "name" : "taco-test", + "nameOnDisk" : "taco-test", + "paths" : + { + "build" : "test", + "source" : "test" + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ] + }, + { + "name" : "Header Files", + "sourceIndexes" : + [ + 36, + 37, + 38, + 39 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/expr_factory.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/test-iteration_algebra.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/test-typedcomponent-memory.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/test.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/test_properties.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/test_tensors.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-api.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-copyprop.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-error.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-expr-reduction.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-expr.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-expr_storage.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-format-mm-permute.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-format.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-index.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-index_notation.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-indexexpr.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-indexstmt.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-io.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-lower.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-merge_lattice.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-parafac.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-qcd.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-regression.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-schedule-parser.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-scheduling-eval.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-scheduling.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-storage.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-storage_alloc.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-tensor.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-tensor_types.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-transformation.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-transpose.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-type.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-windowing.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "test/tests-workspaces.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "test/expr_factory.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "test/op_factory.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "test/test.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "test/test_tensors.h", + "sourceGroupIndex" : 1 + } + ], + "type" : "EXECUTABLE" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json new file mode 100644 index 000000000..9615007e2 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json @@ -0,0 +1,208 @@ +{ + "artifacts" : + [ + { + "path" : "bin/taco" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_executable", + "install", + "target_link_libraries", + "add_definitions", + "include_directories", + "target_include_directories" + ], + "files" : + [ + "tools/CMakeLists.txt", + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 5, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 9, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 6, + "parent" : 0 + }, + { + "file" : 1 + }, + { + "command" : 3, + "file" : 1, + "line" : 48, + "parent" : 4 + }, + { + "command" : 3, + "file" : 1, + "line" : 73, + "parent" : 4 + }, + { + "command" : 3, + "file" : 1, + "line" : 47, + "parent" : 4 + }, + { + "command" : 4, + "file" : 1, + "line" : 112, + "parent" : 4 + }, + { + "command" : 5, + "file" : 0, + "line" : 7, + "parent" : 0 + }, + { + "command" : 4, + "file" : 0, + "line" : 12, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" + } + ], + "defines" : + [ + { + "backtrace" : 5, + "define" : "TACO_ASSERTS" + }, + { + "backtrace" : 6, + "define" : "TACO_DARWIN" + }, + { + "backtrace" : 7, + "define" : "TACO_DEBUG" + } + ], + "includes" : + [ + { + "backtrace" : 8, + "path" : "/Users/zhang/Desktop/taco/include" + }, + { + "backtrace" : 9, + "path" : "/Users/zhang/Desktop/taco/cmake-build-debug/include" + }, + { + "backtrace" : 10, + "path" : "/Users/zhang/Desktop/taco/src" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ] + } + ], + "dependencies" : + [ + { + "backtrace" : 3, + "id" : "taco::@145eef247bfb46b6828c" + } + ], + "id" : "taco-tool::@b9a00e55f22b3d77656c", + "install" : + { + "destinations" : + [ + { + "backtrace" : 2, + "path" : "bin" + } + ], + "prefix" : + { + "path" : "/usr/local" + } + }, + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g", + "role" : "flags" + }, + { + "fragment" : "", + "role" : "flags" + }, + { + "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", + "role" : "libraries" + }, + { + "backtrace" : 3, + "fragment" : "../lib/libtaco.dylib", + "role" : "libraries" + } + ], + "language" : "CXX" + }, + "name" : "taco-tool", + "nameOnDisk" : "taco", + "paths" : + { + "build" : "tools", + "source" : "tools" + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "tools/taco.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "EXECUTABLE" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json b/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json new file mode 100644 index 000000000..5ce481427 --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json @@ -0,0 +1,166 @@ +{ + "artifacts" : + [ + { + "path" : "bin/taco-tensor_times_vector" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_executable", + "target_link_libraries", + "add_definitions", + "include_directories" + ], + "files" : + [ + "apps/tensor_times_vector/CMakeLists.txt", + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 9, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 22, + "parent" : 0 + }, + { + "file" : 1 + }, + { + "command" : 2, + "file" : 1, + "line" : 48, + "parent" : 3 + }, + { + "command" : 2, + "file" : 1, + "line" : 73, + "parent" : 3 + }, + { + "command" : 2, + "file" : 1, + "line" : 47, + "parent" : 3 + }, + { + "command" : 3, + "file" : 1, + "line" : 112, + "parent" : 3 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -std=c++11 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" + } + ], + "defines" : + [ + { + "backtrace" : 4, + "define" : "TACO_ASSERTS" + }, + { + "backtrace" : 5, + "define" : "TACO_DARWIN" + }, + { + "backtrace" : 6, + "define" : "TACO_DEBUG" + } + ], + "includes" : + [ + { + "backtrace" : 7, + "path" : "/Users/zhang/Desktop/taco/include" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ] + } + ], + "dependencies" : + [ + { + "backtrace" : 2, + "id" : "taco::@145eef247bfb46b6828c" + } + ], + "id" : "tensor_times_vector::@83aeefedd7c945dabd1b", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -std=c++11 -g", + "role" : "flags" + }, + { + "fragment" : "", + "role" : "flags" + }, + { + "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", + "role" : "libraries" + }, + { + "backtrace" : 2, + "fragment" : "../../lib/libtaco.dylib", + "role" : "libraries" + } + ], + "language" : "CXX" + }, + "name" : "tensor_times_vector", + "nameOnDisk" : "taco-tensor_times_vector", + "paths" : + { + "build" : "apps/tensor_times_vector", + "source" : "apps/tensor_times_vector" + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "apps/tensor_times_vector/tensor_times_vector.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "EXECUTABLE" +} diff --git a/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json b/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json new file mode 100644 index 000000000..d0a81dddd --- /dev/null +++ b/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json @@ -0,0 +1,88 @@ +{ + "kind" : "toolchains", + "toolchains" : + [ + { + "compiler" : + { + "id" : "AppleClang", + "implicit" : + { + "includeDirectories" : + [ + "/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include", + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include", + "/Library/Developer/CommandLineTools/usr/include" + ], + "linkDirectories" : + [ + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib" + ], + "linkFrameworkDirectories" : + [ + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks" + ], + "linkLibraries" : [] + }, + "path" : "/usr/bin/gcc", + "version" : "11.0.3.11030032" + }, + "language" : "C", + "sourceFileExtensions" : + [ + "c", + "m" + ] + }, + { + "compiler" : + { + "id" : "AppleClang", + "implicit" : + { + "includeDirectories" : + [ + "/Library/Developer/CommandLineTools/usr/include/c++/v1", + "/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include", + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include", + "/Library/Developer/CommandLineTools/usr/include" + ], + "linkDirectories" : + [ + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib" + ], + "linkFrameworkDirectories" : + [ + "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks" + ], + "linkLibraries" : + [ + "c++" + ] + }, + "path" : "/usr/bin/g++", + "version" : "11.0.3.11030032" + }, + "language" : "CXX", + "sourceFileExtensions" : + [ + "C", + "M", + "c++", + "cc", + "cpp", + "cxx", + "mm", + "mpp", + "CPP", + "ixx", + "cppm" + ] + } + ], + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/cmake-build-debug/CTestTestfile.cmake b/cmake-build-debug/CTestTestfile.cmake new file mode 100644 index 000000000..59035db9e --- /dev/null +++ b/cmake-build-debug/CTestTestfile.cmake @@ -0,0 +1,10 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("src") +subdirs("test") +subdirs("tools") +subdirs("apps") diff --git a/cmake-build-debug/Testing/Temporary/LastTest.log b/cmake-build-debug/Testing/Temporary/LastTest.log new file mode 100644 index 000000000..cf35374f3 --- /dev/null +++ b/cmake-build-debug/Testing/Temporary/LastTest.log @@ -0,0 +1,3 @@ +Start testing: Mar 12 10:40 CST +---------------------------------------------------------- +End testing: Mar 12 10:40 CST diff --git a/cmake-build-debug/apps/CTestTestfile.cmake b/cmake-build-debug/apps/CTestTestfile.cmake new file mode 100644 index 000000000..e9af891dd --- /dev/null +++ b/cmake-build-debug/apps/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco/apps +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/apps +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("tensor_times_vector") diff --git a/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake b/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake new file mode 100644 index 000000000..f291c9825 --- /dev/null +++ b/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco/apps/tensor_times_vector +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/apps/tensor_times_vector +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp b/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp new file mode 100644 index 000000000..9834b05b6 --- /dev/null +++ b/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp @@ -0,0 +1,216 @@ + + + + + + diff --git a/cmake-build-debug/include/taco/version.h b/cmake-build-debug/include/taco/version.h new file mode 100644 index 000000000..723e620a4 --- /dev/null +++ b/cmake-build-debug/include/taco/version.h @@ -0,0 +1,24 @@ +#ifndef TACO_VERSION_H +#define TACO_VERSION_H + +// This file contains version/config info, gathered at cmake config time. + +#define TACO_BUILD_TYPE "Debug" +#define TACO_BUILD_DATE "2022-03-12" + +#define TACO_BUILD_COMPILER_ID "AppleClang" +#define TACO_BUILD_COMPILER_VERSION "11.0.3.11030032" + +#define TACO_VERSION_MAJOR "0" +#define TACO_VERSION_MINOR "1" +// if taco starts using a patch number, add here +// if taco starts using a tweak number, add here + +// For non-git builds, this will be an empty string. +#define TACO_VERSION_GIT_SHORTHASH "a9c46089" + +#define TACO_FEATURE_OPENMP 0 +#define TACO_FEATURE_PYTHON 0 +#define TACO_FEATURE_CUDA 0 + +#endif /* TACO_VERSION_H */ diff --git a/cmake-build-debug/src/CTestTestfile.cmake b/cmake-build-debug/src/CTestTestfile.cmake new file mode 100644 index 000000000..04f02e46c --- /dev/null +++ b/cmake-build-debug/src/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco/src +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/src +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/cmake-build-debug/taco.cbp b/cmake-build-debug/taco.cbp new file mode 100644 index 000000000..f155f89ff --- /dev/null +++ b/cmake-build-debug/taco.cbp @@ -0,0 +1,1119 @@ + + + + + + diff --git a/cmake-build-debug/test/CTestTestfile.cmake b/cmake-build-debug/test/CTestTestfile.cmake new file mode 100644 index 000000000..0bf8a9042 --- /dev/null +++ b/cmake-build-debug/test/CTestTestfile.cmake @@ -0,0 +1,488 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco/test +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/test +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(iteration_algebra.region "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.region") +set_tests_properties(iteration_algebra.region PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.Complement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Complement") +set_tests_properties(iteration_algebra.Complement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.Union "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Union") +set_tests_properties(iteration_algebra.Union PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.Intersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Intersect") +set_tests_properties(iteration_algebra.Intersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.comparatorRegion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorRegion") +set_tests_properties(iteration_algebra.comparatorRegion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.comparatorComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorComplement") +set_tests_properties(iteration_algebra.comparatorComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.comparatorIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorIntersect") +set_tests_properties(iteration_algebra.comparatorIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.comparatorUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorUnion") +set_tests_properties(iteration_algebra.comparatorUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.comparatorMix "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorMix") +set_tests_properties(iteration_algebra.comparatorMix PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.deMorganRegion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganRegion") +set_tests_properties(iteration_algebra.deMorganRegion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.deMorganComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganComplement") +set_tests_properties(iteration_algebra.deMorganComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.DeMorganNestedComplements "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.DeMorganNestedComplements") +set_tests_properties(iteration_algebra.DeMorganNestedComplements PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.deMorganIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganIntersect") +set_tests_properties(iteration_algebra.deMorganIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.deMorganUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganUnion") +set_tests_properties(iteration_algebra.deMorganUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.UnionComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.UnionComplement") +set_tests_properties(iteration_algebra.UnionComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.flipUnionToIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.flipUnionToIntersect") +set_tests_properties(iteration_algebra.flipUnionToIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.flipIntersectToUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.flipIntersectToUnion") +set_tests_properties(iteration_algebra.flipIntersectToUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.hiddenIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.hiddenIntersect") +set_tests_properties(iteration_algebra.hiddenIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(iteration_algebra.hiddenUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.hiddenUnion") +set_tests_properties(iteration_algebra.hiddenUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(makecsr.access_past_pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=makecsr.access_past_pos") +set_tests_properties(makecsr.access_past_pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.annihilator "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.annihilator") +set_tests_properties(properties.annihilator PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.identity "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.identity") +set_tests_properties(properties.identity PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.associative "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.associative") +set_tests_properties(properties.associative PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.commutative "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.commutative") +set_tests_properties(properties.commutative PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.property_conversion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.property_conversion") +set_tests_properties(properties.property_conversion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(properties.findProperty "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.findProperty") +set_tests_properties(properties.findProperty PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apiset.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiset.api/*") +set_tests_properties(*/apiset.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apiget.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiget.api/*") +set_tests_properties(*/apiget.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apiwrb.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiwrb.api/*") +set_tests_properties(*/apiwrb.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apiwmtx.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiwmtx.api/*") +set_tests_properties(*/apiwmtx.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apitns.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apitns.api/*") +set_tests_properties(*/apitns.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_copy "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_copy") +set_tests_properties(expr.simplify_copy PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_copy_before_update "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_copy_before_update") +set_tests_properties(expr.simplify_copy_before_update PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_dont_copy_loop_dependent_var "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_dont_copy_loop_dependent_var") +set_tests_properties(expr.simplify_dont_copy_loop_dependent_var PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.expr_dimension_mismatch_freevar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.expr_dimension_mismatch_freevar") +set_tests_properties(error.expr_dimension_mismatch_freevar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.expr_dimension_mismatch_sumvar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.expr_dimension_mismatch_sumvar") +set_tests_properties(error.expr_dimension_mismatch_sumvar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.compile_without_expr "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compile_without_expr") +set_tests_properties(error.compile_without_expr PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.compile_tensor_name_collision "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compile_tensor_name_collision") +set_tests_properties(error.compile_tensor_name_collision PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.assemble_without_compile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.assemble_without_compile") +set_tests_properties(error.assemble_without_compile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(error.compute_without_compile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compute_without_compile") +set_tests_properties(error.compute_without_compile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.reduction0 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.reduction0") +set_tests_properties(expr.reduction0 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.repeated_operand "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.repeated_operand") +set_tests_properties(expr.repeated_operand PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.accumulate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=expr.DISABLED_accumulate") +set_tests_properties(expr.accumulate PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.sub "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.sub") +set_tests_properties(expr.sub PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_neg "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_neg") +set_tests_properties(expr.simplify_neg PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_elmul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_elmul") +set_tests_properties(expr.simplify_elmul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_add") +set_tests_properties(expr.simplify_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_addmul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_addmul") +set_tests_properties(expr.simplify_addmul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.simplify_muladd "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_muladd") +set_tests_properties(expr.simplify_muladd PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.scalarops "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.scalarops") +set_tests_properties(expr.scalarops PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.redefine "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.redefine") +set_tests_properties(expr.redefine PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.indexVarSimple "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.indexVarSimple") +set_tests_properties(expr.indexVarSimple PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(expr.indexVarMix "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.indexVarMix") +set_tests_properties(expr.indexVarMix PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/expr.storage/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/expr.storage/*") +set_tests_properties(*/expr.storage/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(format.mm_permute_formats "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=format.DISABLED_mm_permute_formats") +set_tests_properties(format.mm_permute_formats PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/format.pack/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/format.pack/*") +set_tests_properties(*/format.pack/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(format.sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=format.sparse") +set_tests_properties(format.sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(format.dense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=format.dense") +set_tests_properties(format.dense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(index.size "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=index.size") +set_tests_properties(index.size PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(index.makeCSR "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=index.makeCSR") +set_tests_properties(index.makeCSR PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.isEinsumNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isEinsumNotation") +set_tests_properties(notation.isEinsumNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.isReductionNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isReductionNotation") +set_tests_properties(notation.isReductionNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.isConcreteNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isConcreteNotation") +set_tests_properties(notation.isConcreteNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.makeReductionNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.makeReductionNotation") +set_tests_properties(notation.makeReductionNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.isomorphic "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isomorphic") +set_tests_properties(notation.isomorphic PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.generatePackCOOStmt "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.generatePackCOOStmt") +set_tests_properties(notation.generatePackCOOStmt PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/concrete.notation/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/concrete.notation/*") +set_tests_properties(*/concrete.notation/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(notation.funcIsomorphic "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.funcIsomorphic") +set_tests_properties(notation.funcIsomorphic PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.access") +set_tests_properties(indexexpr.access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.literal "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.literal") +set_tests_properties(indexexpr.literal PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.neg "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.neg") +set_tests_properties(indexexpr.neg PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.add") +set_tests_properties(indexexpr.add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.sub "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.sub") +set_tests_properties(indexexpr.sub PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.mul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.mul") +set_tests_properties(indexexpr.mul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.div "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.div") +set_tests_properties(indexexpr.div PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexexpr.indexvar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.indexvar") +set_tests_properties(indexexpr.indexvar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.assignment "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.assignment") +set_tests_properties(indexstmt.assignment PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.forall "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.forall") +set_tests_properties(indexstmt.forall PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.where "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.where") +set_tests_properties(indexstmt.where PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.multi "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.multi") +set_tests_properties(indexstmt.multi PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.sequence "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.sequence") +set_tests_properties(indexstmt.sequence PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(indexstmt.spmm "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.spmm") +set_tests_properties(indexstmt.spmm PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.tns "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.tns") +set_tests_properties(io.tns PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.mtx "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.mtx") +set_tests_properties(io.mtx PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.tensor "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.tensor") +set_tests_properties(io.tensor PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.ttxdense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.ttxdense") +set_tests_properties(io.ttxdense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.ttxsparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.ttxsparse") +set_tests_properties(io.ttxsparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(io.mtxsymmetric "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.mtxsymmetric") +set_tests_properties(io.mtxsymmetric PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/lower.compile/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/lower.compile/*") +set_tests_properties(*/lower.compile/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/merge_lattice.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/merge_lattice.test/*") +set_tests_properties(*/merge_lattice.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.split "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split") +set_tests_properties(merge_lattice.split PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.split_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split_sparse") +set_tests_properties(merge_lattice.split_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.dense_tile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.dense_tile") +set_tests_properties(merge_lattice.dense_tile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.pos") +set_tests_properties(merge_lattice.pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.pos_mul_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.pos_mul_sparse") +set_tests_properties(merge_lattice.pos_mul_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(merge_lattice.split_pos_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split_pos_sparse") +set_tests_properties(merge_lattice.split_pos_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/parafac.eval/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/parafac.eval/*") +set_tests_properties(*/parafac.eval/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(qcd.mul0 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul0") +set_tests_properties(qcd.mul0 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(qcd.mul1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul1") +set_tests_properties(qcd.mul1 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(qcd.mul2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul2") +set_tests_properties(qcd.mul2 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(qcd.mul3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_qcd.mul3") +set_tests_properties(qcd.mul3 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(schedule_parser.normal_operation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule_parser.normal_operation") +set_tests_properties(schedule_parser.normal_operation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(schedule_parser.error_reporting "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule_parser.error_reporting") +set_tests_properties(schedule_parser.error_reporting PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.test_spmvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_spmvCPU_temp") +set_tests_properties(scheduling_eval.test_spmvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.test_sptvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_sptvCPU_temp") +set_tests_properties(scheduling_eval.test_sptvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.example_spmvCPU_splitpos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.example_spmvCPU_splitpos") +set_tests_properties(scheduling_eval.example_spmvCPU_splitpos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmCPU") +set_tests_properties(scheduling_eval.spmmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/spgemm.scheduling_eval/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/spgemm.scheduling_eval/*") +set_tests_properties(*/spgemm.scheduling_eval/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmataddCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmataddCPU") +set_tests_properties(scheduling_eval.spmataddCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.sptenaddCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sptenaddCPU") +set_tests_properties(scheduling_eval.sptenaddCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.sddmmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sddmmCPU") +set_tests_properties(scheduling_eval.sddmmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmvCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvCPU") +set_tests_properties(scheduling_eval.spmvCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.precompute2D "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.precompute2D") +set_tests_properties(scheduling_eval.precompute2D PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.precompute1D "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.precompute1D") +set_tests_properties(scheduling_eval.precompute1D PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.ttvCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvCPU") +set_tests_properties(scheduling_eval.ttvCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.ttvCPU_CSR "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvCPU_CSR") +set_tests_properties(scheduling_eval.ttvCPU_CSR PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.ttmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttmCPU") +set_tests_properties(scheduling_eval.ttmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.mttkrpCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.mttkrpCPU") +set_tests_properties(scheduling_eval.mttkrpCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmvGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvGPU") +set_tests_properties(scheduling_eval.spmvGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmGPU") +set_tests_properties(scheduling_eval.spmmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmmDCSRGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmDCSRGPU") +set_tests_properties(scheduling_eval.spmmDCSRGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.sddmmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sddmmGPU") +set_tests_properties(scheduling_eval.sddmmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.ttmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttmGPU") +set_tests_properties(scheduling_eval.ttmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.ttvGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvGPU") +set_tests_properties(scheduling_eval.ttvGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.mttkrpGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.mttkrpGPU") +set_tests_properties(scheduling_eval.mttkrpGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.indexVarSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.indexVarSplit") +set_tests_properties(scheduling_eval.indexVarSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(generate_evaluation_files.cpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_evaluation_files.DISABLED_cpu") +set_tests_properties(generate_evaluation_files.cpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(generate_evaluation_files.gpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_evaluation_files.DISABLED_gpu") +set_tests_properties(generate_evaluation_files.gpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(generate_figures.cpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_figures.DISABLED_cpu") +set_tests_properties(generate_figures.cpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.bfsPullScheduled "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=scheduling_eval.DISABLED_bfsPullScheduled") +set_tests_properties(scheduling_eval.bfsPullScheduled PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.splitEquality "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.splitEquality") +set_tests_properties(scheduling.splitEquality PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.forallReplace "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.forallReplace") +set_tests_properties(scheduling.forallReplace PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.splitIndexStmt "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.splitIndexStmt") +set_tests_properties(scheduling.splitIndexStmt PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.fuseDenseLoops "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.fuseDenseLoops") +set_tests_properties(scheduling.fuseDenseLoops PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerDenseMatrixMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerDenseMatrixMul") +set_tests_properties(scheduling.lowerDenseMatrixMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerSparseCopy "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseCopy") +set_tests_properties(scheduling.lowerSparseCopy PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerSparseMulDense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMulDense") +set_tests_properties(scheduling.lowerSparseMulDense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerSparseMulSparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMulSparse") +set_tests_properties(scheduling.lowerSparseMulSparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.precomputeIndependentIndexVars "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.precomputeIndependentIndexVars") +set_tests_properties(scheduling.precomputeIndependentIndexVars PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.precomputeIndependentIndexVarsSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.precomputeIndependentIndexVarsSplit") +set_tests_properties(scheduling.precomputeIndependentIndexVarsSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerSparseAddSparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseAddSparse") +set_tests_properties(scheduling.lowerSparseAddSparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.lowerSparseMatrixMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMatrixMul") +set_tests_properties(scheduling.lowerSparseMatrixMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.parallelizeAtomicReduction "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.parallelizeAtomicReduction") +set_tests_properties(scheduling.parallelizeAtomicReduction PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.parallelizeTemporaryReduction "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.parallelizeTemporaryReduction") +set_tests_properties(scheduling.parallelizeTemporaryReduction PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.multilevel_tiling "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.multilevel_tiling") +set_tests_properties(scheduling.multilevel_tiling PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_noop "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_noop") +set_tests_properties(scheduling.pos_noop PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_mul_dense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_dense") +set_tests_properties(scheduling.pos_mul_dense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_mul_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_sparse") +set_tests_properties(scheduling.pos_mul_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_mul_dense_split "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_dense_split") +set_tests_properties(scheduling.pos_mul_dense_split PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_tile_coord_and_pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_tile_coord_and_pos") +set_tests_properties(scheduling.pos_tile_coord_and_pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.spmv_warp_per_row "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.spmv_warp_per_row") +set_tests_properties(scheduling.spmv_warp_per_row PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.dense_pos_error "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.dense_pos_error") +set_tests_properties(scheduling.dense_pos_error PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_var_not_in_access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_var_not_in_access") +set_tests_properties(scheduling.pos_var_not_in_access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.pos_wrong_access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_wrong_access") +set_tests_properties(scheduling.pos_wrong_access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval_test.spmv_fuse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.spmv_fuse") +set_tests_properties(scheduling_eval_test.spmv_fuse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval_test.indexVarSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.indexVarSplit") +set_tests_properties(scheduling_eval_test.indexVarSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval_test.indexVarReorder "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.indexVarReorder") +set_tests_properties(scheduling_eval_test.indexVarReorder PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling.divide "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.divide") +set_tests_properties(scheduling.divide PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/storage.pack/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/storage.pack/*") +set_tests_properties(*/storage.pack/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/alloc.storage/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/alloc.storage/*") +set_tests_properties(*/alloc.storage/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.double_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.double_scalar") +set_tests_properties(tensor.double_scalar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.double_vector "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.double_vector") +set_tests_properties(tensor.double_vector PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.iterate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.iterate") +set_tests_properties(tensor.iterate PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.iterate_empty "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.iterate_empty") +set_tests_properties(tensor.iterate_empty PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.duplicates "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.duplicates") +set_tests_properties(tensor.duplicates PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.duplicates_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.duplicates_scalar") +set_tests_properties(tensor.duplicates_scalar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.scalar_type_correct "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.scalar_type_correct") +set_tests_properties(tensor.scalar_type_correct PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.non_zero_fill "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.non_zero_fill") +set_tests_properties(tensor.non_zero_fill PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.transpose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.transpose") +set_tests_properties(tensor.transpose PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.operator_parens_insertion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.operator_parens_insertion") +set_tests_properties(tensor.operator_parens_insertion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.get_value "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.get_value") +set_tests_properties(tensor.get_value PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.set_from_components "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.set_from_components") +set_tests_properties(tensor.set_from_components PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.hidden_pack "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.hidden_pack") +set_tests_properties(tensor.hidden_pack PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.automatic_pack_before_iteration "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.automatic_pack_before_iteration") +set_tests_properties(tensor.automatic_pack_before_iteration PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.automatic_pack_before_const_iteration "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.automatic_pack_before_const_iteration") +set_tests_properties(tensor.automatic_pack_before_const_iteration PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.hidden_compiler_methods "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.hidden_compiler_methods") +set_tests_properties(tensor.hidden_compiler_methods PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.explicit_compiler_methods "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.explicit_compiler_methods") +set_tests_properties(tensor.explicit_compiler_methods PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.computation_dependency_modification "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.computation_dependency_modification") +set_tests_properties(tensor.computation_dependency_modification PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.old_dependency_modification "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.old_dependency_modification") +set_tests_properties(tensor.old_dependency_modification PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.skip_recompile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.skip_recompile") +set_tests_properties(tensor.skip_recompile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.recompile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.recompile") +set_tests_properties(tensor.recompile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor.cache "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.cache") +set_tests_properties(tensor.cache PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/ScalarTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/ScalarTensorTest.types/*") +set_tests_properties(*/ScalarTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/ScalarValueTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/ScalarValueTensorTest.types/*") +set_tests_properties(*/ScalarValueTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/VectorTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/VectorTensorTest.types/*") +set_tests_properties(*/VectorTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/IterateTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/IterateTensorTest.types/*") +set_tests_properties(*/IterateTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/AddTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/AddTensorTest.types/*") +set_tests_properties(*/AddTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/MulTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/MulTensorTest.types/*") +set_tests_properties(*/MulTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.complex_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_add") +set_tests_properties(tensor_types.complex_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.complex_mul_complex "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_mul_complex") +set_tests_properties(tensor_types.complex_mul_complex PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.complex_mul_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_tensor_types.complex_mul_scalar") +set_tests_properties(tensor_types.complex_mul_scalar PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.complex_available_expr "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_available_expr") +set_tests_properties(tensor_types.complex_available_expr PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.complex_accumulate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_accumulate") +set_tests_properties(tensor_types.complex_accumulate PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.float_double_promotion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.float_double_promotion") +set_tests_properties(tensor_types.float_double_promotion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.int_float_promotion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.int_float_promotion") +set_tests_properties(tensor_types.int_float_promotion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(tensor_types.coordinate_types "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_tensor_types.coordinate_types") +set_tests_properties(tensor_types.coordinate_types PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/precondition.transformations/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/precondition.transformations/*") +set_tests_properties(*/precondition.transformations/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/apply.transformations/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apply.transformations/*") +set_tests_properties(*/apply.transformations/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/reorderLoopsTopologically.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/reorderLoopsTopologically.test/*") +set_tests_properties(*/reorderLoopsTopologically.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/insertTemporaries.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/insertTemporaries.test/*") +set_tests_properties(*/insertTemporaries.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(schedule.workspace_spmspm "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule.workspace_spmspm") +set_tests_properties(schedule.workspace_spmspm PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(lower.transpose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose") +set_tests_properties(lower.transpose PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(lower.transpose2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose2") +set_tests_properties(lower.transpose2 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(lower.transpose3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose3") +set_tests_properties(lower.transpose3 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(lower.denseIterationTranspose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=lower.denseIterationTranspose") +set_tests_properties(lower.denseIterationTranspose PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/IntTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/IntTest.types/*") +set_tests_properties(*/IntTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/UIntTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/UIntTest.types/*") +set_tests_properties(*/UIntTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/FloatTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/FloatTest.types/*") +set_tests_properties(*/FloatTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(type.equality "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.equality") +set_tests_properties(type.equality PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(type.Dimension "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.Dimension") +set_tests_properties(type.Dimension PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(type.Shape "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.Shape") +set_tests_properties(type.Shape PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(type.TensorType "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.TensorType") +set_tests_properties(type.TensorType PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.mixIndexing "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.mixIndexing") +set_tests_properties(windowing.mixIndexing PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.boundsChecks "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.boundsChecks") +set_tests_properties(windowing.boundsChecks PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.sliceMultipleWays "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.sliceMultipleWays") +set_tests_properties(windowing.sliceMultipleWays PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/basic.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/basic.windowing/*") +set_tests_properties(*/basic.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/slicedOutput.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/slicedOutput.windowing/*") +set_tests_properties(*/slicedOutput.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/matrixMultiply.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/matrixMultiply.windowing/*") +set_tests_properties(*/matrixMultiply.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/workspace.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/workspace.windowing/*") +set_tests_properties(*/workspace.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.transformations "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.transformations") +set_tests_properties(windowing.transformations PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/assignment.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/assignment.windowing/*") +set_tests_properties(*/assignment.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/cuda.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/cuda.windowing/*") +set_tests_properties(*/cuda.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/stride.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/stride.windowing/*") +set_tests_properties(*/stride.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/indexSetVectors.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/indexSetVectors.windowing/*") +set_tests_properties(*/indexSetVectors.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(*/indexSetMatrices.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/indexSetMatrices.windowing/*") +set_tests_properties(*/indexSetMatrices.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.lhsIndexSet "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.lhsIndexSet") +set_tests_properties(windowing.lhsIndexSet PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(windowing.compoundAssign "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.compoundAssign") +set_tests_properties(windowing.compoundAssign PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_vecElemMul_NoTail "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_NoTail") +set_tests_properties(workspaces.tile_vecElemMul_NoTail PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_vecElemMul_Tail1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_Tail1") +set_tests_properties(workspaces.tile_vecElemMul_Tail1 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_vecElemMul_Tail2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_Tail2") +set_tests_properties(workspaces.tile_vecElemMul_Tail2 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_denseMatMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_denseMatMul") +set_tests_properties(workspaces.tile_denseMatMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute2D_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute2D_add") +set_tests_properties(workspaces.precompute2D_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute4D_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute4D_add") +set_tests_properties(workspaces.precompute4D_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute4D_multireduce "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute4D_multireduce") +set_tests_properties(workspaces.precompute4D_multireduce PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute3D_TspV "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_TspV") +set_tests_properties(workspaces.precompute3D_TspV PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute3D_multipleWS "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_multipleWS") +set_tests_properties(workspaces.precompute3D_multipleWS PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.precompute3D_renamedIVars_TspV "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_renamedIVars_TspV") +set_tests_properties(workspaces.precompute3D_renamedIVars_TspV PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_dotProduct_1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=workspaces.DISABLED_tile_dotProduct_1") +set_tests_properties(workspaces.tile_dotProduct_1 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_dotProduct_2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=workspaces.DISABLED_tile_dotProduct_2") +set_tests_properties(workspaces.tile_dotProduct_2 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(workspaces.tile_dotProduct_3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_dotProduct_3") +set_tests_properties(workspaces.tile_dotProduct_3 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(taco-cli-test "/Users/zhang/Desktop/taco/test/bats/bin/bats" "/Users/zhang/Desktop/taco/test/") +set_tests_properties(taco-cli-test PROPERTIES _BACKTRACE_TRIPLES "/Users/zhang/Desktop/taco/test/CMakeLists.txt;25;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") diff --git a/cmake-build-debug/tools/CTestTestfile.cmake b/cmake-build-debug/tools/CTestTestfile.cmake new file mode 100644 index 000000000..62bef847d --- /dev/null +++ b/cmake-build-debug/tools/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /Users/zhang/Desktop/taco/tools +# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/tools +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/include/taco/lower/lowerer_impl_c.h b/include/taco/lower/lowerer_impl_c.h index ea2f9b844..4acadd994 100644 --- a/include/taco/lower/lowerer_impl_c.h +++ b/include/taco/lower/lowerer_impl_c.h @@ -13,10 +13,6 @@ namespace taco { LowererImplC(); virtual ~LowererImplC() = default; - /// Lower an index statement to an IR function. -// ir::Stmt lower(IndexStmt stmt, std::string name, -// bool assemble, bool compute, bool pack, bool unpack); - private: class Visitor; friend class Visitor; diff --git a/include/taco/lower/lowerer_impl_cuda.h b/include/taco/lower/lowerer_impl_cuda.h new file mode 100644 index 000000000..54b9ed7d2 --- /dev/null +++ b/include/taco/lower/lowerer_impl_cuda.h @@ -0,0 +1,23 @@ +// +// Created by 张 on 2022/3/12. +// + +#ifndef TACO_LOWERER_IMPL_CUDA_H +#define TACO_LOWERER_IMPL_CUDA_H + +#include +#include "taco/lower/lowerer_impl_imperative.h" +namespace taco { + class LowererImplCUDA: public LowererImplImperative { + public: + LowererImplCUDA(); + virtual ~LowererImplCUDA() = default; + + private: + class Visitor; + friend class Visitor; + std::shared_ptr visitor; + }; +} + +#endif //TACO_LOWERER_IMPL_CUDA_H diff --git a/src/lower/lower.cpp b/src/lower/lower.cpp index 9e763e6bc..7b1c68a31 100644 --- a/src/lower/lower.cpp +++ b/src/lower/lower.cpp @@ -35,11 +35,10 @@ namespace taco { // class Lowerer -//Lowerer::Lowerer() : impl(new LowererImplImperative()) { -//} -Lowerer::Lowerer() :impl(new LowererImplC()) { - +Lowerer::Lowerer() : impl(new LowererImplImperative()) { } +//Lowerer::Lowerer() :impl(new LowererImplC()) { +//} Lowerer::Lowerer(LowererImpl* impl) : impl(impl) { } diff --git a/src/lower/lowerer_impl_cuda.cpp b/src/lower/lowerer_impl_cuda.cpp new file mode 100644 index 000000000..553951380 --- /dev/null +++ b/src/lower/lowerer_impl_cuda.cpp @@ -0,0 +1,58 @@ +// +// Created by 张 on 2022/3/10. +// + +#include "taco/lower/lowerer_impl_cuda.h" +#include "taco/index_notation/index_notation_visitor.h" + +using namespace std; +using namespace taco::ir; + +namespace taco { + class LowererImplCUDA::Visitor : public IndexNotationVisitorStrict { + public: + Visitor(LowererImplCUDA* impl):impl(impl) {} + Stmt lower(IndexStmt stmt) { + this->stmt = Stmt(); + impl->accessibleIterators.scope(); + IndexStmtVisitorStrict::visit(stmt); + impl->accessibleIterators.unscope(); + return this->stmt; + } + Expr lower(IndexExpr expr) { + this->expr = Expr(); + IndexExprVisitorStrict::visit(expr); + return this->expr; + } + + private: + LowererImplCUDA* impl; + Expr expr; + Stmt stmt; + using IndexNotationVisitorStrict::visit; + void visit(const AssignmentNode* node) { stmt = impl->lowerAssignment(node); } + void visit(const YieldNode* node) { stmt = impl->lowerYield(node); } + void visit(const ForallNode* node) { stmt = impl->lowerForall(node); } + void visit(const WhereNode* node) { stmt = impl->lowerWhere(node); } + void visit(const MultiNode* node) { stmt = impl->lowerMulti(node); } + void visit(const SuchThatNode* node) { stmt = impl->lowerSuchThat(node); } + void visit(const SequenceNode* node) { stmt = impl->lowerSequence(node); } + void visit(const AssembleNode* node) { stmt = impl->lowerAssemble(node); } + void visit(const AccessNode* node) { expr = impl->lowerAccess(node); } + void visit(const LiteralNode* node) { expr = impl->lowerLiteral(node); } + void visit(const NegNode* node) { expr = impl->lowerNeg(node); } + void visit(const AddNode* node) { expr = impl->lowerAdd(node); } + void visit(const SubNode* node) { expr = impl->lowerSub(node); } + void visit(const MulNode* node) { expr = impl->lowerMul(node); } + void visit(const DivNode* node) { expr = impl->lowerDiv(node); } + void visit(const SqrtNode* node) { expr = impl->lowerSqrt(node); } + void visit(const CastNode* node) { expr = impl->lowerCast(node); } + void visit(const CallIntrinsicNode* node) { expr = impl->lowerCallIntrinsic(node); } + void visit(const CallNode* node) { expr = impl->lowerTensorOp(node); } + void visit(const ReductionNode* node) { + taco_ierror << "Reduction nodes not supported in concrete index notation"; + } + void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } + }; + LowererImplCUDA::LowererImplCUDA(): visitor(new Visitor(this)) {} +} \ No newline at end of file diff --git a/test/tests-scheduling-eval.cpp b/test/tests-scheduling-eval.cpp index a16ab11f9..3b56e0298 100644 --- a/test/tests-scheduling-eval.cpp +++ b/test/tests-scheduling-eval.cpp @@ -10,14 +10,26 @@ #include "codegen/codegen.h" #include "taco/lower/lower.h" #include "op_factory.h" +#include "taco/lower/lowerer_impl_c.h" +#include "taco/lower/lowerer_impl_cuda.h" +#include "taco/lower/lowerer_impl_imperative.h" using namespace taco; const IndexVar i("i"), j("j"), k("k"), l("l"), m("m"), n("n"); int WARP_SIZE = 32; -void printToCout(IndexStmt stmt) { +enum Platform { + c, + cuda +}; + +void printToCout(IndexStmt stmt, Platform platform=c) { std::shared_ptr codegen = ir::CodeGen::init_default(cout, ir::CodeGen::ImplementationGen); - ir::Stmt compute = lower(stmt, "compute", false, true); + ir::Stmt compute; + switch (platform) { + case c: compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplC())); break; + case cuda: compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplCUDA())); break; + } codegen->compile(compute, true); } @@ -428,7 +440,8 @@ TEST(scheduling_eval, test_spmvCPU_temp) { IndexStmt stmt = y.getAssignment().concretize(); stmt = stmt.parallelize(i, ParallelUnit::CPUThread, OutputRaceStrategy::Atomics); - //printToFile("test_spmvCPU_temp", stmt); + //set_CUDA_codegen_enabled(1); + printToCout(stmt, Platform(cuda)); y.compile(stmt); y.assemble(); From f1d9650d9c01af87e259bef9235415215740518e Mon Sep 17 00:00:00 2001 From: zhang677 Date: Sat, 12 Mar 2022 10:42:08 +0800 Subject: [PATCH 05/12] Fix gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5534e1753..52b3eea75 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ CMakeCache.txt doc .idea/ apps/tensor_times_vector/tensor_times_vector +cmake-build-debug/ From 7ac49474ad2cffee746b24b57901cd3cc0e315b4 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Sat, 12 Mar 2022 10:47:28 +0800 Subject: [PATCH 06/12] Fix --- .../reply/index-2022-03-12T02-40-10-0965.json | 108 ------------------ .../Testing/Temporary/LastTest.log | 4 +- cmake-build-debug/include/taco/version.h | 2 +- 3 files changed, 3 insertions(+), 111 deletions(-) delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json diff --git a/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json b/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json deleted file mode 100644 index ee66a0b71..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/index-2022-03-12T02-40-10-0965.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "cmake" : - { - "generator" : - { - "multiConfig" : false, - "name" : "Unix Makefiles" - }, - "paths" : - { - "cmake" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake", - "cpack" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cpack", - "ctest" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/ctest", - "root" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21" - }, - "version" : - { - "isDirty" : false, - "major" : 3, - "minor" : 21, - "patch" : 1, - "string" : "3.21.1", - "suffix" : "" - } - }, - "objects" : - [ - { - "jsonFile" : "codemodel-v2-be224adb32a17dc42790.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - }, - { - "jsonFile" : "cache-v2-b0bce09660420f4c8db0.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - { - "jsonFile" : "cmakeFiles-v1-3c94c8171e5a42c5d686.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - }, - { - "jsonFile" : "toolchains-v1-0d3819654bbd2cf5f1ee.json", - "kind" : "toolchains", - "version" : - { - "major" : 1, - "minor" : 0 - } - } - ], - "reply" : - { - "cache-v2" : - { - "jsonFile" : "cache-v2-b0bce09660420f4c8db0.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - "cmakeFiles-v1" : - { - "jsonFile" : "cmakeFiles-v1-3c94c8171e5a42c5d686.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - }, - "codemodel-v2" : - { - "jsonFile" : "codemodel-v2-be224adb32a17dc42790.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - }, - "toolchains-v1" : - { - "jsonFile" : "toolchains-v1-0d3819654bbd2cf5f1ee.json", - "kind" : "toolchains", - "version" : - { - "major" : 1, - "minor" : 0 - } - } - } -} diff --git a/cmake-build-debug/Testing/Temporary/LastTest.log b/cmake-build-debug/Testing/Temporary/LastTest.log index cf35374f3..c77b8337c 100644 --- a/cmake-build-debug/Testing/Temporary/LastTest.log +++ b/cmake-build-debug/Testing/Temporary/LastTest.log @@ -1,3 +1,3 @@ -Start testing: Mar 12 10:40 CST +Start testing: Mar 12 10:44 CST ---------------------------------------------------------- -End testing: Mar 12 10:40 CST +End testing: Mar 12 10:44 CST diff --git a/cmake-build-debug/include/taco/version.h b/cmake-build-debug/include/taco/version.h index 723e620a4..f4f02a845 100644 --- a/cmake-build-debug/include/taco/version.h +++ b/cmake-build-debug/include/taco/version.h @@ -15,7 +15,7 @@ // if taco starts using a tweak number, add here // For non-git builds, this will be an empty string. -#define TACO_VERSION_GIT_SHORTHASH "a9c46089" +#define TACO_VERSION_GIT_SHORTHASH "f1d9650d" #define TACO_FEATURE_OPENMP 0 #define TACO_FEATURE_PYTHON 0 From 3af27778fc2e130be07fb931cd5e11d2fda7fe31 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Tue, 15 Mar 2022 20:50:07 +0800 Subject: [PATCH 07/12] Split C and CUDA --- .../Testing/Temporary/LastTest.log | 4 +- cmake-build-debug/include/taco/version.h | 4 +- cmake-build-debug/test/CTestTestfile.cmake | 2 + include/taco/lower/lowerer_impl_c.h | 18 + include/taco/lower/lowerer_impl_cuda.h | 21 + include/taco/lower/lowerer_impl_imperative.h | 55 +- src/lower/lowerer_impl_c.cpp | 945 +++++++++++++++++- src/lower/lowerer_impl_cuda.cpp | 827 +++++++++++++++ src/lower/lowerer_impl_imperative.cpp | 1 + test/tests-scheduling-eval.cpp | 45 +- 10 files changed, 1878 insertions(+), 44 deletions(-) diff --git a/cmake-build-debug/Testing/Temporary/LastTest.log b/cmake-build-debug/Testing/Temporary/LastTest.log index c77b8337c..a9c1e3e2f 100644 --- a/cmake-build-debug/Testing/Temporary/LastTest.log +++ b/cmake-build-debug/Testing/Temporary/LastTest.log @@ -1,3 +1,3 @@ -Start testing: Mar 12 10:44 CST +Start testing: Mar 15 20:46 CST ---------------------------------------------------------- -End testing: Mar 12 10:44 CST +End testing: Mar 15 20:46 CST diff --git a/cmake-build-debug/include/taco/version.h b/cmake-build-debug/include/taco/version.h index f4f02a845..c71ee467e 100644 --- a/cmake-build-debug/include/taco/version.h +++ b/cmake-build-debug/include/taco/version.h @@ -4,7 +4,7 @@ // This file contains version/config info, gathered at cmake config time. #define TACO_BUILD_TYPE "Debug" -#define TACO_BUILD_DATE "2022-03-12" +#define TACO_BUILD_DATE "2022-03-15" #define TACO_BUILD_COMPILER_ID "AppleClang" #define TACO_BUILD_COMPILER_VERSION "11.0.3.11030032" @@ -15,7 +15,7 @@ // if taco starts using a tweak number, add here // For non-git builds, this will be an empty string. -#define TACO_VERSION_GIT_SHORTHASH "f1d9650d" +#define TACO_VERSION_GIT_SHORTHASH "7ac49474" #define TACO_FEATURE_OPENMP 0 #define TACO_FEATURE_PYTHON 0 diff --git a/cmake-build-debug/test/CTestTestfile.cmake b/cmake-build-debug/test/CTestTestfile.cmake index 0bf8a9042..118a27fa6 100644 --- a/cmake-build-debug/test/CTestTestfile.cmake +++ b/cmake-build-debug/test/CTestTestfile.cmake @@ -212,6 +212,8 @@ add_test(schedule_parser.error_reporting "/Users/zhang/Desktop/taco/cmake-build- set_tests_properties(schedule_parser.error_reporting PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") add_test(scheduling_eval.test_spmvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_spmvCPU_temp") set_tests_properties(scheduling_eval.test_spmvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") +add_test(scheduling_eval.spmvGPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvGPU_temp") +set_tests_properties(scheduling_eval.spmvGPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") add_test(scheduling_eval.test_sptvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_sptvCPU_temp") set_tests_properties(scheduling_eval.test_sptvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") add_test(scheduling_eval.example_spmvCPU_splitpos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.example_spmvCPU_splitpos") diff --git a/include/taco/lower/lowerer_impl_c.h b/include/taco/lower/lowerer_impl_c.h index 4acadd994..1ca1396f3 100644 --- a/include/taco/lower/lowerer_impl_c.h +++ b/include/taco/lower/lowerer_impl_c.h @@ -13,6 +13,24 @@ namespace taco { LowererImplC(); virtual ~LowererImplC() = default; + protected: + std::vector codeToInitializeDenseAcceleratorArrays(Where where, bool parallel = false); + std::vector codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit); + std::vector codeToInitializeTemporary(Where where); + std::pair canAccelerateDenseTemp(Where where); + std::vector codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit); + /** + * Generate code to initialize values array in range + * [begin * size, (begin + 1) * size) with the fill value. + */ + ir::Stmt initValues(ir::Expr tensor, ir::Expr initVal, ir::Expr begin, ir::Expr size); + ir::Stmt lowerWhere(Where where); + ir::Stmt lowerForall(Forall forall); + + /// Lower a forall that needs to be cloned so that one copy does not have guards + /// used for vectorized and unrolled loops + ir::Stmt lowerForallCloned(Forall forall); + private: class Visitor; friend class Visitor; diff --git a/include/taco/lower/lowerer_impl_cuda.h b/include/taco/lower/lowerer_impl_cuda.h index 54b9ed7d2..9b7151199 100644 --- a/include/taco/lower/lowerer_impl_cuda.h +++ b/include/taco/lower/lowerer_impl_cuda.h @@ -7,12 +7,33 @@ #include #include "taco/lower/lowerer_impl_imperative.h" + + + namespace taco { class LowererImplCUDA: public LowererImplImperative { public: LowererImplCUDA(); virtual ~LowererImplCUDA() = default; + protected: + std::vector codeToInitializeDenseAcceleratorArrays(Where where, bool parallel = false); + std::vector codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit); + std::vector codeToInitializeTemporary(Where where); + std::pair canAccelerateDenseTemp(Where where); + std::vector codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit); + /** + * Generate code to initialize values array in range + * [begin * size, (begin + 1) * size) with the fill value. + */ + ir::Stmt initValues(ir::Expr tensor, ir::Expr initVal, ir::Expr begin, ir::Expr size); + ir::Stmt lowerWhere(Where where); + ir::Stmt lowerForall(Forall forall); + + /// Lower a forall that needs to be cloned so that one copy does not have guards + /// used for vectorized and unrolled loops + ir::Stmt lowerForallCloned(Forall forall); + private: class Visitor; friend class Visitor; diff --git a/include/taco/lower/lowerer_impl_imperative.h b/include/taco/lower/lowerer_impl_imperative.h index 9d3b4de18..a85233229 100644 --- a/include/taco/lower/lowerer_impl_imperative.h +++ b/include/taco/lower/lowerer_impl_imperative.h @@ -331,7 +331,7 @@ class LowererImplImperative : public LowererImpl { * Generate code to initialize values array in range * [begin * size, (begin + 1) * size) with the fill value. */ - ir::Stmt initValues(ir::Expr tensor, ir::Expr initVal, ir::Expr begin, ir::Expr size); + virtual ir::Stmt initValues(ir::Expr tensor, ir::Expr initVal, ir::Expr begin, ir::Expr size); /// Declare position variables and initialize them with a locate. ir::Stmt declLocatePosVars(std::vector iterators); @@ -358,17 +358,17 @@ class LowererImplImperative : public LowererImpl { /// Returns true iff the temporary used in the where statement is dense and sparse iteration over that /// temporary can be automaticallty supported by the compiler. - std::pair canAccelerateDenseTemp(Where where); + virtual std::pair canAccelerateDenseTemp(Where where); /// Initializes a temporary workspace - std::vector codeToInitializeTemporary(Where where); - std::vector codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit); - std::vector codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit); + virtual std::vector codeToInitializeTemporary(Where where); + virtual std::vector codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit); + virtual std::vector codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit); /// Gets the size of a temporary tensorVar in the where statement ir::Expr getTemporarySize(Where where); /// Initializes helper arrays to give dense workspaces sparse acceleration - std::vector codeToInitializeDenseAcceleratorArrays(Where where, bool parallel = false); + virtual std::vector codeToInitializeDenseAcceleratorArrays(Where where, bool parallel = false); /// Recovers a derived indexvar from an underived variable. ir::Stmt codeToRecoverDerivedIndexVar(IndexVar underived, IndexVar indexVar, bool emitVarDecl); @@ -489,13 +489,37 @@ class LowererImplImperative : public LowererImpl { ir::Stmt strideBoundsGuard(Iterator iterator, ir::Expr access, bool incrementPosVar); util::ScopedSet accessibleIterators; + int inParallelLoopDepth = 0; + /// Map used to hoist parallel temporary workspaces. Maps workspace shared by all threads to where statement + std::map whereToTemporaryVar; + std::map whereToIndexListAll; + std::map whereToIndexListSizeAll; + std::map whereToBitGuardAll; + /// Map form temporary to indexList var if accelerating dense workspace + std::map tempToIndexList; + + /// Map form temporary to indexListSize if accelerating dense workspace + std::map tempToIndexListSize; + + /// Map form temporary to bitGuard var if accelerating dense workspace + std::map tempToBitGuard; + + std::set needCompute; + + struct TemporaryArrays { + ir::Expr values; + }; + std::map temporaryArrays; + std::set guardedTemps; + ProvenanceGraph provGraph; + bool emitUnderivedGuards = true; + -private: bool assemble; bool compute; bool loopOrderAllowsShortCircuit = false; - std::set needCompute; + // std::set needCompute; int markAssignsAtomicDepth = 0; ParallelUnit atomicParallelUnit; @@ -507,15 +531,17 @@ class LowererImplImperative : public LowererImpl { /// Map used to hoist temporary workspace initialization std::map temporaryInitialization; + /* /// Map used to hoist parallel temporary workspaces. Maps workspace shared by all threads to where statement std::map whereToTemporaryVar; std::map whereToIndexListAll; std::map whereToIndexListSizeAll; std::map whereToBitGuardAll; + */ /// Map from tensor variables in index notation to variables in the IR std::map tensorVars; - +/* struct TemporaryArrays { ir::Expr values; }; @@ -531,7 +557,7 @@ class LowererImplImperative : public LowererImpl { std::map tempToBitGuard; std::set guardedTemps; - +*/ /// Map from result tensors to variables tracking values array capacity. std::map capacityVars; @@ -548,7 +574,7 @@ class LowererImplImperative : public LowererImpl { Iterators iterators; /// Keep track of relations between IndexVars - ProvenanceGraph provGraph; + // ProvenanceGraph provGraph; bool ignoreVectorize = false; // already being taken into account @@ -565,9 +591,9 @@ class LowererImplImperative : public LowererImpl { bool captureNextLocatePos = false; ir::Stmt capturedLocatePos; // used for whereConsumer when want to replicate same locating - bool emitUnderivedGuards = true; + // bool emitUnderivedGuards = true; - int inParallelLoopDepth = 0; + // int inParallelLoopDepth = 0; std::map parallelUnitSizes; std::map parallelUnitIndexVars; @@ -588,6 +614,9 @@ class LowererImplImperative : public LowererImpl { /// Visitor methods can add code to emit it to the function footer. std::vector footer; + +private: + class Visitor; friend class Visitor; std::shared_ptr visitor; diff --git a/src/lower/lowerer_impl_c.cpp b/src/lower/lowerer_impl_c.cpp index d9469d52f..af6157e8d 100644 --- a/src/lower/lowerer_impl_c.cpp +++ b/src/lower/lowerer_impl_c.cpp @@ -3,7 +3,30 @@ // #include "taco/lower/lowerer_impl_c.h" +#include +#include "taco/lower/lowerer_impl_imperative.h" + + +#include "taco/index_notation/index_notation.h" + +#include "taco/index_notation/index_notation_nodes.h" #include "taco/index_notation/index_notation_visitor.h" +#include "taco/index_notation/index_notation_rewriter.h" + +#include "taco/ir/ir.h" +#include "taco/ir/ir_generators.h" +#include "taco/ir/ir_visitor.h" +#include "taco/ir/simplify.h" +#include "taco/lower/iterator.h" +#include "taco/lower/merge_lattice.h" +#include "mode_access.h" +#include "taco/util/collections.h" + +#include "taco/ir/workspace_rewriter.h" + +using namespace std; +using namespace taco::ir; +using taco::util::combine; using namespace std; using namespace taco::ir; @@ -11,7 +34,8 @@ using namespace taco::ir; namespace taco { class LowererImplC::Visitor : public IndexNotationVisitorStrict { public: - Visitor(LowererImplC* impl):impl(impl) {} + Visitor(LowererImplC *impl) : impl(impl) {} + Stmt lower(IndexStmt stmt) { this->stmt = Stmt(); impl->accessibleIterators.scope(); @@ -19,6 +43,7 @@ namespace taco { impl->accessibleIterators.unscope(); return this->stmt; } + Expr lower(IndexExpr expr) { this->expr = Expr(); IndexExprVisitorStrict::visit(expr); @@ -26,33 +51,905 @@ namespace taco { } private: - LowererImplC* impl; + LowererImplC *impl; Expr expr; Stmt stmt; using IndexNotationVisitorStrict::visit; - void visit(const AssignmentNode* node) { stmt = impl->lowerAssignment(node); } - void visit(const YieldNode* node) { stmt = impl->lowerYield(node); } - void visit(const ForallNode* node) { stmt = impl->lowerForall(node); } - void visit(const WhereNode* node) { stmt = impl->lowerWhere(node); } - void visit(const MultiNode* node) { stmt = impl->lowerMulti(node); } - void visit(const SuchThatNode* node) { stmt = impl->lowerSuchThat(node); } - void visit(const SequenceNode* node) { stmt = impl->lowerSequence(node); } - void visit(const AssembleNode* node) { stmt = impl->lowerAssemble(node); } - void visit(const AccessNode* node) { expr = impl->lowerAccess(node); } - void visit(const LiteralNode* node) { expr = impl->lowerLiteral(node); } - void visit(const NegNode* node) { expr = impl->lowerNeg(node); } - void visit(const AddNode* node) { expr = impl->lowerAdd(node); } - void visit(const SubNode* node) { expr = impl->lowerSub(node); } - void visit(const MulNode* node) { expr = impl->lowerMul(node); } - void visit(const DivNode* node) { expr = impl->lowerDiv(node); } - void visit(const SqrtNode* node) { expr = impl->lowerSqrt(node); } - void visit(const CastNode* node) { expr = impl->lowerCast(node); } - void visit(const CallIntrinsicNode* node) { expr = impl->lowerCallIntrinsic(node); } - void visit(const CallNode* node) { expr = impl->lowerTensorOp(node); } - void visit(const ReductionNode* node) { + + void visit(const AssignmentNode *node) { stmt = impl->lowerAssignment(node); } + + void visit(const YieldNode *node) { stmt = impl->lowerYield(node); } + + void visit(const ForallNode *node) { stmt = impl->lowerForall(node); } + + void visit(const WhereNode *node) { stmt = impl->lowerWhere(node); } + + void visit(const MultiNode *node) { stmt = impl->lowerMulti(node); } + + void visit(const SuchThatNode *node) { stmt = impl->lowerSuchThat(node); } + + void visit(const SequenceNode *node) { stmt = impl->lowerSequence(node); } + + void visit(const AssembleNode *node) { stmt = impl->lowerAssemble(node); } + + void visit(const AccessNode *node) { expr = impl->lowerAccess(node); } + + void visit(const LiteralNode *node) { expr = impl->lowerLiteral(node); } + + void visit(const NegNode *node) { expr = impl->lowerNeg(node); } + + void visit(const AddNode *node) { expr = impl->lowerAdd(node); } + + void visit(const SubNode *node) { expr = impl->lowerSub(node); } + + void visit(const MulNode *node) { expr = impl->lowerMul(node); } + + void visit(const DivNode *node) { expr = impl->lowerDiv(node); } + + void visit(const SqrtNode *node) { expr = impl->lowerSqrt(node); } + + void visit(const CastNode *node) { expr = impl->lowerCast(node); } + + void visit(const CallIntrinsicNode *node) { expr = impl->lowerCallIntrinsic(node); } + + void visit(const CallNode *node) { expr = impl->lowerTensorOp(node); } + + void visit(const ReductionNode *node) { taco_ierror << "Reduction nodes not supported in concrete index notation"; } - void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } + + void visit(const IndexVarNode *node) { expr = impl->lowerIndexVar(node); } }; - LowererImplC::LowererImplC(): visitor(new Visitor(this)) {} + + LowererImplC::LowererImplC() : visitor(new Visitor(this)) {} + + + static bool returnsTrue(IndexExpr expr) { + struct ReturnsTrue : public IndexExprRewriterStrict { + void visit(const AccessNode* op) { + if (op->isAccessingStructure) { + expr = op; + } + } + + void visit(const LiteralNode* op) { + if (op->getDataType() == Bool && op->getVal()) { + expr = op; + } + } + + void visit(const NegNode* op) { + expr = rewrite(op->a); + } + + void visit(const AddNode* op) { + if (rewrite(op->a).defined() || rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const MulNode* op) { + if (rewrite(op->a).defined() && rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const CastNode* op) { + expr = rewrite(op->a); + } + + void visit(const CallNode* op) { + const auto annihilator = findProperty(op->properties); + + if (!annihilator.defined() || !annihilator.positions().empty()) { + return; + } + + if (equals(annihilator.annihilator(), Literal(false))) { + for (const auto& arg : op->args) { + if (!rewrite(arg).defined()) { + return; + } + } + expr = op; + } else { + for (const auto& arg : op->args) { + if (rewrite(arg).defined()) { + expr = op; + return; + } + } + } + } + + void visit(const SqrtNode* op) {} + void visit(const SubNode* op) {} + void visit(const DivNode* op) {} + void visit(const CallIntrinsicNode* op) {} + void visit(const ReductionNode* op) {} + void visit(const IndexVarNode* op) {} + }; + return ReturnsTrue().rewrite(expr).defined(); + } + + static bool needComputeValues(IndexStmt stmt, TensorVar tensor) { + if (tensor.getType().getDataType() != Bool) { + return true; + } + + bool needComputeValue = false; + match(stmt, + function([&]( + const AssignmentNode* n, Matcher* m) { + if (n->lhs.getTensorVar() == tensor && !returnsTrue(n->rhs)) { + needComputeValue = true; + } + }) + ); + + return needComputeValue; + } + + vector LowererImplC::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { + // if parallel == true, need to initialize dense accelerator arrays as size*numThreads + // and rename all dense accelerator arrays to name + '_all' + + TensorVar temporary = where.getTemporary(); + + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + std::string bitGuardSuffix; + if (parallel) + bitGuardSuffix = "_already_set_all"; + else + bitGuardSuffix = "_already_set"; + const std::string bitGuardName = temporary.getName() + bitGuardSuffix; + + Expr bitGuardSize = getTemporarySize(where); + Expr maxThreads = ir::Call::make("omp_get_max_threads", {}, bitGuardSize.type()); + if (parallel) + bitGuardSize = ir::Mul::make(bitGuardSize, maxThreads); + + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + std::string indexListSuffix; + if (parallel) + indexListSuffix = "_index_list_all"; + else + indexListSuffix = "_index_list"; + + const std::string indexListName = temporary.getName() + indexListSuffix; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + // no decl for shared memory + Stmt alreadySetDecl = Stmt(); + Stmt indexListDecl = Stmt(); + Stmt freeTemps = Block::make(Free::make(indexListArr), Free::make(alreadySetArr)); + alreadySetDecl = VarDecl::make(alreadySetArr, ir::Literal::make(0)); + indexListDecl = VarDecl::make(indexListArr, ir::Literal::make(0)); + + if (parallel) { + whereToIndexListAll[where] = indexListArr; + whereToBitGuardAll[where] = alreadySetArr; + } else { + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + + Stmt allocateIndexList = Allocate::make(indexListArr, bitGuardSize); + Expr sizeOfElt = Sizeof::make(bitGuardType); + Expr callocAlreadySet = ir::Call::make("calloc", {bitGuardSize, sizeOfElt}, Int()); + Stmt allocateAlreadySet = VarDecl::make(alreadySetArr, callocAlreadySet); + Stmt inits = Block::make(indexListDecl, allocateIndexList, allocateAlreadySet); + return {inits, freeTemps}; + + } + + // Code to initialize a temporary workspace that is SHARED across ALL parallel units. + // New temporaries are denoted by temporary.getName() + '_all' + // Currently only supports CPUThreads + vector LowererImplC::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + // For the parallel case, need to hoist up a workspace shared by all threads + TensorVar temporaryAll = TensorVar(temporary.getName() + "_all", temporary.getType(), temporary.getFormat()); + this->whereToTemporaryVar[where] = temporaryAll; + + bool accelerateDense = canAccelerateDenseTemp(where).first; + + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where, true); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporaryAll.getName(), + temporaryAll.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Expr sizeAll = ir::Mul::make(size, ir::Call::make("omp_get_max_threads", {}, size.type())); + + // no decl needed for shared memory + Stmt decl = Stmt(); + decl = VarDecl::make(values, ir::Literal::make(0)); + Stmt allocate = Allocate::make(values, sizeAll); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporaryAll, arrays}); + + return {initializeTemporary, freeTemporary}; + } + vector LowererImplC::codeToInitializeTemporary(Where where) { + TensorVar temporary = where.getTemporary(); + + const bool accelerateDense = canAccelerateDenseTemp(where).first; + + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + if (isScalar(temporary.getType())) { + initializeTemporary = defineScalarVariable(temporary, true); + Expr tempSet = ir::Var::make(temporary.getName() + "_set", Datatype::Bool); + Stmt initTempSet = VarDecl::make(tempSet, false); + initializeTemporary = Block::make(initializeTemporary, initTempSet); + tempToBitGuard[temporary] = tempSet; + } else { + // TODO: Need to support keeping track of initialized elements for + // temporaries that don't have sparse accelerator + taco_iassert(!util::contains(guardedTemps, temporary) || accelerateDense); + + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), true, false); + + Expr size = getTemporarySize(where); + + // no decl needed for shared memory + Stmt decl = Stmt(); + decl = VarDecl::make(values, ir::Literal::make(0)); + Stmt allocate = Allocate::make(values, size); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + } + return {initializeTemporary, freeTemporary}; + } + + // Returns true if the following conditions are met: +// 1) The temporary is a dense vector +// 2) There is only one value on the right hand side of the consumer +// -- We would need to handle sparse acceleration in the merge lattices for +// multiple operands on the RHS +// 3) The left hand side of the where consumer is sparse, if the consumer is an +// assignment +// 4) CPU Code is being generated (TEMPORARY - This should be removed) +// -- The sorting calls and calloc call in lower where are CPU specific. We +// could map calloc to a cudaMalloc and use a library like CUB to emit +// the sort. CUB support is built into CUDA 11 but not prior versions of +// CUDA so in that case, we'd probably need to include the CUB headers in +// the generated code. + std::pair LowererImplC::canAccelerateDenseTemp(Where where) { + // TODO: TEMPORARY -- Needs to be removed + + + TensorVar temporary = where.getTemporary(); + // (1) Temporary is dense vector + if(!isDense(temporary.getFormat()) || temporary.getOrder() != 1) { + return std::make_pair(false, false); + } + + // (2) Multiple operands in inputs (need lattice to reason about iteration) + const auto inputAccesses = getArgumentAccesses(where.getConsumer()); + if(inputAccesses.size() > 1 || inputAccesses.empty()) { + return std::make_pair(false, false); + } + + // No or multiple results? + const auto resultAccesses = getResultAccesses(where.getConsumer()).first; + if(resultAccesses.size() > 1 || resultAccesses.empty()) { + return std::make_pair(false, false); + } + + // No check for size of tempVar since we enforced the temporary is a vector + // and if there is only one RHS value, it must (should?) be the temporary + std::vector tempVar = inputAccesses[0].getIndexVars(); + + // Get index vars in result. + std::vector resultVars = resultAccesses[0].getIndexVars(); + auto it = std::find_if(resultVars.begin(), resultVars.end(), + [&](const auto& resultVar) { + return resultVar == tempVar[0] || + provGraph.isDerivedFrom(tempVar[0], resultVar); + }); + + if (it == resultVars.end()) { + return std::make_pair(true, false); + } + + int index = (int)(it - resultVars.begin()); + TensorVar resultTensor = resultAccesses[0].getTensorVar(); + int modeIndex = resultTensor.getFormat().getModeOrdering()[index]; + ModeFormat varFmt = resultTensor.getFormat().getModeFormats()[modeIndex]; + // (3) Level of result is sparse + if(varFmt.isFull()) { + return std::make_pair(false, false); + } + + // Only need to sort the workspace if the result needs to be ordered + return std::make_pair(true, varFmt.isOrdered()); + } + + // Code to initialize the local temporary workspace from the shared workspace +// in codeToInitializeTemporaryParallel for a SINGLE parallel unit +// (e.g.) the local workspace that each thread uses + vector LowererImplC::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + vector decls; + + Expr tempSize = getTemporarySize(where); + Expr threadNum = ir::Call::make("omp_get_thread_num", {}, tempSize.type()); + tempSize = ir::Mul::make(tempSize, threadNum); + + bool accelerateDense = canAccelerateDenseTemp(where).first; + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + // Declare local temporary workspace array + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr values_all = this->temporaryArrays[this->whereToTemporaryVar[where]].values; + Expr tempRhs = ir::Add::make(values_all, tempSize); + Stmt tempDecl = ir::VarDecl::make(values, tempRhs); + decls.push_back(tempDecl); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + + if (accelerateDense) { + // Declare local index list array + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + const std::string indexListName = temporary.getName() + "_index_list"; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + Expr indexList_all = this->whereToIndexListAll[where]; + Expr indexListRhs = ir::Add::make(indexList_all, tempSize); + Stmt indexListDecl = ir::VarDecl::make(indexListArr, indexListRhs); + decls.push_back(indexListDecl); + + // Declare local indexList size variable + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + + // Declare local already set array (bit guard) + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + const std::string bitGuardName = temporary.getName() + "_already_set"; + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + Expr bitGuard_all = this->whereToBitGuardAll[where]; + Expr bitGuardRhs = ir::Add::make(bitGuard_all, tempSize); + Stmt bitGuardDecl = ir::VarDecl::make(alreadySetArr, bitGuardRhs); + decls.push_back(bitGuardDecl); + + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + return decls; + } + + Stmt LowererImplC::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { + Expr lower = simplify(ir::Mul::make(begin, size)); + Expr upper = simplify(ir::Mul::make(ir::Add::make(begin, 1), size)); + Expr p = Var::make("p" + util::toString(tensor), Int()); + Expr values = GetProperty::make(tensor, TensorProperty::Values); + Stmt zeroInit = Store::make(values, p, initVal); + LoopKind parallel = (isa(size) && + to(size)->getIntValue() < (1 << 10)) + ? LoopKind::Serial : LoopKind::Static_Chunked; + return For::make(p, lower, upper, 1, zeroInit, parallel); + } + + + Stmt LowererImplC::lowerForall(Forall forall) + { + bool hasExactBound = provGraph.hasExactBound(forall.getIndexVar()); + bool forallNeedsUnderivedGuards = !hasExactBound && emitUnderivedGuards; + if (!ignoreVectorize && forallNeedsUnderivedGuards && + (forall.getParallelUnit() == ParallelUnit::CPUVector || + forall.getUnrollFactor() > 0)) { + return lowerForallCloned(forall); + } + + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth++; + } + + // Recover any available parents that were not recoverable previously + vector recoverySteps; + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(forall.getIndexVar(), definedIndexVars)) { + // place pos guard + if (forallNeedsUnderivedGuards && provGraph.isCoordVariable(varToRecover) && + provGraph.getChildren(varToRecover).size() == 1 && + provGraph.isPosVariable(provGraph.getChildren(varToRecover)[0])) { + IndexVar posVar = provGraph.getChildren(varToRecover)[0]; + std::vector iterBounds = provGraph.deriveIterBounds(posVar, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + Expr minGuard = Lt::make(indexVarToExprMap[posVar], iterBounds[0]); + Expr maxGuard = Gte::make(indexVarToExprMap[posVar], iterBounds[1]); + Expr guardCondition = Or::make(minGuard, maxGuard); + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardCondition = maxGuard; + } + ir::Stmt guard = ir::IfThenElse::make(guardCondition, ir::Continue::make()); + recoverySteps.push_back(guard); + } + + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + taco_iassert(indexVarToExprMap.count(varToRecover)); + recoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + + // After we've recovered this index variable, some iterators are now + // accessible for use when declaring locator access variables. So, generate + // the accessors for those locator variables as part of the recovery process. + // This is necessary after a fuse transformation, for example: If we fuse + // two index variables (i, j) into f, then after we've generated the loop for + // f, all locate accessors for i and j are now available for use. + std::vector itersForVar; + for (auto& iters : iterators.levelIterators()) { + // Collect all level iterators that have locate and iterate over + // the recovered index variable. + if (iters.second.getIndexVar() == varToRecover && iters.second.hasLocate()) { + itersForVar.push_back(iters.second); + } + } + // Finally, declare all of the collected iterators' position access variables. + recoverySteps.push_back(this->declLocatePosVars(itersForVar)); + + // place underived guard + std::vector iterBounds = provGraph.deriveIterBounds(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + if (forallNeedsUnderivedGuards && underivedBounds.count(varToRecover) && + !provGraph.hasPosDescendant(varToRecover)) { + + // FIXME: [Olivia] Check this with someone + // Removed underived guard if indexVar is bounded is divisible by its split child indexVar + vector children = provGraph.getChildren(varToRecover); + bool hasDirectDivBound = false; + std::vector iterBoundsInner = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + for (auto& c: children) { + if (provGraph.hasExactBound(c) && + provGraph.derivationPath(varToRecover, c).size() == 2) { + const auto iterBoundsUnderivedChild = + provGraph.deriveIterBounds(c, definedIndexVarsOrdered, + underivedBounds, indexVarToExprMap, + iterators); + if (iterBoundsUnderivedChild[1].as()->getValue() % + iterBoundsInner[1].as()->getValue() == 0) { + hasDirectDivBound = true; + break; + } + } + } + if (!hasDirectDivBound) { + Stmt guard = IfThenElse::make(Gte::make(indexVarToExprMap[varToRecover], + underivedBounds[varToRecover][1]), + Continue::make()); + recoverySteps.push_back(guard); + } + } + + // If this index variable was divided into multiple equal chunks, then we + // must add an extra guard to make sure that further scheduling operations + // on descendent index variables exceed the bounds of each equal portion of + // the loop. For a concrete example, consider a loop of size 10 that is divided + // into two equal components -- 5 and 5. If the loop is then transformed + // with .split(..., 3), each inner chunk of 5 will be split into chunks of + // 3. Without an extra guard, the second chunk of 3 in the first group of 5 + // may attempt to perform an iteration for the second group of 5, which is + // incorrect. + if (this->provGraph.isDivided(varToRecover)) { + // Collect the children iteration variables. + auto children = this->provGraph.getChildren(varToRecover); + auto outer = children[0]; + auto inner = children[1]; + // Find the iteration bounds of the inner variable -- that is the size + // that the outer loop was broken into. + auto bounds = this->provGraph.deriveIterBounds(inner, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + // Use the difference between the bounds to find the size of the loop. + auto dimLen = ir::Sub::make(bounds[1], bounds[0]); + // For a variable f divided into into f1 and f2, the guard ensures that + // for iteration f, f should be within f1 * dimLen and (f1 + 1) * dimLen. + auto guard = ir::Gte::make(this->indexVarToExprMap[varToRecover], ir::Mul::make(ir::Add::make(this->indexVarToExprMap[outer], 1), dimLen)); + recoverySteps.push_back(IfThenElse::make(guard, ir::Continue::make())); + } + } + Stmt recoveryStmt = Block::make(recoverySteps); + + taco_iassert(!definedIndexVars.count(forall.getIndexVar())); + definedIndexVars.insert(forall.getIndexVar()); + definedIndexVarsOrdered.push_back(forall.getIndexVar()); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + taco_iassert(!parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(!parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars[forall.getParallelUnit()] = forall.getIndexVar(); + vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + parallelUnitSizes[forall.getParallelUnit()] = ir::Sub::make(bounds[1], bounds[0]); + } + + MergeLattice caseLattice = MergeLattice::make(forall, iterators, provGraph, definedIndexVars, whereTempsToResult); + vector resultAccesses; + set reducedAccesses; + std::tie(resultAccesses, reducedAccesses) = getResultAccesses(forall); + + // Pre-allocate/initialize memory of value arrays that are full below this + // loops index variable + Stmt preInitValues = initResultArrays(forall.getIndexVar(), resultAccesses, + reducedAccesses); + + // Emit temporary initialization if forall is sequential or parallelized by + // cpu threads and leads to a where statement + // This is for workspace hoisting by 1-level + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + auto temp = temporaryInitialization.find(forall); + if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temp->second.getTemporary().getType())) + temporaryValuesInitFree = codeToInitializeTemporary(temp->second); + else if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::CPUThread && !isScalar(temp->second.getTemporary().getType())) { + temporaryValuesInitFree = codeToInitializeTemporaryParallel(temp->second, forall.getParallelUnit()); + } + + Stmt loops; + // Emit a loop that iterates over over a single iterator (optimization) + if (caseLattice.iterators().size() == 1 && caseLattice.iterators()[0].isUnique()) { + MergeLattice loopLattice = caseLattice.getLoopLattice(); + + MergePoint point = loopLattice.points()[0]; + Iterator iterator = loopLattice.iterators()[0]; + + vector locators = point.locators(); + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(point.results()); + + std::vector underivedAncestors = provGraph.getUnderivedAncestors(iterator.getIndexVar()); + IndexVar posDescendant; + bool hasPosDescendant = false; + if (!underivedAncestors.empty()) { + hasPosDescendant = provGraph.getPosIteratorFullyDerivedDescendant(underivedAncestors[0], &posDescendant); + } + + bool isWhereProducer = false; + vector results = point.results(); + for (Iterator result : results) { + for (auto it = tensorVars.begin(); it != tensorVars.end(); it++) { + if (it->second == result.getTensor()) { + if (whereTempsToResult.count(it->first)) { + isWhereProducer = true; + break; + } + } + } + } + + // For now, this only works when consuming a single workspace. + bool canAccelWithSparseIteration = + provGraph.isFullyDerived(iterator.getIndexVar()) && + iterator.isDimensionIterator() && locators.size() == 1; + if (canAccelWithSparseIteration) { + bool indexListsExist = false; + // We are iterating over a dimension and locating into a temporary with a tracker to keep indices. Instead, we + // can just iterate over the indices and locate into the dense workspace. + for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { + if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { + indexListsExist = true; + break; + } + } + canAccelWithSparseIteration &= indexListsExist; + } + + if (!isWhereProducer && hasPosDescendant && underivedAncestors.size() > 1 && provGraph.isPosVariable(iterator.getIndexVar()) && posDescendant == forall.getIndexVar()) { + loops = lowerForallFusedPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + else if (canAccelWithSparseIteration) { + loops = lowerForallDenseAcceleration(forall, locators, inserters, appenders, caseLattice, reducedAccesses, recoveryStmt); + } + // Emit dimension coordinate iteration loop + else if (iterator.isDimensionIterator()) { + loops = lowerForallDimension(forall, point.locators(), inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit position iteration loop + else if (iterator.hasPosIter()) { + loops = lowerForallPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit coordinate iteration loop + else { + taco_iassert(iterator.hasCoordIter()); +// taco_not_supported_yet + loops = Stmt(); + } + } + // Emit general loops to merge multiple iterators + else { + std::vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); + taco_iassert(underivedAncestors.size() == 1); // TODO: add support for fused coordinate of pos loop + loops = lowerMergeLattice(caseLattice, underivedAncestors[0], + forall.getStmt(), reducedAccesses); + } +// taco_iassert(loops.defined()); + + if (!generateComputeCode() && !hasStores(loops)) { + // If assembly loop does not modify output arrays, then it can be safely + // omitted. + loops = Stmt(); + } + definedIndexVars.erase(forall.getIndexVar()); + definedIndexVarsOrdered.pop_back(); + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth--; + taco_iassert(parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars.erase(forall.getParallelUnit()); + parallelUnitSizes.erase(forall.getParallelUnit()); + } + return Block::blanks(preInitValues, + temporaryValuesInitFree[0], + loops, + temporaryValuesInitFree[1]); + } + + Stmt LowererImplC::lowerForallCloned(Forall forall) { + // want to emit guards outside of loop to prevent unstructured loop exits + + // construct guard + // underived or pos variables that have a descendant that has not been defined yet + vector varsWithGuard; + for (auto var : provGraph.getAllIndexVars()) { + if (provGraph.isRecoverable(var, definedIndexVars)) { + continue; // already recovered + } + if (provGraph.isUnderived(var) && !provGraph.hasPosDescendant(var)) { // if there is pos descendant then will be guarded already + varsWithGuard.push_back(var); + } + else if (provGraph.isPosVariable(var)) { + // if parent is coord then this is variable that will be guarded when indexing into coord array + if(provGraph.getParents(var).size() == 1 && provGraph.isCoordVariable(provGraph.getParents(var)[0])) { + varsWithGuard.push_back(var); + } + } + } + + // determine min and max values for vars given already defined variables. + // we do a recovery where we fill in undefined variables with either 0's or the max of their iteration + std::map minVarValues; + std::map maxVarValues; + set definedForGuard = definedIndexVars; + vector guardRecoverySteps; + Expr maxOffset = 0; + bool setMaxOffset = false; + + for (auto var : varsWithGuard) { + std::vector currentDefinedVarOrder = definedIndexVarsOrdered; // TODO: get defined vars at time of this recovery + + std::map minChildValues = indexVarToExprMap; + std::map maxChildValues = indexVarToExprMap; + + for (auto child : provGraph.getFullyDerivedDescendants(var)) { + if (!definedIndexVars.count(child)) { + std::vector childBounds = provGraph.deriveIterBounds(child, currentDefinedVarOrder, underivedBounds, indexVarToExprMap, iterators); + + minChildValues[child] = childBounds[0]; + maxChildValues[child] = childBounds[1]; + + // recover new parents + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(child, definedForGuard)) { + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + minChildValues, iterators); + Expr maxRecoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + maxChildValues, iterators); + if (!setMaxOffset) { // TODO: work on simplifying this + maxOffset = ir::Add::make(maxOffset, ir::Sub::make(maxRecoveredValue, recoveredValue)); + setMaxOffset = true; + } + taco_iassert(indexVarToExprMap.count(varToRecover)); + + guardRecoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + definedForGuard.insert(varToRecover); + } + definedForGuard.insert(child); + } + } + + minVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, minChildValues, iterators); + maxVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, maxChildValues, iterators); + } + + // Build guards + Expr guardCondition; + for (auto var : varsWithGuard) { + std::vector iterBounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + Expr minGuard = Lt::make(minVarValues[var], iterBounds[0]); + Expr maxGuard = Gte::make(ir::Add::make(maxVarValues[var], ir::simplify(maxOffset)), iterBounds[1]); + Expr guardConditionCurrent = Or::make(minGuard, maxGuard); + + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardConditionCurrent = maxGuard; + } + + if (guardCondition.defined()) { + guardCondition = Or::make(guardConditionCurrent, guardCondition); + } + else { + guardCondition = guardConditionCurrent; + } + } + + Stmt unvectorizedLoop; + + taco_uassert(guardCondition.defined()) + << "Unable to vectorize or unroll loop over unbound variable " << forall.getIndexVar(); + + // build loop with guards (not vectorized) + if (!varsWithGuard.empty()) { + ignoreVectorize = true; + unvectorizedLoop = lowerForall(forall); + ignoreVectorize = false; + } + + // build loop without guards + emitUnderivedGuards = false; + Stmt vectorizedLoop = lowerForall(forall); + emitUnderivedGuards = true; + + // return guarded loops + return Block::make(Block::make(guardRecoverySteps), IfThenElse::make(guardCondition, unvectorizedLoop, vectorizedLoop)); + } + + Stmt LowererImplC::lowerWhere(Where where) { + TensorVar temporary = where.getTemporary(); + bool accelerateDenseWorkSpace, sortAccelerator; + std::tie(accelerateDenseWorkSpace, sortAccelerator) = + canAccelerateDenseTemp(where); + + // Declare and initialize the where statement's temporary + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + bool temporaryHoisted = false; + for (auto it = temporaryInitialization.begin(); it != temporaryInitialization.end(); ++it) { + if (it->second == where && it->first.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temporary.getType())) { + temporaryHoisted = true; + } else if (it->second == where && it->first.getParallelUnit() == + ParallelUnit::CPUThread && !isScalar(temporary.getType())) { + temporaryHoisted = true; + auto decls = codeToInitializeLocalTemporaryParallel(where, it->first.getParallelUnit()); + + temporaryValuesInitFree[0] = ir::Block::make(decls); + } + } + + if (!temporaryHoisted) { + temporaryValuesInitFree = codeToInitializeTemporary(where); + } + + Stmt initializeTemporary = temporaryValuesInitFree[0]; + Stmt freeTemporary = temporaryValuesInitFree[1]; + + match(where.getConsumer(), + std::function([&](const AssignmentNode* op) { + if (op->lhs.getTensorVar().getOrder() > 0) { + whereTempsToResult[where.getTemporary()] = (const AccessNode *) op->lhs.ptr; + } + }) + ); + + Stmt consumer = lower(where.getConsumer()); + if (accelerateDenseWorkSpace && sortAccelerator) { + // We need to sort the indices array + Expr listOfIndices = tempToIndexList.at(temporary); + Expr listOfIndicesSize = tempToIndexListSize.at(temporary); + Expr sizeOfElt = ir::Sizeof::make(listOfIndices.type()); + Stmt sortCall = ir::Sort::make({listOfIndices, listOfIndicesSize, sizeOfElt}); + consumer = Block::make(sortCall, consumer); + } + + // Now that temporary allocations are hoisted, we always need to emit an initialization loop before entering the + // producer but only if there is no dense acceleration + if (util::contains(needCompute, temporary) && !isScalar(temporary.getType()) && !accelerateDenseWorkSpace) { + // TODO: We only actually need to do this if: + // 1) We use the temporary multiple times + // 2) The PRODUCER RHS is sparse(not full). (Guarantees that old values are overwritten before consuming) + + Expr p = Var::make("p" + temporary.getName(), Int()); + Expr values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Stmt zeroInit = Store::make(values, p, ir::Literal::zero(temporary.getType().getDataType())); + Stmt loopInit = For::make(p, 0, size, 1, zeroInit, LoopKind::Serial); + initializeTemporary = Block::make(initializeTemporary, loopInit); + } + + whereConsumers.push_back(consumer); + whereTemps.push_back(where.getTemporary()); + captureNextLocatePos = true; + + // don't apply atomics to producer TODO: mark specific assignments as atomic + bool restoreAtomicDepth = false; + if (markAssignsAtomicDepth > 0) { + markAssignsAtomicDepth--; + restoreAtomicDepth = true; + } + + Stmt producer = lower(where.getProducer()); + if (accelerateDenseWorkSpace) { + const Expr indexListSizeExpr = tempToIndexListSize.at(temporary); + const Stmt indexListSizeDecl = VarDecl::make(indexListSizeExpr, ir::Literal::make(0)); + initializeTemporary = Block::make(indexListSizeDecl, initializeTemporary); + } + + if (restoreAtomicDepth) { + markAssignsAtomicDepth++; + } + + whereConsumers.pop_back(); + whereTemps.pop_back(); + whereTempsToResult.erase(where.getTemporary()); + return Block::make(initializeTemporary, producer, markAssignsAtomicDepth > 0 ? capturedLocatePos : ir::Stmt(), consumer, freeTemporary); + } + + + } \ No newline at end of file diff --git a/src/lower/lowerer_impl_cuda.cpp b/src/lower/lowerer_impl_cuda.cpp index 553951380..32545f8d3 100644 --- a/src/lower/lowerer_impl_cuda.cpp +++ b/src/lower/lowerer_impl_cuda.cpp @@ -3,7 +3,26 @@ // #include "taco/lower/lowerer_impl_cuda.h" +#include +#include "taco/lower/lowerer_impl_imperative.h" + + +#include "taco/index_notation/index_notation.h" + +#include "taco/index_notation/index_notation_nodes.h" #include "taco/index_notation/index_notation_visitor.h" +#include "taco/index_notation/index_notation_rewriter.h" + +#include "taco/ir/ir.h" +#include "taco/ir/ir_generators.h" +#include "taco/ir/ir_visitor.h" +#include "taco/ir/simplify.h" +#include "taco/lower/iterator.h" +#include "taco/lower/merge_lattice.h" +#include "mode_access.h" +#include "taco/util/collections.h" + +#include "taco/ir/workspace_rewriter.h" using namespace std; using namespace taco::ir; @@ -55,4 +74,812 @@ namespace taco { void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } }; LowererImplCUDA::LowererImplCUDA(): visitor(new Visitor(this)) {} + + static bool returnsTrue(IndexExpr expr) { + struct ReturnsTrue : public IndexExprRewriterStrict { + void visit(const AccessNode* op) { + if (op->isAccessingStructure) { + expr = op; + } + } + + void visit(const LiteralNode* op) { + if (op->getDataType() == Bool && op->getVal()) { + expr = op; + } + } + + void visit(const NegNode* op) { + expr = rewrite(op->a); + } + + void visit(const AddNode* op) { + if (rewrite(op->a).defined() || rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const MulNode* op) { + if (rewrite(op->a).defined() && rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const CastNode* op) { + expr = rewrite(op->a); + } + + void visit(const CallNode* op) { + const auto annihilator = findProperty(op->properties); + + if (!annihilator.defined() || !annihilator.positions().empty()) { + return; + } + + if (equals(annihilator.annihilator(), Literal(false))) { + for (const auto& arg : op->args) { + if (!rewrite(arg).defined()) { + return; + } + } + expr = op; + } else { + for (const auto& arg : op->args) { + if (rewrite(arg).defined()) { + expr = op; + return; + } + } + } + } + + void visit(const SqrtNode* op) {} + void visit(const SubNode* op) {} + void visit(const DivNode* op) {} + void visit(const CallIntrinsicNode* op) {} + void visit(const ReductionNode* op) {} + void visit(const IndexVarNode* op) {} + }; + return ReturnsTrue().rewrite(expr).defined(); + } + + static bool needComputeValues(IndexStmt stmt, TensorVar tensor) { + if (tensor.getType().getDataType() != Bool) { + return true; + } + + bool needComputeValue = false; + match(stmt, + function([&]( + const AssignmentNode* n, Matcher* m) { + if (n->lhs.getTensorVar() == tensor && !returnsTrue(n->rhs)) { + needComputeValue = true; + } + }) + ); + + return needComputeValue; + } + vector LowererImplCUDA::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { + // if parallel == true, need to initialize dense accelerator arrays as size*numThreads + // and rename all dense accelerator arrays to name + '_all' + + TensorVar temporary = where.getTemporary(); + + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + std::string bitGuardSuffix; + if (parallel) + bitGuardSuffix = "_already_set_all"; + else + bitGuardSuffix = "_already_set"; + const std::string bitGuardName = temporary.getName() + bitGuardSuffix; + + Expr bitGuardSize = getTemporarySize(where); + Expr maxThreads = ir::Call::make("omp_get_max_threads", {}, bitGuardSize.type()); + if (parallel) + bitGuardSize = ir::Mul::make(bitGuardSize, maxThreads); + + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + std::string indexListSuffix; + if (parallel) + indexListSuffix = "_index_list_all"; + else + indexListSuffix = "_index_list"; + + const std::string indexListName = temporary.getName() + indexListSuffix; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + // no decl for shared memory + Stmt alreadySetDecl = Stmt(); + Stmt indexListDecl = Stmt(); + Stmt freeTemps = Block::make(Free::make(indexListArr), Free::make(alreadySetArr)); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0)) { + alreadySetDecl = VarDecl::make(alreadySetArr, ir::Literal::make(0)); + indexListDecl = VarDecl::make(indexListArr, ir::Literal::make(0)); + } + + if (parallel) { + whereToIndexListAll[where] = indexListArr; + whereToBitGuardAll[where] = alreadySetArr; + } else { + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + + Stmt allocateIndexList = Allocate::make(indexListArr, bitGuardSize); + Stmt allocateAlreadySet = Allocate::make(alreadySetArr, bitGuardSize); + Expr p = Var::make("p" + temporary.getName(), Int()); + Stmt guardZeroInit = Store::make(alreadySetArr, p, ir::Literal::zero(bitGuardType)); + + Stmt zeroInitLoop = For::make(p, 0, bitGuardSize, 1, guardZeroInit, LoopKind::Serial); + Stmt inits = Block::make(alreadySetDecl, indexListDecl, allocateAlreadySet, allocateIndexList, zeroInitLoop); + return {inits, freeTemps}; + + + } + + +// Returns true if the following conditions are met: +// 1) The temporary is a dense vector +// 2) There is only one value on the right hand side of the consumer +// -- We would need to handle sparse acceleration in the merge lattices for +// multiple operands on the RHS +// 3) The left hand side of the where consumer is sparse, if the consumer is an +// assignment +// 4) CPU Code is being generated (TEMPORARY - This should be removed) +// -- The sorting calls and calloc call in lower where are CPU specific. We +// could map calloc to a cudaMalloc and use a library like CUB to emit +// the sort. CUB support is built into CUDA 11 but not prior versions of +// CUDA so in that case, we'd probably need to include the CUB headers in +// the generated code. + std::pair LowererImplCUDA::canAccelerateDenseTemp(Where where) { + return std::make_pair(false, false); + } + +// Code to initialize the local temporary workspace from the shared workspace +// in codeToInitializeTemporaryParallel for a SINGLE parallel unit +// (e.g.) the local workspace that each thread uses + vector LowererImplCUDA::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + vector decls; + + Expr tempSize = getTemporarySize(where); + Expr threadNum = ir::Call::make("omp_get_thread_num", {}, tempSize.type()); + tempSize = ir::Mul::make(tempSize, threadNum); + + bool accelerateDense = canAccelerateDenseTemp(where).first; + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + // Declare local temporary workspace array + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr values_all = this->temporaryArrays[this->whereToTemporaryVar[where]].values; + Expr tempRhs = ir::Add::make(values_all, tempSize); + Stmt tempDecl = ir::VarDecl::make(values, tempRhs); + decls.push_back(tempDecl); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + + if (accelerateDense) { + // Declare local index list array + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + const std::string indexListName = temporary.getName() + "_index_list"; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + Expr indexList_all = this->whereToIndexListAll[where]; + Expr indexListRhs = ir::Add::make(indexList_all, tempSize); + Stmt indexListDecl = ir::VarDecl::make(indexListArr, indexListRhs); + decls.push_back(indexListDecl); + + // Declare local indexList size variable + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + + // Declare local already set array (bit guard) + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + const std::string bitGuardName = temporary.getName() + "_already_set"; + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + Expr bitGuard_all = this->whereToBitGuardAll[where]; + Expr bitGuardRhs = ir::Add::make(bitGuard_all, tempSize); + Stmt bitGuardDecl = ir::VarDecl::make(alreadySetArr, bitGuardRhs); + decls.push_back(bitGuardDecl); + + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + return decls; + } + +// Code to initialize a temporary workspace that is SHARED across ALL parallel units. +// New temporaries are denoted by temporary.getName() + '_all' +// Currently only supports CPUThreads + vector LowererImplCUDA::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + // For the parallel case, need to hoist up a workspace shared by all threads + TensorVar temporaryAll = TensorVar(temporary.getName() + "_all", temporary.getType(), temporary.getFormat()); + this->whereToTemporaryVar[where] = temporaryAll; + + bool accelerateDense = canAccelerateDenseTemp(where).first; + + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where, true); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporaryAll.getName(), + temporaryAll.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Expr sizeAll = ir::Mul::make(size, ir::Call::make("omp_get_max_threads", {}, size.type())); + + // no decl needed for shared memory + Stmt decl = Stmt(); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0)) { + decl = VarDecl::make(values, ir::Literal::make(0)); + } + Stmt allocate = Allocate::make(values, sizeAll); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporaryAll, arrays}); + + return {initializeTemporary, freeTemporary}; + } + + vector LowererImplCUDA::codeToInitializeTemporary(Where where) { + TensorVar temporary = where.getTemporary(); + + const bool accelerateDense = canAccelerateDenseTemp(where).first; + + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + if (isScalar(temporary.getType())) { + initializeTemporary = defineScalarVariable(temporary, true); + Expr tempSet = ir::Var::make(temporary.getName() + "_set", Datatype::Bool); + Stmt initTempSet = VarDecl::make(tempSet, false); + initializeTemporary = Block::make(initializeTemporary, initTempSet); + tempToBitGuard[temporary] = tempSet; + } else { + // TODO: Need to support keeping track of initialized elements for + // temporaries that don't have sparse accelerator + taco_iassert(!util::contains(guardedTemps, temporary) || accelerateDense); + + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), true, false); + + Expr size = getTemporarySize(where); + + // no decl needed for shared memory + Stmt decl = Stmt(); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0)) { + decl = VarDecl::make(values, ir::Literal::make(0)); + } + Stmt allocate = Allocate::make(values, size); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + } + return {initializeTemporary, freeTemporary}; + } + Stmt LowererImplCUDA::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { + Expr lower = simplify(ir::Mul::make(begin, size)); + Expr upper = simplify(ir::Mul::make(ir::Add::make(begin, 1), size)); + Expr p = Var::make("p" + util::toString(tensor), Int()); + Expr values = GetProperty::make(tensor, TensorProperty::Values); + Stmt zeroInit = Store::make(values, p, initVal); + LoopKind parallel = (isa(size) && + to(size)->getIntValue() < (1 << 10)) + ? LoopKind::Serial : LoopKind::Static_Chunked; + if (util::contains(parallelUnitSizes, ParallelUnit::GPUBlock)) { + return ir::VarDecl::make(ir::Var::make("status", Int()), + ir::Call::make("cudaMemset", {values, ir::Literal::make(0, Int()), + ir::Mul::make(ir::Sub::make(upper, lower), + ir::Literal::make(values.type().getNumBytes()))}, Int())); + } + return For::make(p, lower, upper, 1, zeroInit, parallel); + } + Stmt LowererImplCUDA::lowerForall(Forall forall) + { + bool hasExactBound = provGraph.hasExactBound(forall.getIndexVar()); + bool forallNeedsUnderivedGuards = !hasExactBound && emitUnderivedGuards; + if (!ignoreVectorize && forallNeedsUnderivedGuards && + (forall.getParallelUnit() == ParallelUnit::CPUVector || + forall.getUnrollFactor() > 0)) { + return lowerForallCloned(forall); + } + + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth++; + } + + // Recover any available parents that were not recoverable previously + vector recoverySteps; + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(forall.getIndexVar(), definedIndexVars)) { + // place pos guard + if (forallNeedsUnderivedGuards && provGraph.isCoordVariable(varToRecover) && + provGraph.getChildren(varToRecover).size() == 1 && + provGraph.isPosVariable(provGraph.getChildren(varToRecover)[0])) { + IndexVar posVar = provGraph.getChildren(varToRecover)[0]; + std::vector iterBounds = provGraph.deriveIterBounds(posVar, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + Expr minGuard = Lt::make(indexVarToExprMap[posVar], iterBounds[0]); + Expr maxGuard = Gte::make(indexVarToExprMap[posVar], iterBounds[1]); + Expr guardCondition = Or::make(minGuard, maxGuard); + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardCondition = maxGuard; + } + ir::Stmt guard = ir::IfThenElse::make(guardCondition, ir::Continue::make()); + recoverySteps.push_back(guard); + } + + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + taco_iassert(indexVarToExprMap.count(varToRecover)); + recoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + + // After we've recovered this index variable, some iterators are now + // accessible for use when declaring locator access variables. So, generate + // the accessors for those locator variables as part of the recovery process. + // This is necessary after a fuse transformation, for example: If we fuse + // two index variables (i, j) into f, then after we've generated the loop for + // f, all locate accessors for i and j are now available for use. + std::vector itersForVar; + for (auto& iters : iterators.levelIterators()) { + // Collect all level iterators that have locate and iterate over + // the recovered index variable. + if (iters.second.getIndexVar() == varToRecover && iters.second.hasLocate()) { + itersForVar.push_back(iters.second); + } + } + // Finally, declare all of the collected iterators' position access variables. + recoverySteps.push_back(this->declLocatePosVars(itersForVar)); + + // place underived guard + std::vector iterBounds = provGraph.deriveIterBounds(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + if (forallNeedsUnderivedGuards && underivedBounds.count(varToRecover) && + !provGraph.hasPosDescendant(varToRecover)) { + + // FIXME: [Olivia] Check this with someone + // Removed underived guard if indexVar is bounded is divisible by its split child indexVar + vector children = provGraph.getChildren(varToRecover); + bool hasDirectDivBound = false; + std::vector iterBoundsInner = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + for (auto& c: children) { + if (provGraph.hasExactBound(c) && + provGraph.derivationPath(varToRecover, c).size() == 2) { + const auto iterBoundsUnderivedChild = + provGraph.deriveIterBounds(c, definedIndexVarsOrdered, + underivedBounds, indexVarToExprMap, + iterators); + if (iterBoundsUnderivedChild[1].as()->getValue() % + iterBoundsInner[1].as()->getValue() == 0) { + hasDirectDivBound = true; + break; + } + } + } + if (!hasDirectDivBound) { + Stmt guard = IfThenElse::make(Gte::make(indexVarToExprMap[varToRecover], + underivedBounds[varToRecover][1]), + Continue::make()); + recoverySteps.push_back(guard); + } + } + + // If this index variable was divided into multiple equal chunks, then we + // must add an extra guard to make sure that further scheduling operations + // on descendent index variables exceed the bounds of each equal portion of + // the loop. For a concrete example, consider a loop of size 10 that is divided + // into two equal components -- 5 and 5. If the loop is then transformed + // with .split(..., 3), each inner chunk of 5 will be split into chunks of + // 3. Without an extra guard, the second chunk of 3 in the first group of 5 + // may attempt to perform an iteration for the second group of 5, which is + // incorrect. + if (this->provGraph.isDivided(varToRecover)) { + // Collect the children iteration variables. + auto children = this->provGraph.getChildren(varToRecover); + auto outer = children[0]; + auto inner = children[1]; + // Find the iteration bounds of the inner variable -- that is the size + // that the outer loop was broken into. + auto bounds = this->provGraph.deriveIterBounds(inner, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + // Use the difference between the bounds to find the size of the loop. + auto dimLen = ir::Sub::make(bounds[1], bounds[0]); + // For a variable f divided into into f1 and f2, the guard ensures that + // for iteration f, f should be within f1 * dimLen and (f1 + 1) * dimLen. + auto guard = ir::Gte::make(this->indexVarToExprMap[varToRecover], ir::Mul::make(ir::Add::make(this->indexVarToExprMap[outer], 1), dimLen)); + recoverySteps.push_back(IfThenElse::make(guard, ir::Continue::make())); + } + } + Stmt recoveryStmt = Block::make(recoverySteps); + + taco_iassert(!definedIndexVars.count(forall.getIndexVar())); + definedIndexVars.insert(forall.getIndexVar()); + definedIndexVarsOrdered.push_back(forall.getIndexVar()); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + taco_iassert(!parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(!parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars[forall.getParallelUnit()] = forall.getIndexVar(); + vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + parallelUnitSizes[forall.getParallelUnit()] = ir::Sub::make(bounds[1], bounds[0]); + } + + MergeLattice caseLattice = MergeLattice::make(forall, iterators, provGraph, definedIndexVars, whereTempsToResult); + vector resultAccesses; + set reducedAccesses; + std::tie(resultAccesses, reducedAccesses) = getResultAccesses(forall); + + // Pre-allocate/initialize memory of value arrays that are full below this + // loops index variable + Stmt preInitValues = initResultArrays(forall.getIndexVar(), resultAccesses, + reducedAccesses); + + // Emit temporary initialization if forall is sequential or parallelized by + // cpu threads and leads to a where statement + // This is for workspace hoisting by 1-level + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + auto temp = temporaryInitialization.find(forall); + if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temp->second.getTemporary().getType())) + temporaryValuesInitFree = codeToInitializeTemporary(temp->second); + else if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::CPUThread && !isScalar(temp->second.getTemporary().getType())) { + temporaryValuesInitFree = codeToInitializeTemporaryParallel(temp->second, forall.getParallelUnit()); + } + + Stmt loops; + // Emit a loop that iterates over over a single iterator (optimization) + if (caseLattice.iterators().size() == 1 && caseLattice.iterators()[0].isUnique()) { + MergeLattice loopLattice = caseLattice.getLoopLattice(); + + MergePoint point = loopLattice.points()[0]; + Iterator iterator = loopLattice.iterators()[0]; + + vector locators = point.locators(); + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(point.results()); + + std::vector underivedAncestors = provGraph.getUnderivedAncestors(iterator.getIndexVar()); + IndexVar posDescendant; + bool hasPosDescendant = false; + if (!underivedAncestors.empty()) { + hasPosDescendant = provGraph.getPosIteratorFullyDerivedDescendant(underivedAncestors[0], &posDescendant); + } + + bool isWhereProducer = false; + vector results = point.results(); + for (Iterator result : results) { + for (auto it = tensorVars.begin(); it != tensorVars.end(); it++) { + if (it->second == result.getTensor()) { + if (whereTempsToResult.count(it->first)) { + isWhereProducer = true; + break; + } + } + } + } + + // For now, this only works when consuming a single workspace. + bool canAccelWithSparseIteration = + provGraph.isFullyDerived(iterator.getIndexVar()) && + iterator.isDimensionIterator() && locators.size() == 1; + if (canAccelWithSparseIteration) { + bool indexListsExist = false; + // We are iterating over a dimension and locating into a temporary with a tracker to keep indices. Instead, we + // can just iterate over the indices and locate into the dense workspace. + for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { + if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { + indexListsExist = true; + break; + } + } + canAccelWithSparseIteration &= indexListsExist; + } + + if (!isWhereProducer && hasPosDescendant && underivedAncestors.size() > 1 && provGraph.isPosVariable(iterator.getIndexVar()) && posDescendant == forall.getIndexVar()) { + loops = lowerForallFusedPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + else if (canAccelWithSparseIteration) { + loops = lowerForallDenseAcceleration(forall, locators, inserters, appenders, caseLattice, reducedAccesses, recoveryStmt); + } + // Emit dimension coordinate iteration loop + else if (iterator.isDimensionIterator()) { + loops = lowerForallDimension(forall, point.locators(), inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit position iteration loop + else if (iterator.hasPosIter()) { + loops = lowerForallPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit coordinate iteration loop + else { + taco_iassert(iterator.hasCoordIter()); +// taco_not_supported_yet + loops = Stmt(); + } + } + // Emit general loops to merge multiple iterators + else { + std::vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); + taco_iassert(underivedAncestors.size() == 1); // TODO: add support for fused coordinate of pos loop + loops = lowerMergeLattice(caseLattice, underivedAncestors[0], + forall.getStmt(), reducedAccesses); + } +// taco_iassert(loops.defined()); + + if (!generateComputeCode() && !hasStores(loops)) { + // If assembly loop does not modify output arrays, then it can be safely + // omitted. + loops = Stmt(); + } + definedIndexVars.erase(forall.getIndexVar()); + definedIndexVarsOrdered.pop_back(); + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth--; + taco_iassert(parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars.erase(forall.getParallelUnit()); + parallelUnitSizes.erase(forall.getParallelUnit()); + } + return Block::blanks(preInitValues, + temporaryValuesInitFree[0], + loops, + temporaryValuesInitFree[1]); + } + + Stmt LowererImplCUDA::lowerForallCloned(Forall forall) { + // want to emit guards outside of loop to prevent unstructured loop exits + + // construct guard + // underived or pos variables that have a descendant that has not been defined yet + vector varsWithGuard; + for (auto var : provGraph.getAllIndexVars()) { + if (provGraph.isRecoverable(var, definedIndexVars)) { + continue; // already recovered + } + if (provGraph.isUnderived(var) && !provGraph.hasPosDescendant(var)) { // if there is pos descendant then will be guarded already + varsWithGuard.push_back(var); + } + else if (provGraph.isPosVariable(var)) { + // if parent is coord then this is variable that will be guarded when indexing into coord array + if(provGraph.getParents(var).size() == 1 && provGraph.isCoordVariable(provGraph.getParents(var)[0])) { + varsWithGuard.push_back(var); + } + } + } + + // determine min and max values for vars given already defined variables. + // we do a recovery where we fill in undefined variables with either 0's or the max of their iteration + std::map minVarValues; + std::map maxVarValues; + set definedForGuard = definedIndexVars; + vector guardRecoverySteps; + Expr maxOffset = 0; + bool setMaxOffset = false; + + for (auto var : varsWithGuard) { + std::vector currentDefinedVarOrder = definedIndexVarsOrdered; // TODO: get defined vars at time of this recovery + + std::map minChildValues = indexVarToExprMap; + std::map maxChildValues = indexVarToExprMap; + + for (auto child : provGraph.getFullyDerivedDescendants(var)) { + if (!definedIndexVars.count(child)) { + std::vector childBounds = provGraph.deriveIterBounds(child, currentDefinedVarOrder, underivedBounds, indexVarToExprMap, iterators); + + minChildValues[child] = childBounds[0]; + maxChildValues[child] = childBounds[1]; + + // recover new parents + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(child, definedForGuard)) { + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + minChildValues, iterators); + Expr maxRecoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + maxChildValues, iterators); + if (!setMaxOffset) { // TODO: work on simplifying this + maxOffset = ir::Add::make(maxOffset, ir::Sub::make(maxRecoveredValue, recoveredValue)); + setMaxOffset = true; + } + taco_iassert(indexVarToExprMap.count(varToRecover)); + + guardRecoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + definedForGuard.insert(varToRecover); + } + definedForGuard.insert(child); + } + } + + minVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, minChildValues, iterators); + maxVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, maxChildValues, iterators); + } + + // Build guards + Expr guardCondition; + for (auto var : varsWithGuard) { + std::vector iterBounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + Expr minGuard = Lt::make(minVarValues[var], iterBounds[0]); + Expr maxGuard = Gte::make(ir::Add::make(maxVarValues[var], ir::simplify(maxOffset)), iterBounds[1]); + Expr guardConditionCurrent = Or::make(minGuard, maxGuard); + + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardConditionCurrent = maxGuard; + } + + if (guardCondition.defined()) { + guardCondition = Or::make(guardConditionCurrent, guardCondition); + } + else { + guardCondition = guardConditionCurrent; + } + } + + Stmt unvectorizedLoop; + + taco_uassert(guardCondition.defined()) + << "Unable to vectorize or unroll loop over unbound variable " << forall.getIndexVar(); + + // build loop with guards (not vectorized) + if (!varsWithGuard.empty()) { + ignoreVectorize = true; + unvectorizedLoop = lowerForall(forall); + ignoreVectorize = false; + } + + // build loop without guards + emitUnderivedGuards = false; + Stmt vectorizedLoop = lowerForall(forall); + emitUnderivedGuards = true; + + // return guarded loops + return Block::make(Block::make(guardRecoverySteps), IfThenElse::make(guardCondition, unvectorizedLoop, vectorizedLoop)); + } + Stmt LowererImplCUDA::lowerWhere(Where where) { + TensorVar temporary = where.getTemporary(); + bool accelerateDenseWorkSpace, sortAccelerator; + std::tie(accelerateDenseWorkSpace, sortAccelerator) = + canAccelerateDenseTemp(where); + + // Declare and initialize the where statement's temporary + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + bool temporaryHoisted = false; + for (auto it = temporaryInitialization.begin(); it != temporaryInitialization.end(); ++it) { + if (it->second == where && it->first.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temporary.getType())) { + temporaryHoisted = true; + } + } + + if (!temporaryHoisted) { + temporaryValuesInitFree = codeToInitializeTemporary(where); + } + + Stmt initializeTemporary = temporaryValuesInitFree[0]; + Stmt freeTemporary = temporaryValuesInitFree[1]; + + match(where.getConsumer(), + std::function([&](const AssignmentNode* op) { + if (op->lhs.getTensorVar().getOrder() > 0) { + whereTempsToResult[where.getTemporary()] = (const AccessNode *) op->lhs.ptr; + } + }) + ); + + Stmt consumer = lower(where.getConsumer()); + if (accelerateDenseWorkSpace && sortAccelerator) { + // We need to sort the indices array + Expr listOfIndices = tempToIndexList.at(temporary); + Expr listOfIndicesSize = tempToIndexListSize.at(temporary); + Expr sizeOfElt = ir::Sizeof::make(listOfIndices.type()); + Stmt sortCall = ir::Sort::make({listOfIndices, listOfIndicesSize, sizeOfElt}); + consumer = Block::make(sortCall, consumer); + } + + // Now that temporary allocations are hoisted, we always need to emit an initialization loop before entering the + // producer but only if there is no dense acceleration + if (util::contains(needCompute, temporary) && !isScalar(temporary.getType()) && !accelerateDenseWorkSpace) { + // TODO: We only actually need to do this if: + // 1) We use the temporary multiple times + // 2) The PRODUCER RHS is sparse(not full). (Guarantees that old values are overwritten before consuming) + + Expr p = Var::make("p" + temporary.getName(), Int()); + Expr values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Stmt zeroInit = Store::make(values, p, ir::Literal::zero(temporary.getType().getDataType())); + Stmt loopInit = For::make(p, 0, size, 1, zeroInit, LoopKind::Serial); + initializeTemporary = Block::make(initializeTemporary, loopInit); + } + + whereConsumers.push_back(consumer); + whereTemps.push_back(where.getTemporary()); + captureNextLocatePos = true; + + // don't apply atomics to producer TODO: mark specific assignments as atomic + bool restoreAtomicDepth = false; + if (markAssignsAtomicDepth > 0) { + markAssignsAtomicDepth--; + restoreAtomicDepth = true; + } + + Stmt producer = lower(where.getProducer()); + if (accelerateDenseWorkSpace) { + const Expr indexListSizeExpr = tempToIndexListSize.at(temporary); + const Stmt indexListSizeDecl = VarDecl::make(indexListSizeExpr, ir::Literal::make(0)); + initializeTemporary = Block::make(indexListSizeDecl, initializeTemporary); + } + + if (restoreAtomicDepth) { + markAssignsAtomicDepth++; + } + + whereConsumers.pop_back(); + whereTemps.pop_back(); + whereTempsToResult.erase(where.getTemporary()); + return Block::make(initializeTemporary, producer, markAssignsAtomicDepth > 0 ? capturedLocatePos : ir::Stmt(), consumer, freeTemporary); + } + + + } \ No newline at end of file diff --git a/src/lower/lowerer_impl_imperative.cpp b/src/lower/lowerer_impl_imperative.cpp index f370242db..86b4f713b 100644 --- a/src/lower/lowerer_impl_imperative.cpp +++ b/src/lower/lowerer_impl_imperative.cpp @@ -2202,6 +2202,7 @@ vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where } + // Returns true if the following conditions are met: // 1) The temporary is a dense vector // 2) There is only one value on the right hand side of the consumer diff --git a/test/tests-scheduling-eval.cpp b/test/tests-scheduling-eval.cpp index 3b56e0298..cfb08802c 100644 --- a/test/tests-scheduling-eval.cpp +++ b/test/tests-scheduling-eval.cpp @@ -27,8 +27,12 @@ void printToCout(IndexStmt stmt, Platform platform=c) { std::shared_ptr codegen = ir::CodeGen::init_default(cout, ir::CodeGen::ImplementationGen); ir::Stmt compute; switch (platform) { - case c: compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplC())); break; - case cuda: compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplCUDA())); break; + case c: + compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplC())); + break; + case cuda: + compute = lower(stmt, "compute", false, true, false, false, Lowerer(new LowererImplCUDA())); + break; } codegen->compile(compute, true); } @@ -441,7 +445,7 @@ TEST(scheduling_eval, test_spmvCPU_temp) { stmt = stmt.parallelize(i, ParallelUnit::CPUThread, OutputRaceStrategy::Atomics); //set_CUDA_codegen_enabled(1); - printToCout(stmt, Platform(cuda)); + printToCout(stmt, Platform(c)); y.compile(stmt); y.assemble(); @@ -455,6 +459,41 @@ TEST(scheduling_eval, test_spmvCPU_temp) { ASSERT_TENSOR_EQ(expected, y); } +TEST(scheduling_eval, spmvGPU_temp) { + int NUM_I = 1021/10; + int NUM_J = 1039/10; + float SPARSITY = .01; + Tensor A("A", {NUM_I, NUM_J}, CSR); + Tensor x("x", {NUM_J}, Format({Dense})); + Tensor y("y", {NUM_I}, Format({Dense})); + + srand(94353); + for (int i = 0; i < NUM_I; i++) { + for (int j = 0; j < NUM_J; j++) { + float rand_float = (float)rand()/(float)(RAND_MAX); + if (rand_float < SPARSITY) { + A.insert({i, j}, (double) ((int) (rand_float * 3 / SPARSITY))); + } + } + } + + for (int j = 0; j < NUM_J; j++) { + float rand_float = (float)rand()/(float)(RAND_MAX); + x.insert({j}, (double) ((int) (rand_float*3/SPARSITY))); + } + + x.pack(); + A.pack(); + IndexExpr precomputed = A(i, j) * x(j); + y(i) = precomputed; + + IndexStmt stmt = y.getAssignment().concretize(); + stmt = scheduleSpMVGPU(stmt, A, precomputed); + set_CUDA_codegen_enabled(1); + printToCout(stmt, Platform(cuda)); + +} + TEST(scheduling_eval, test_sptvCPU_temp) { if (should_use_CUDA_codegen()) { return; From d3d5696c8b2ffc7252fbb12728bfbf056762b336 Mon Sep 17 00:00:00 2001 From: Genghan Zhang <58754328+zhang677@users.noreply.github.com> Date: Tue, 15 Mar 2022 20:52:05 +0800 Subject: [PATCH 08/12] Delete cmake-build-debug directory --- .../.cmake/api/v1/query/cache-v2 | 0 .../.cmake/api/v1/query/cmakeFiles-v1 | 0 .../.cmake/api/v1/query/codemodel-v2 | 0 .../.cmake/api/v1/query/toolchains-v1 | 0 .../reply/cache-v2-b0bce09660420f4c8db0.json | 1439 ----------------- .../cmakeFiles-v1-3c94c8171e5a42c5d686.json | 334 ---- .../codemodel-v2-be224adb32a17dc42790.json | 205 --- ...irectory-.-Debug-80c35a89e71fcc05a0b4.json | 62 - ...ctory-apps-Debug-76fddd1453400e648719.json | 14 - ...mes_vector-Debug-0f9a8e629be7aed69a2d.json | 14 - ...ectory-src-Debug-b1ed034fe315973a00fc.json | 45 - ...ctory-test-Debug-451c0598f41488bb20b9.json | 14 - ...tory-tools-Debug-dbed3b70f7bdd5bb451e.json | 45 - ...target-src-Debug-962ca0d82f886e361309.json | 66 - ...arget-taco-Debug-8bd57ebc8160cc0fd5c9.json | 1279 --------------- ...taco-gtest-Debug-7947a6c84e487a4991f5.json | 155 -- ...-taco-test-Debug-739e70dd559657a4c531.json | 516 ------ ...-taco-tool-Debug-acb02dc48eac8b470300.json | 208 --- ...mes_vector-Debug-d42707e1cd9fd09d0efa.json | 166 -- .../toolchains-v1-0d3819654bbd2cf5f1ee.json | 88 - cmake-build-debug/CTestTestfile.cmake | 10 - .../Testing/Temporary/LastTest.log | 3 - cmake-build-debug/apps/CTestTestfile.cmake | 7 - .../tensor_times_vector/CTestTestfile.cmake | 6 - .../tensor_times_vector.cbp | 216 --- cmake-build-debug/include/taco/version.h | 24 - cmake-build-debug/src/CTestTestfile.cmake | 6 - cmake-build-debug/taco.cbp | 1119 ------------- cmake-build-debug/test/CTestTestfile.cmake | 490 ------ cmake-build-debug/tools/CTestTestfile.cmake | 6 - 30 files changed, 6537 deletions(-) delete mode 100644 cmake-build-debug/.cmake/api/v1/query/cache-v2 delete mode 100644 cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 delete mode 100644 cmake-build-debug/.cmake/api/v1/query/codemodel-v2 delete mode 100644 cmake-build-debug/.cmake/api/v1/query/toolchains-v1 delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json delete mode 100644 cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json delete mode 100644 cmake-build-debug/CTestTestfile.cmake delete mode 100644 cmake-build-debug/Testing/Temporary/LastTest.log delete mode 100644 cmake-build-debug/apps/CTestTestfile.cmake delete mode 100644 cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake delete mode 100644 cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp delete mode 100644 cmake-build-debug/include/taco/version.h delete mode 100644 cmake-build-debug/src/CTestTestfile.cmake delete mode 100644 cmake-build-debug/taco.cbp delete mode 100644 cmake-build-debug/test/CTestTestfile.cmake delete mode 100644 cmake-build-debug/tools/CTestTestfile.cmake diff --git a/cmake-build-debug/.cmake/api/v1/query/cache-v2 b/cmake-build-debug/.cmake/api/v1/query/cache-v2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 b/cmake-build-debug/.cmake/api/v1/query/cmakeFiles-v1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/cmake-build-debug/.cmake/api/v1/query/codemodel-v2 b/cmake-build-debug/.cmake/api/v1/query/codemodel-v2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/cmake-build-debug/.cmake/api/v1/query/toolchains-v1 b/cmake-build-debug/.cmake/api/v1/query/toolchains-v1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json b/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json deleted file mode 100644 index d5a18f526..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/cache-v2-b0bce09660420f4c8db0.json +++ /dev/null @@ -1,1439 +0,0 @@ -{ - "entries" : - [ - { - "name" : "CMAKE_ADDR2LINE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_ADDR2LINE-NOTFOUND" - }, - { - "name" : "CMAKE_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/ar" - }, - { - "name" : "CMAKE_BUILD_TYPE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." - } - ], - "type" : "STRING", - "value" : "Debug" - }, - { - "name" : "CMAKE_CACHEFILE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "This is the directory where this CMakeCache.txt was created" - } - ], - "type" : "INTERNAL", - "value" : "/Users/zhang/Desktop/taco/cmake-build-debug" - }, - { - "name" : "CMAKE_CACHE_MAJOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Major version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "3" - }, - { - "name" : "CMAKE_CACHE_MINOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Minor version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "21" - }, - { - "name" : "CMAKE_CACHE_PATCH_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Patch version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_CODEBLOCKS_COMPILER_ID", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Id string of the compiler for the CodeBlocks IDE. Automatically detected when left empty" - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CODEBLOCKS_EXECUTABLE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "The CodeBlocks executable" - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_CODEBLOCKS_EXECUTABLE-NOTFOUND" - }, - { - "name" : "CMAKE_CODEBLOCKS_MAKE_ARGUMENTS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Additional command line arguments when CodeBlocks invokes make. Enter e.g. -j to get parallel builds" - } - ], - "type" : "STRING", - "value" : "-j16" - }, - { - "name" : "CMAKE_COLOR_MAKEFILE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Enable/Disable color output during build." - } - ], - "type" : "BOOL", - "value" : "ON" - }, - { - "name" : "CMAKE_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake executable." - } - ], - "type" : "INTERNAL", - "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake" - }, - { - "name" : "CMAKE_CPACK_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to cpack program executable." - } - ], - "type" : "INTERNAL", - "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/cpack" - }, - { - "name" : "CMAKE_CTEST_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to ctest program executable." - } - ], - "type" : "INTERNAL", - "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/bin/ctest" - }, - { - "name" : "CMAKE_CXX_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "/usr/bin/g++" - }, - { - "name" : "CMAKE_CXX_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "-g" - }, - { - "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "-O3 -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_C_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "/usr/bin/gcc" - }, - { - "name" : "CMAKE_C_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "-g" - }, - { - "name" : "CMAKE_C_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_C_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "-O3 -DNDEBUG" - }, - { - "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_DLLTOOL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_DLLTOOL-NOTFOUND" - }, - { - "name" : "CMAKE_EXECUTABLE_FORMAT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Executable file format" - } - ], - "type" : "INTERNAL", - "value" : "MACHO" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Enable/Disable output of compile commands during generation." - } - ], - "type" : "BOOL", - "value" : "" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of external makefile project generator." - } - ], - "type" : "INTERNAL", - "value" : "CodeBlocks" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "CXX compiler system defined macros" - } - ], - "type" : "INTERNAL", - "value" : "__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_STDC_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__cpp_rtti;199711L;__cpp_exceptions;199711L;__cpp_threadsafe_static_init;200806L;__cpp_impl_destroying_delete;201806L;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__EXCEPTIONS;1;__GXX_RTTI;1;__DEPRECATED;1;__GNUG__;4;__GXX_WEAK__;1;__private_extern__;extern;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_GNU_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GLIBCXX_TYPE_INT_N_0;__int128;__GLIBCXX_BITSIZE_INT_N_0;128;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__cplusplus;199711L;__STDCPP_DEFAULT_NEW_ALIGNMENT__;16UL;__STDC_UTF_16__;1;__STDC_UTF_32__;1" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "CXX compiler system include directories" - } - ], - "type" : "INTERNAL", - "value" : "/usr/local/include;/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1;/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include;/Library/Developer/CommandLineTools/usr/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "C compiler system defined macros" - } - ], - "type" : "INTERNAL", - "value" : "__llvm__;1;__clang__;1;__clang_major__;11;__clang_minor__;0;__clang_patchlevel__;3;__clang_version__;\"11.0.3 (clang-1103.0.32.62)\";__GNUC_MINOR__;2;__GNUC_PATCHLEVEL__;1;__GNUC__;4;__GXX_ABI_VERSION;1002;__ATOMIC_RELAXED;0;__ATOMIC_CONSUME;1;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_SEQ_CST;5;__OPENCL_MEMORY_SCOPE_WORK_ITEM;0;__OPENCL_MEMORY_SCOPE_WORK_GROUP;1;__OPENCL_MEMORY_SCOPE_DEVICE;2;__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES;3;__OPENCL_MEMORY_SCOPE_SUB_GROUP;4;__PRAGMA_REDEFINE_EXTNAME;1;__VERSION__;\"4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.62)\";__OBJC_BOOL_IS_BOOL;0;__CONSTANT_CFSTRINGS__;1;__block;__attribute__((__blocks__(byref)));__BLOCKS__;1;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__LITTLE_ENDIAN__;1;_LP64;1;__LP64__;1;__CHAR_BIT__;8;__SCHAR_MAX__;127;__SHRT_MAX__;32767;__INT_MAX__;2147483647;__LONG_MAX__;9223372036854775807L;__LONG_LONG_MAX__;9223372036854775807LL;__WCHAR_MAX__;2147483647;__WINT_MAX__;2147483647;__INTMAX_MAX__;9223372036854775807L;__SIZE_MAX__;18446744073709551615UL;__UINTMAX_MAX__;18446744073709551615UL;__PTRDIFF_MAX__;9223372036854775807L;__INTPTR_MAX__;9223372036854775807L;__UINTPTR_MAX__;18446744073709551615UL;__SIZEOF_DOUBLE__;8;__SIZEOF_FLOAT__;4;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_LONG_LONG__;8;__SIZEOF_POINTER__;8;__SIZEOF_SHORT__;2;__SIZEOF_PTRDIFF_T__;8;__SIZEOF_SIZE_T__;8;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_INT128__;16;__INTMAX_TYPE__;long int;__INTMAX_FMTd__;\"ld\";__INTMAX_FMTi__;\"li\";__INTMAX_C_SUFFIX__;L;__UINTMAX_TYPE__;long unsigned int;__UINTMAX_FMTo__;\"lo\";__UINTMAX_FMTu__;\"lu\";__UINTMAX_FMTx__;\"lx\";__UINTMAX_FMTX__;\"lX\";__UINTMAX_C_SUFFIX__;UL;__INTMAX_WIDTH__;64;__PTRDIFF_TYPE__;long int;__PTRDIFF_FMTd__;\"ld\";__PTRDIFF_FMTi__;\"li\";__PTRDIFF_WIDTH__;64;__INTPTR_TYPE__;long int;__INTPTR_FMTd__;\"ld\";__INTPTR_FMTi__;\"li\";__INTPTR_WIDTH__;64;__SIZE_TYPE__;long unsigned int;__SIZE_FMTo__;\"lo\";__SIZE_FMTu__;\"lu\";__SIZE_FMTx__;\"lx\";__SIZE_FMTX__;\"lX\";__SIZE_WIDTH__;64;__WCHAR_TYPE__;int;__WCHAR_WIDTH__;32;__WINT_TYPE__;int;__WINT_WIDTH__;32;__SIG_ATOMIC_WIDTH__;32;__SIG_ATOMIC_MAX__;2147483647;__CHAR16_TYPE__;unsigned short;__CHAR32_TYPE__;unsigned int;__UINTMAX_WIDTH__;64;__UINTPTR_TYPE__;long unsigned int;__UINTPTR_FMTo__;\"lo\";__UINTPTR_FMTu__;\"lu\";__UINTPTR_FMTx__;\"lx\";__UINTPTR_FMTX__;\"lX\";__UINTPTR_WIDTH__;64;__FLT16_DENORM_MIN__;5.9604644775390625e-8F16;__FLT16_HAS_DENORM__;1;__FLT16_DIG__;3;__FLT16_DECIMAL_DIG__;5;__FLT16_EPSILON__;9.765625e-4F16;__FLT16_HAS_INFINITY__;1;__FLT16_HAS_QUIET_NAN__;1;__FLT16_MANT_DIG__;11;__FLT16_MAX_10_EXP__;4;__FLT16_MAX_EXP__;16;__FLT16_MAX__;6.5504e+4F16;__FLT16_MIN_10_EXP__;(-4);__FLT16_MIN_EXP__;(-13);__FLT16_MIN__;6.103515625e-5F16;__FLT_DENORM_MIN__;1.40129846e-45F;__FLT_HAS_DENORM__;1;__FLT_DIG__;6;__FLT_DECIMAL_DIG__;9;__FLT_EPSILON__;1.19209290e-7F;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__FLT_MANT_DIG__;24;__FLT_MAX_10_EXP__;38;__FLT_MAX_EXP__;128;__FLT_MAX__;3.40282347e+38F;__FLT_MIN_10_EXP__;(-37);__FLT_MIN_EXP__;(-125);__FLT_MIN__;1.17549435e-38F;__DBL_DENORM_MIN__;4.9406564584124654e-324;__DBL_HAS_DENORM__;1;__DBL_DIG__;15;__DBL_DECIMAL_DIG__;17;__DBL_EPSILON__;2.2204460492503131e-16;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_MAX_10_EXP__;308;__DBL_MAX_EXP__;1024;__DBL_MAX__;1.7976931348623157e+308;__DBL_MIN_10_EXP__;(-307);__DBL_MIN_EXP__;(-1021);__DBL_MIN__;2.2250738585072014e-308;__LDBL_DENORM_MIN__;3.64519953188247460253e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_DIG__;18;__LDBL_DECIMAL_DIG__;21;__LDBL_EPSILON__;1.08420217248550443401e-19L;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_MAX_10_EXP__;4932;__LDBL_MAX_EXP__;16384;__LDBL_MAX__;1.18973149535723176502e+4932L;__LDBL_MIN_10_EXP__;(-4931);__LDBL_MIN_EXP__;(-16381);__LDBL_MIN__;3.36210314311209350626e-4932L;__POINTER_WIDTH__;64;__BIGGEST_ALIGNMENT__;16;__INT8_TYPE__;signed char;__INT8_FMTd__;\"hhd\";__INT8_FMTi__;\"hhi\";__INT8_C_SUFFIX__; ;__INT16_TYPE__;short;__INT16_FMTd__;\"hd\";__INT16_FMTi__;\"hi\";__INT16_C_SUFFIX__; ;__INT32_TYPE__;int;__INT32_FMTd__;\"d\";__INT32_FMTi__;\"i\";__INT32_C_SUFFIX__; ;__INT64_TYPE__;long long int;__INT64_FMTd__;\"lld\";__INT64_FMTi__;\"lli\";__INT64_C_SUFFIX__;LL;__UINT8_TYPE__;unsigned char;__UINT8_FMTo__;\"hho\";__UINT8_FMTu__;\"hhu\";__UINT8_FMTx__;\"hhx\";__UINT8_FMTX__;\"hhX\";__UINT8_C_SUFFIX__; ;__UINT8_MAX__;255;__INT8_MAX__;127;__UINT16_TYPE__;unsigned short;__UINT16_FMTo__;\"ho\";__UINT16_FMTu__;\"hu\";__UINT16_FMTx__;\"hx\";__UINT16_FMTX__;\"hX\";__UINT16_C_SUFFIX__; ;__UINT16_MAX__;65535;__INT16_MAX__;32767;__UINT32_TYPE__;unsigned int;__UINT32_FMTo__;\"o\";__UINT32_FMTu__;\"u\";__UINT32_FMTx__;\"x\";__UINT32_FMTX__;\"X\";__UINT32_C_SUFFIX__;U;__UINT32_MAX__;4294967295U;__INT32_MAX__;2147483647;__UINT64_TYPE__;long long unsigned int;__UINT64_FMTo__;\"llo\";__UINT64_FMTu__;\"llu\";__UINT64_FMTx__;\"llx\";__UINT64_FMTX__;\"llX\";__UINT64_C_SUFFIX__;ULL;__UINT64_MAX__;18446744073709551615ULL;__INT64_MAX__;9223372036854775807LL;__INT_LEAST8_TYPE__;signed char;__INT_LEAST8_MAX__;127;__INT_LEAST8_FMTd__;\"hhd\";__INT_LEAST8_FMTi__;\"hhi\";__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST8_MAX__;255;__UINT_LEAST8_FMTo__;\"hho\";__UINT_LEAST8_FMTu__;\"hhu\";__UINT_LEAST8_FMTx__;\"hhx\";__UINT_LEAST8_FMTX__;\"hhX\";__INT_LEAST16_TYPE__;short;__INT_LEAST16_MAX__;32767;__INT_LEAST16_FMTd__;\"hd\";__INT_LEAST16_FMTi__;\"hi\";__UINT_LEAST16_TYPE__;unsigned short;__UINT_LEAST16_MAX__;65535;__UINT_LEAST16_FMTo__;\"ho\";__UINT_LEAST16_FMTu__;\"hu\";__UINT_LEAST16_FMTx__;\"hx\";__UINT_LEAST16_FMTX__;\"hX\";__INT_LEAST32_TYPE__;int;__INT_LEAST32_MAX__;2147483647;__INT_LEAST32_FMTd__;\"d\";__INT_LEAST32_FMTi__;\"i\";__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST32_MAX__;4294967295U;__UINT_LEAST32_FMTo__;\"o\";__UINT_LEAST32_FMTu__;\"u\";__UINT_LEAST32_FMTx__;\"x\";__UINT_LEAST32_FMTX__;\"X\";__INT_LEAST64_TYPE__;long long int;__INT_LEAST64_MAX__;9223372036854775807LL;__INT_LEAST64_FMTd__;\"lld\";__INT_LEAST64_FMTi__;\"lli\";__UINT_LEAST64_TYPE__;long long unsigned int;__UINT_LEAST64_MAX__;18446744073709551615ULL;__UINT_LEAST64_FMTo__;\"llo\";__UINT_LEAST64_FMTu__;\"llu\";__UINT_LEAST64_FMTx__;\"llx\";__UINT_LEAST64_FMTX__;\"llX\";__INT_FAST8_TYPE__;signed char;__INT_FAST8_MAX__;127;__INT_FAST8_FMTd__;\"hhd\";__INT_FAST8_FMTi__;\"hhi\";__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST8_MAX__;255;__UINT_FAST8_FMTo__;\"hho\";__UINT_FAST8_FMTu__;\"hhu\";__UINT_FAST8_FMTx__;\"hhx\";__UINT_FAST8_FMTX__;\"hhX\";__INT_FAST16_TYPE__;short;__INT_FAST16_MAX__;32767;__INT_FAST16_FMTd__;\"hd\";__INT_FAST16_FMTi__;\"hi\";__UINT_FAST16_TYPE__;unsigned short;__UINT_FAST16_MAX__;65535;__UINT_FAST16_FMTo__;\"ho\";__UINT_FAST16_FMTu__;\"hu\";__UINT_FAST16_FMTx__;\"hx\";__UINT_FAST16_FMTX__;\"hX\";__INT_FAST32_TYPE__;int;__INT_FAST32_MAX__;2147483647;__INT_FAST32_FMTd__;\"d\";__INT_FAST32_FMTi__;\"i\";__UINT_FAST32_TYPE__;unsigned int;__UINT_FAST32_MAX__;4294967295U;__UINT_FAST32_FMTo__;\"o\";__UINT_FAST32_FMTu__;\"u\";__UINT_FAST32_FMTx__;\"x\";__UINT_FAST32_FMTX__;\"X\";__INT_FAST64_TYPE__;long long int;__INT_FAST64_MAX__;9223372036854775807LL;__INT_FAST64_FMTd__;\"lld\";__INT_FAST64_FMTi__;\"lli\";__UINT_FAST64_TYPE__;long long unsigned int;__UINT_FAST64_MAX__;18446744073709551615ULL;__UINT_FAST64_FMTo__;\"llo\";__UINT_FAST64_FMTu__;\"llu\";__UINT_FAST64_FMTx__;\"llx\";__UINT_FAST64_FMTX__;\"llX\";__USER_LABEL_PREFIX__;_;__FINITE_MATH_ONLY__;0;__GNUC_STDC_INLINE__;1;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__CLANG_ATOMIC_BOOL_LOCK_FREE;2;__CLANG_ATOMIC_CHAR_LOCK_FREE;2;__CLANG_ATOMIC_CHAR16_T_LOCK_FREE;2;__CLANG_ATOMIC_CHAR32_T_LOCK_FREE;2;__CLANG_ATOMIC_WCHAR_T_LOCK_FREE;2;__CLANG_ATOMIC_SHORT_LOCK_FREE;2;__CLANG_ATOMIC_INT_LOCK_FREE;2;__CLANG_ATOMIC_LONG_LOCK_FREE;2;__CLANG_ATOMIC_LLONG_LOCK_FREE;2;__CLANG_ATOMIC_POINTER_LOCK_FREE;2;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__NO_INLINE__;1;__PIC__;2;__pic__;2;__FLT_EVAL_METHOD__;0;__FLT_RADIX__;2;__DECIMAL_DIG__;__LDBL_DECIMAL_DIG__;__SSP__;1;__nonnull;_Nonnull;__null_unspecified;_Null_unspecified;__nullable;_Nullable;__GCC_ASM_FLAG_OUTPUTS__;1;__code_model_small_;1;__amd64__;1;__amd64;1;__x86_64;1;__x86_64__;1;__core2;1;__core2__;1;__tune_core2__;1;__REGISTER_PREFIX__; ;__NO_MATH_INLINES;1;__FXSR__;1;__SSE4_1__;1;__SSSE3__;1;__SSE3__;1;__SSE2__;1;__SSE2_MATH__;1;__SSE__;1;__SSE_MATH__;1;__MMX__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16;1;__APPLE_CC__;6000;__APPLE__;1;__STDC_NO_THREADS__;1;OBJC_NEW_PROPERTIES;1;__apple_build_version__;11030032;__weak;__attribute__((objc_gc(weak)));__strong; ;__unsafe_unretained; ;__DYNAMIC__;1;__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;101500;__MACH__;1;__STDC__;1;__STDC_HOSTED__;1;__STDC_VERSION__;201112L;__STDC_UTF_16__;1;__STDC_UTF_32__;1" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "C compiler system include directories" - } - ], - "type" : "INTERNAL", - "value" : "/usr/local/include;/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include;/Library/Developer/CommandLineTools/usr/include;/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" - }, - { - "name" : "CMAKE_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator." - } - ], - "type" : "INTERNAL", - "value" : "Unix Makefiles" - }, - { - "name" : "CMAKE_GENERATOR_INSTANCE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Generator instance identifier." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator platform." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_TOOLSET", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator toolset." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_HOME_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Source directory with the top level CMakeLists.txt file for this project" - } - ], - "type" : "INTERNAL", - "value" : "/Users/zhang/Desktop/taco" - }, - { - "name" : "CMAKE_INSTALL_NAME_TOOL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/install_name_tool" - }, - { - "name" : "CMAKE_INSTALL_PREFIX", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install path prefix, prepended onto install directories." - } - ], - "type" : "PATH", - "value" : "/usr/local" - }, - { - "name" : "CMAKE_LINKER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/ld" - }, - { - "name" : "CMAKE_MAKE_PROGRAM", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/make" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_NM", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/nm" - }, - { - "name" : "CMAKE_NUMBER_OF_MAKEFILES", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "number of local generators" - } - ], - "type" : "INTERNAL", - "value" : "6" - }, - { - "name" : "CMAKE_OBJCOPY", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_OBJCOPY-NOTFOUND" - }, - { - "name" : "CMAKE_OBJDUMP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/objdump" - }, - { - "name" : "CMAKE_OSX_ARCHITECTURES", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build architectures for OSX" - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_OSX_DEPLOYMENT_TARGET", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_OSX_SYSROOT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "The product will be built against the headers and libraries located inside the indicated SDK." - } - ], - "type" : "PATH", - "value" : "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" - }, - { - "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Platform information initialized" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_PROJECT_DESCRIPTION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_HOMEPAGE_URL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "taco" - }, - { - "name" : "CMAKE_PROJECT_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "0.1" - }, - { - "name" : "CMAKE_PROJECT_VERSION_MAJOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "0" - }, - { - "name" : "CMAKE_PROJECT_VERSION_MINOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "1" - }, - { - "name" : "CMAKE_PROJECT_VERSION_PATCH", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_VERSION_TWEAK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/ranlib" - }, - { - "name" : "CMAKE_READELF", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_READELF-NOTFOUND" - }, - { - "name" : "CMAKE_ROOT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake installation." - } - ], - "type" : "INTERNAL", - "value" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SKIP_INSTALL_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_SKIP_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when using shared libraries." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STRIP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/strip" - }, - { - "name" : "CMAKE_UNAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "uname command" - } - ], - "type" : "INTERNAL", - "value" : "/usr/bin/uname" - }, - { - "name" : "CMAKE_VERBOSE_MAKEFILE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." - } - ], - "type" : "BOOL", - "value" : "FALSE" - }, - { - "name" : "COVERAGE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build with code coverage analysis" - } - ], - "type" : "BOOL", - "value" : "OFF" - }, - { - "name" : "CUDA", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build for NVIDIA GPU (CUDA must be preinstalled)" - } - ], - "type" : "BOOL", - "value" : "OFF" - }, - { - "name" : "GIT_EXECUTABLE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Git command line client" - } - ], - "type" : "FILEPATH", - "value" : "/usr/bin/git" - }, - { - "name" : "GIT_SUBMODULE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Check submodules during build" - } - ], - "type" : "BOOL", - "value" : "ON" - }, - { - "name" : "OPENMP", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build with OpenMP execution support" - } - ], - "type" : "BOOL", - "value" : "OFF" - }, - { - "name" : "OPTIMIZE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Optimization level" - } - ], - "type" : "STRING", - "value" : "-O3" - }, - { - "name" : "PYTHON", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build TACO for python environment" - } - ], - "type" : "BOOL", - "value" : "OFF" - }, - { - "name" : "ProcessorCount_cmd_sysctl", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "/usr/sbin/sysctl" - }, - { - "name" : "TACO_SHARED_LIBRARY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Build as a shared library" - } - ], - "type" : "BOOL", - "value" : "ON" - }, - { - "name" : "taco_BINARY_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "/Users/zhang/Desktop/taco/cmake-build-debug" - }, - { - "name" : "taco_IS_TOP_LEVEL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "ON" - }, - { - "name" : "taco_SOURCE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "/Users/zhang/Desktop/taco" - }, - { - "name" : "tensor_times_vector_BINARY_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "/Users/zhang/Desktop/taco/cmake-build-debug/apps/tensor_times_vector" - }, - { - "name" : "tensor_times_vector_IS_TOP_LEVEL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "OFF" - }, - { - "name" : "tensor_times_vector_SOURCE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "/Users/zhang/Desktop/taco/apps/tensor_times_vector" - } - ], - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json b/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json deleted file mode 100644 index 8f0973413..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/cmakeFiles-v1-3c94c8171e5a42c5d686.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "inputs" : - [ - { - "path" : "CMakeLists.txt" - }, - { - "isGenerated" : true, - "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeSystem.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeSystemSpecificInitialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Darwin-Initialize.cmake" - }, - { - "isGenerated" : true, - "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeCCompiler.cmake" - }, - { - "isGenerated" : true, - "path" : "cmake-build-debug/CMakeFiles/3.21.1/CMakeCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeSystemSpecificInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeGenericSystem.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeInitializeConfigs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Darwin.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/UnixPaths.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeFindCodeBlocks.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/ProcessorCount.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/AppleClang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/GNU.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-AppleClang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCXXInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/AppleClang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-AppleClang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/Platform/Apple-Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindGit.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/FindPackageMessage.cmake" - }, - { - "path" : "include/taco/version.h.in" - }, - { - "path" : "src/CMakeLists.txt" - }, - { - "path" : "test/CMakeLists.txt" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake" - }, - { - "path" : "test/expr_factory.cpp" - }, - { - "path" : "test/test-iteration_algebra.cpp" - }, - { - "path" : "test/test-typedcomponent-memory.cpp" - }, - { - "path" : "test/test.cpp" - }, - { - "path" : "test/test_properties.cpp" - }, - { - "path" : "test/test_tensors.cpp" - }, - { - "path" : "test/tests-api.cpp" - }, - { - "path" : "test/tests-copyprop.cpp" - }, - { - "path" : "test/tests-error.cpp" - }, - { - "path" : "test/tests-expr-reduction.cpp" - }, - { - "path" : "test/tests-expr.cpp" - }, - { - "path" : "test/tests-expr_storage.cpp" - }, - { - "path" : "test/tests-format-mm-permute.cpp" - }, - { - "path" : "test/tests-format.cpp" - }, - { - "path" : "test/tests-index.cpp" - }, - { - "path" : "test/tests-index_notation.cpp" - }, - { - "path" : "test/tests-indexexpr.cpp" - }, - { - "path" : "test/tests-indexstmt.cpp" - }, - { - "path" : "test/tests-io.cpp" - }, - { - "path" : "test/tests-lower.cpp" - }, - { - "path" : "test/tests-merge_lattice.cpp" - }, - { - "path" : "test/tests-parafac.cpp" - }, - { - "path" : "test/tests-qcd.cpp" - }, - { - "path" : "test/tests-regression.cpp" - }, - { - "path" : "test/tests-schedule-parser.cpp" - }, - { - "path" : "test/tests-scheduling-eval.cpp" - }, - { - "path" : "test/tests-scheduling.cpp" - }, - { - "path" : "test/tests-storage.cpp" - }, - { - "path" : "test/tests-storage_alloc.cpp" - }, - { - "path" : "test/tests-tensor.cpp" - }, - { - "path" : "test/tests-tensor_types.cpp" - }, - { - "path" : "test/tests-transformation.cpp" - }, - { - "path" : "test/tests-transpose.cpp" - }, - { - "path" : "test/tests-type.cpp" - }, - { - "path" : "test/tests-windowing.cpp" - }, - { - "path" : "test/tests-workspaces.cpp" - }, - { - "path" : "test/expr_factory.h" - }, - { - "path" : "test/op_factory.h" - }, - { - "path" : "test/test.h" - }, - { - "path" : "test/test_tensors.h" - }, - { - "path" : "tools/CMakeLists.txt" - }, - { - "path" : "apps/CMakeLists.txt" - }, - { - "path" : "apps/tensor_times_vector/CMakeLists.txt" - } - ], - "kind" : "cmakeFiles", - "paths" : - { - "build" : "/Users/zhang/Desktop/taco/cmake-build-debug", - "source" : "/Users/zhang/Desktop/taco" - }, - "version" : - { - "major" : 1, - "minor" : 0 - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json b/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json deleted file mode 100644 index 43a6470c5..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/codemodel-v2-be224adb32a17dc42790.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "configurations" : - [ - { - "directories" : - [ - { - "build" : ".", - "childIndexes" : - [ - 1, - 2, - 3, - 4 - ], - "hasInstallRule" : true, - "jsonFile" : "directory-.-Debug-80c35a89e71fcc05a0b4.json", - "minimumCMakeVersion" : - { - "string" : "3.4.0" - }, - "projectIndex" : 0, - "source" : ".", - "targetIndexes" : - [ - 0 - ] - }, - { - "build" : "src", - "hasInstallRule" : true, - "jsonFile" : "directory-src-Debug-b1ed034fe315973a00fc.json", - "minimumCMakeVersion" : - { - "string" : "3.4.0" - }, - "parentIndex" : 0, - "projectIndex" : 0, - "source" : "src", - "targetIndexes" : - [ - 1 - ] - }, - { - "build" : "test", - "jsonFile" : "directory-test-Debug-451c0598f41488bb20b9.json", - "minimumCMakeVersion" : - { - "string" : "3.4.0" - }, - "parentIndex" : 0, - "projectIndex" : 0, - "source" : "test", - "targetIndexes" : - [ - 2, - 3 - ] - }, - { - "build" : "tools", - "hasInstallRule" : true, - "jsonFile" : "directory-tools-Debug-dbed3b70f7bdd5bb451e.json", - "minimumCMakeVersion" : - { - "string" : "3.4.0" - }, - "parentIndex" : 0, - "projectIndex" : 0, - "source" : "tools", - "targetIndexes" : - [ - 4 - ] - }, - { - "build" : "apps", - "childIndexes" : - [ - 5 - ], - "jsonFile" : "directory-apps-Debug-76fddd1453400e648719.json", - "minimumCMakeVersion" : - { - "string" : "3.4.0" - }, - "parentIndex" : 0, - "projectIndex" : 0, - "source" : "apps" - }, - { - "build" : "apps/tensor_times_vector", - "jsonFile" : "directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json", - "minimumCMakeVersion" : - { - "string" : "2.8.12" - }, - "parentIndex" : 4, - "projectIndex" : 1, - "source" : "apps/tensor_times_vector", - "targetIndexes" : - [ - 5 - ] - } - ], - "name" : "Debug", - "projects" : - [ - { - "childIndexes" : - [ - 1 - ], - "directoryIndexes" : - [ - 0, - 1, - 2, - 3, - 4 - ], - "name" : "taco", - "targetIndexes" : - [ - 0, - 1, - 2, - 3, - 4 - ] - }, - { - "directoryIndexes" : - [ - 5 - ], - "name" : "tensor_times_vector", - "parentIndex" : 0, - "targetIndexes" : - [ - 5 - ] - } - ], - "targets" : - [ - { - "directoryIndex" : 0, - "id" : "src::@6890427a1f51a3e7e1df", - "jsonFile" : "target-src-Debug-962ca0d82f886e361309.json", - "name" : "src", - "projectIndex" : 0 - }, - { - "directoryIndex" : 1, - "id" : "taco::@145eef247bfb46b6828c", - "jsonFile" : "target-taco-Debug-8bd57ebc8160cc0fd5c9.json", - "name" : "taco", - "projectIndex" : 0 - }, - { - "directoryIndex" : 2, - "id" : "taco-gtest::@36f028580bb02cc8272a", - "jsonFile" : "target-taco-gtest-Debug-7947a6c84e487a4991f5.json", - "name" : "taco-gtest", - "projectIndex" : 0 - }, - { - "directoryIndex" : 2, - "id" : "taco-test::@36f028580bb02cc8272a", - "jsonFile" : "target-taco-test-Debug-739e70dd559657a4c531.json", - "name" : "taco-test", - "projectIndex" : 0 - }, - { - "directoryIndex" : 3, - "id" : "taco-tool::@b9a00e55f22b3d77656c", - "jsonFile" : "target-taco-tool-Debug-acb02dc48eac8b470300.json", - "name" : "taco-tool", - "projectIndex" : 0 - }, - { - "directoryIndex" : 5, - "id" : "tensor_times_vector::@83aeefedd7c945dabd1b", - "jsonFile" : "target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json", - "name" : "tensor_times_vector", - "projectIndex" : 1 - } - ] - } - ], - "kind" : "codemodel", - "paths" : - { - "build" : "/Users/zhang/Desktop/taco/cmake-build-debug", - "source" : "/Users/zhang/Desktop/taco" - }, - "version" : - { - "major" : 2, - "minor" : 3 - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json b/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json deleted file mode 100644 index 64637ec6a..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-.-Debug-80c35a89e71fcc05a0b4.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : - [ - "install" - ], - "files" : - [ - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 116, - "parent" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 188, - "parent" : 0 - } - ] - }, - "installers" : - [ - { - "backtrace" : 1, - "component" : "Unspecified", - "destination" : "include", - "paths" : - [ - { - "from" : "include", - "to" : "." - } - ], - "type" : "directory" - }, - { - "backtrace" : 2, - "component" : "Unspecified", - "destination" : "include/taco", - "paths" : - [ - "cmake-build-debug/include/taco/version.h" - ], - "type" : "file" - } - ], - "paths" : - { - "build" : ".", - "source" : "." - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json b/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json deleted file mode 100644 index 092b2af75..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-apps-Debug-76fddd1453400e648719.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : "apps", - "source" : "apps" - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json b/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json deleted file mode 100644 index a7df9e322..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-apps.tensor_times_vector-Debug-0f9a8e629be7aed69a2d.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : "apps/tensor_times_vector", - "source" : "apps/tensor_times_vector" - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json b/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json deleted file mode 100644 index 2146bf155..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-src-Debug-b1ed034fe315973a00fc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : - [ - "install" - ], - "files" : - [ - "src/CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 27, - "parent" : 0 - } - ] - }, - "installers" : - [ - { - "backtrace" : 1, - "component" : "Unspecified", - "destination" : "lib", - "paths" : - [ - "lib/libtaco.dylib" - ], - "targetId" : "taco::@145eef247bfb46b6828c", - "targetIndex" : 1, - "type" : "target" - } - ], - "paths" : - { - "build" : "src", - "source" : "src" - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json b/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json deleted file mode 100644 index 4826a5979..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-test-Debug-451c0598f41488bb20b9.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : "test", - "source" : "test" - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json b/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json deleted file mode 100644 index b6e3ae27d..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/directory-tools-Debug-dbed3b70f7bdd5bb451e.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : - [ - "install" - ], - "files" : - [ - "tools/CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 9, - "parent" : 0 - } - ] - }, - "installers" : - [ - { - "backtrace" : 1, - "component" : "Unspecified", - "destination" : "bin", - "paths" : - [ - "bin/taco" - ], - "targetId" : "taco-tool::@b9a00e55f22b3d77656c", - "targetIndex" : 4, - "type" : "target" - } - ], - "paths" : - { - "build" : "tools", - "source" : "tools" - } -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json b/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json deleted file mode 100644 index 287f3473d..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-src-Debug-962ca0d82f886e361309.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_custom_target" - ], - "files" : - [ - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 164, - "parent" : 0 - } - ] - }, - "id" : "src::@6890427a1f51a3e7e1df", - "name" : "src", - "paths" : - { - "build" : ".", - "source" : "." - }, - "sourceGroups" : - [ - { - "name" : "", - "sourceIndexes" : - [ - 0 - ] - }, - { - "name" : "CMake Rules", - "sourceIndexes" : - [ - 1 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "isGenerated" : true, - "path" : "cmake-build-debug/CMakeFiles/src", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 0, - "isGenerated" : true, - "path" : "cmake-build-debug/CMakeFiles/src.rule", - "sourceGroupIndex" : 1 - } - ], - "type" : "UTILITY" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json deleted file mode 100644 index 1f5481805..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-taco-Debug-8bd57ebc8160cc0fd5c9.json +++ /dev/null @@ -1,1279 +0,0 @@ -{ - "artifacts" : - [ - { - "path" : "lib/libtaco.dylib" - } - ], - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_library", - "install", - "add_definitions", - "include_directories" - ], - "files" : - [ - "src/CMakeLists.txt", - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 22, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 27, - "parent" : 0 - }, - { - "file" : 1 - }, - { - "command" : 2, - "file" : 1, - "line" : 48, - "parent" : 3 - }, - { - "command" : 2, - "file" : 1, - "line" : 73, - "parent" : 3 - }, - { - "command" : 2, - "file" : 1, - "line" : 47, - "parent" : 3 - }, - { - "command" : 3, - "file" : 1, - "line" : 112, - "parent" : 3 - }, - { - "command" : 3, - "file" : 0, - "line" : 21, - "parent" : 0 - } - ] - }, - "compileGroups" : - [ - { - "compileCommandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -fPIC" - } - ], - "defines" : - [ - { - "backtrace" : 4, - "define" : "TACO_ASSERTS" - }, - { - "backtrace" : 5, - "define" : "TACO_DARWIN" - }, - { - "backtrace" : 6, - "define" : "TACO_DEBUG" - }, - { - "define" : "taco_EXPORTS" - } - ], - "includes" : - [ - { - "backtrace" : 7, - "path" : "/Users/zhang/Desktop/taco/include" - }, - { - "backtrace" : 8, - "path" : "/Users/zhang/Desktop/taco/src" - } - ], - "language" : "CXX", - "sourceIndexes" : - [ - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159 - ] - } - ], - "id" : "taco::@145eef247bfb46b6828c", - "install" : - { - "destinations" : - [ - { - "backtrace" : 2, - "path" : "lib" - }, - { - "backtrace" : 2, - "path" : "lib" - } - ], - "prefix" : - { - "path" : "/usr/local" - } - }, - "link" : - { - "commandFragments" : - [ - { - "fragment" : "", - "role" : "flags" - } - ], - "language" : "CXX" - }, - "name" : "taco", - "nameOnDisk" : "libtaco.dylib", - "paths" : - { - "build" : "src", - "source" : "src" - }, - "sourceGroups" : - [ - { - "name" : "Header Files", - "sourceIndexes" : - [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87 - ] - }, - { - "name" : "Source Files", - "sourceIndexes" : - [ - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "path" : "include/taco/component.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/coordinate.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/cuda.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/error.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/format.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir_tags.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/taco_tensor_t.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/target.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/tensor.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/type.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/codegen/module.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/error/error_messages.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation_nodes.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation_nodes_abstract.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation_printer.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation_rewriter.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/index_notation_visitor.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/intrinsic.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/iteration_algebra.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/iteration_algebra_printer.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/kernel.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/properties.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/property_pointers.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/provenance_graph.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/schedule.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/tensor_operator.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/index_notation/transformations.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir_generators.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir_printer.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir_rewriter.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir_verifier.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/ir_visitor.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/simplify.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/ir/workspace_rewriter.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/iterator.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/lower.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/lowerer_impl.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/lowerer_impl_c.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/lowerer_impl_cuda.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/lowerer_impl_imperative.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/merge_lattice.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/mode.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/mode_format_compressed.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/mode_format_dense.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/mode_format_impl.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/lower/mode_format_singleton.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/parser/einsum_parser.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/parser/lexer.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/parser/parser.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/parser/schedule_parser.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/array.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/coordinate.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/file_io_mtx.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/file_io_rb.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/file_io_tns.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/index.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/pack.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/storage.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/typed_index.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/typed_value.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/storage/typed_vector.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/collections.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/comparable.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/env.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/files.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/fill.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/functions.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/intrusive_ptr.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/name_generator.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/printable.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/scopedmap.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/scopedset.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/singleton.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/strings.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/timers.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/uncopyable.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "include/taco/util/variadic.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/codegen/codegen.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/codegen/codegen_c.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/codegen/codegen_cuda.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/error/error_checks.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/lower/expr_tools.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/lower/iteration_forest.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/lower/iteration_graph.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/lower/mode_access.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "src/lower/tensor_path.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/cuda.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/error.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/format.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir_tags.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/taco_tensor_t.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/target.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/tensor.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/type.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/codegen/codegen.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/codegen/codegen_c.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/codegen/codegen_cuda.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/codegen/module.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/error/error_checks.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/error/error_messages.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation_nodes.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation_nodes_abstract.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation_printer.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation_rewriter.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/index_notation_visitor.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/intrinsic.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/iteration_algebra.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/iteration_algebra_printer.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/kernel.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/properties.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/property_pointers.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/provenance_graph.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/schedule.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/tensor_operator.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/index_notation/transformations.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir_generators.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir_printer.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir_rewriter.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir_verifier.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/ir_visitor.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/simplify.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/ir/workspace_rewriter.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/expr_tools.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/iteration_forest.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/iteration_graph.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/iterator.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/lower.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/lowerer_impl.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/lowerer_impl_c.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/lowerer_impl_cuda.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/lowerer_impl_imperative.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/merge_lattice.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode_access.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode_format_compressed.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode_format_dense.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode_format_impl.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/mode_format_singleton.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/lower/tensor_path.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/parser/einsum_parser.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/parser/lexer.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/parser/parser.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/parser/schedule_parser.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/array.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/file_io_mtx.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/file_io_rb.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/file_io_tns.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/index.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/pack.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/storage.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/typed_index.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/storage/typed_value.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/util/env.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/util/files.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/util/name_generator.cpp", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "src/util/strings.cpp", - "sourceGroupIndex" : 1 - } - ], - "type" : "SHARED_LIBRARY" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json deleted file mode 100644 index 2e29186c8..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-taco-gtest-Debug-7947a6c84e487a4991f5.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "archive" : {}, - "artifacts" : - [ - { - "path" : "lib/libtaco-gtest.a" - } - ], - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_library", - "add_definitions", - "include_directories" - ], - "files" : - [ - "test/CMakeLists.txt", - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 4, - "parent" : 0 - }, - { - "file" : 1 - }, - { - "command" : 1, - "file" : 1, - "line" : 48, - "parent" : 2 - }, - { - "command" : 1, - "file" : 1, - "line" : 73, - "parent" : 2 - }, - { - "command" : 1, - "file" : 1, - "line" : 47, - "parent" : 2 - }, - { - "command" : 2, - "file" : 1, - "line" : 112, - "parent" : 2 - }, - { - "command" : 2, - "file" : 0, - "line" : 3, - "parent" : 0 - } - ] - }, - "compileGroups" : - [ - { - "compileCommandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" - } - ], - "defines" : - [ - { - "backtrace" : 3, - "define" : "TACO_ASSERTS" - }, - { - "backtrace" : 4, - "define" : "TACO_DARWIN" - }, - { - "backtrace" : 5, - "define" : "TACO_DEBUG" - } - ], - "includes" : - [ - { - "backtrace" : 6, - "path" : "/Users/zhang/Desktop/taco/include" - }, - { - "backtrace" : 7, - "path" : "/Users/zhang/Desktop/taco/test" - }, - { - "backtrace" : 7, - "path" : "/Users/zhang/Desktop/taco/src" - } - ], - "language" : "CXX", - "sourceIndexes" : - [ - 1 - ] - } - ], - "id" : "taco-gtest::@36f028580bb02cc8272a", - "name" : "taco-gtest", - "nameOnDisk" : "libtaco-gtest.a", - "paths" : - { - "build" : "test", - "source" : "test" - }, - "sourceGroups" : - [ - { - "name" : "Header Files", - "sourceIndexes" : - [ - 0 - ] - }, - { - "name" : "Source Files", - "sourceIndexes" : - [ - 1 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "path" : "test/gtest/gtest.h", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/gtest/gtest-all.cc", - "sourceGroupIndex" : 1 - } - ], - "type" : "STATIC_LIBRARY" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json deleted file mode 100644 index 930a30200..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-taco-test-Debug-739e70dd559657a4c531.json +++ /dev/null @@ -1,516 +0,0 @@ -{ - "artifacts" : - [ - { - "path" : "bin/taco-test" - } - ], - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_executable", - "target_link_libraries", - "add_definitions", - "include_directories" - ], - "files" : - [ - "test/CMakeLists.txt", - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 10, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 11, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 12, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 13, - "parent" : 0 - }, - { - "file" : 1 - }, - { - "command" : 2, - "file" : 1, - "line" : 48, - "parent" : 5 - }, - { - "command" : 2, - "file" : 1, - "line" : 73, - "parent" : 5 - }, - { - "command" : 2, - "file" : 1, - "line" : 47, - "parent" : 5 - }, - { - "command" : 3, - "file" : 1, - "line" : 112, - "parent" : 5 - }, - { - "command" : 3, - "file" : 0, - "line" : 3, - "parent" : 0 - } - ] - }, - "compileGroups" : - [ - { - "compileCommandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" - } - ], - "defines" : - [ - { - "backtrace" : 6, - "define" : "TACO_ASSERTS" - }, - { - "backtrace" : 7, - "define" : "TACO_DARWIN" - }, - { - "backtrace" : 8, - "define" : "TACO_DEBUG" - } - ], - "includes" : - [ - { - "backtrace" : 9, - "path" : "/Users/zhang/Desktop/taco/include" - }, - { - "backtrace" : 10, - "path" : "/Users/zhang/Desktop/taco/test" - }, - { - "backtrace" : 10, - "path" : "/Users/zhang/Desktop/taco/src" - } - ], - "language" : "CXX", - "sourceIndexes" : - [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35 - ] - } - ], - "dependencies" : - [ - { - "backtrace" : 4, - "id" : "taco::@145eef247bfb46b6828c" - }, - { - "backtrace" : 2, - "id" : "taco-gtest::@36f028580bb02cc8272a" - } - ], - "id" : "taco-test::@36f028580bb02cc8272a", - "link" : - { - "commandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -Wno-missing-declarations -DTACO_TEST_DIR=\"/Users/zhang/Desktop/taco/test\" -g", - "role" : "flags" - }, - { - "fragment" : "", - "role" : "flags" - }, - { - "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", - "role" : "libraries" - }, - { - "backtrace" : 2, - "fragment" : "../lib/libtaco-gtest.a", - "role" : "libraries" - }, - { - "backtrace" : 3, - "fragment" : "-lpthread", - "role" : "libraries" - }, - { - "backtrace" : 4, - "fragment" : "../lib/libtaco.dylib", - "role" : "libraries" - } - ], - "language" : "CXX" - }, - "name" : "taco-test", - "nameOnDisk" : "taco-test", - "paths" : - { - "build" : "test", - "source" : "test" - }, - "sourceGroups" : - [ - { - "name" : "Source Files", - "sourceIndexes" : - [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35 - ] - }, - { - "name" : "Header Files", - "sourceIndexes" : - [ - 36, - 37, - 38, - 39 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/expr_factory.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/test-iteration_algebra.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/test-typedcomponent-memory.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/test.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/test_properties.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/test_tensors.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-api.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-copyprop.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-error.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-expr-reduction.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-expr.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-expr_storage.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-format-mm-permute.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-format.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-index.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-index_notation.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-indexexpr.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-indexstmt.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-io.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-lower.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-merge_lattice.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-parafac.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-qcd.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-regression.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-schedule-parser.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-scheduling-eval.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-scheduling.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-storage.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-storage_alloc.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-tensor.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-tensor_types.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-transformation.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-transpose.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-type.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-windowing.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "test/tests-workspaces.cpp", - "sourceGroupIndex" : 0 - }, - { - "backtrace" : 1, - "path" : "test/expr_factory.h", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "path" : "test/op_factory.h", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "path" : "test/test.h", - "sourceGroupIndex" : 1 - }, - { - "backtrace" : 1, - "path" : "test/test_tensors.h", - "sourceGroupIndex" : 1 - } - ], - "type" : "EXECUTABLE" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json b/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json deleted file mode 100644 index 9615007e2..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-taco-tool-Debug-acb02dc48eac8b470300.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "artifacts" : - [ - { - "path" : "bin/taco" - } - ], - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_executable", - "install", - "target_link_libraries", - "add_definitions", - "include_directories", - "target_include_directories" - ], - "files" : - [ - "tools/CMakeLists.txt", - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 5, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 9, - "parent" : 0 - }, - { - "command" : 2, - "file" : 0, - "line" : 6, - "parent" : 0 - }, - { - "file" : 1 - }, - { - "command" : 3, - "file" : 1, - "line" : 48, - "parent" : 4 - }, - { - "command" : 3, - "file" : 1, - "line" : 73, - "parent" : 4 - }, - { - "command" : 3, - "file" : 1, - "line" : 47, - "parent" : 4 - }, - { - "command" : 4, - "file" : 1, - "line" : 112, - "parent" : 4 - }, - { - "command" : 5, - "file" : 0, - "line" : 7, - "parent" : 0 - }, - { - "command" : 4, - "file" : 0, - "line" : 12, - "parent" : 0 - } - ] - }, - "compileGroups" : - [ - { - "compileCommandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" - } - ], - "defines" : - [ - { - "backtrace" : 5, - "define" : "TACO_ASSERTS" - }, - { - "backtrace" : 6, - "define" : "TACO_DARWIN" - }, - { - "backtrace" : 7, - "define" : "TACO_DEBUG" - } - ], - "includes" : - [ - { - "backtrace" : 8, - "path" : "/Users/zhang/Desktop/taco/include" - }, - { - "backtrace" : 9, - "path" : "/Users/zhang/Desktop/taco/cmake-build-debug/include" - }, - { - "backtrace" : 10, - "path" : "/Users/zhang/Desktop/taco/src" - } - ], - "language" : "CXX", - "sourceIndexes" : - [ - 0 - ] - } - ], - "dependencies" : - [ - { - "backtrace" : 3, - "id" : "taco::@145eef247bfb46b6828c" - } - ], - "id" : "taco-tool::@b9a00e55f22b3d77656c", - "install" : - { - "destinations" : - [ - { - "backtrace" : 2, - "path" : "bin" - } - ], - "prefix" : - { - "path" : "/usr/local" - } - }, - "link" : - { - "commandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -g", - "role" : "flags" - }, - { - "fragment" : "", - "role" : "flags" - }, - { - "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", - "role" : "libraries" - }, - { - "backtrace" : 3, - "fragment" : "../lib/libtaco.dylib", - "role" : "libraries" - } - ], - "language" : "CXX" - }, - "name" : "taco-tool", - "nameOnDisk" : "taco", - "paths" : - { - "build" : "tools", - "source" : "tools" - }, - "sourceGroups" : - [ - { - "name" : "Source Files", - "sourceIndexes" : - [ - 0 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "tools/taco.cpp", - "sourceGroupIndex" : 0 - } - ], - "type" : "EXECUTABLE" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json b/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json deleted file mode 100644 index 5ce481427..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/target-tensor_times_vector-Debug-d42707e1cd9fd09d0efa.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "artifacts" : - [ - { - "path" : "bin/taco-tensor_times_vector" - } - ], - "backtrace" : 1, - "backtraceGraph" : - { - "commands" : - [ - "add_executable", - "target_link_libraries", - "add_definitions", - "include_directories" - ], - "files" : - [ - "apps/tensor_times_vector/CMakeLists.txt", - "CMakeLists.txt" - ], - "nodes" : - [ - { - "file" : 0 - }, - { - "command" : 0, - "file" : 0, - "line" : 9, - "parent" : 0 - }, - { - "command" : 1, - "file" : 0, - "line" : 22, - "parent" : 0 - }, - { - "file" : 1 - }, - { - "command" : 2, - "file" : 1, - "line" : 48, - "parent" : 3 - }, - { - "command" : 2, - "file" : 1, - "line" : 73, - "parent" : 3 - }, - { - "command" : 2, - "file" : 1, - "line" : 47, - "parent" : 3 - }, - { - "command" : 3, - "file" : 1, - "line" : 112, - "parent" : 3 - } - ] - }, - "compileGroups" : - [ - { - "compileCommandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -std=c++11 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk" - } - ], - "defines" : - [ - { - "backtrace" : 4, - "define" : "TACO_ASSERTS" - }, - { - "backtrace" : 5, - "define" : "TACO_DARWIN" - }, - { - "backtrace" : 6, - "define" : "TACO_DEBUG" - } - ], - "includes" : - [ - { - "backtrace" : 7, - "path" : "/Users/zhang/Desktop/taco/include" - } - ], - "language" : "CXX", - "sourceIndexes" : - [ - 0 - ] - } - ], - "dependencies" : - [ - { - "backtrace" : 2, - "id" : "taco::@145eef247bfb46b6828c" - } - ], - "id" : "tensor_times_vector::@83aeefedd7c945dabd1b", - "link" : - { - "commandFragments" : - [ - { - "fragment" : "-Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -Woverloaded-virtual -pedantic-errors -Wno-deprecated -std=c++14 -std=c++11 -g", - "role" : "flags" - }, - { - "fragment" : "", - "role" : "flags" - }, - { - "fragment" : "-Wl,-rpath,/Users/zhang/Desktop/taco/cmake-build-debug/lib", - "role" : "libraries" - }, - { - "backtrace" : 2, - "fragment" : "../../lib/libtaco.dylib", - "role" : "libraries" - } - ], - "language" : "CXX" - }, - "name" : "tensor_times_vector", - "nameOnDisk" : "taco-tensor_times_vector", - "paths" : - { - "build" : "apps/tensor_times_vector", - "source" : "apps/tensor_times_vector" - }, - "sourceGroups" : - [ - { - "name" : "Source Files", - "sourceIndexes" : - [ - 0 - ] - } - ], - "sources" : - [ - { - "backtrace" : 1, - "compileGroupIndex" : 0, - "path" : "apps/tensor_times_vector/tensor_times_vector.cpp", - "sourceGroupIndex" : 0 - } - ], - "type" : "EXECUTABLE" -} diff --git a/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json b/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json deleted file mode 100644 index d0a81dddd..000000000 --- a/cmake-build-debug/.cmake/api/v1/reply/toolchains-v1-0d3819654bbd2cf5f1ee.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "kind" : "toolchains", - "toolchains" : - [ - { - "compiler" : - { - "id" : "AppleClang", - "implicit" : - { - "includeDirectories" : - [ - "/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include", - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include", - "/Library/Developer/CommandLineTools/usr/include" - ], - "linkDirectories" : - [ - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib" - ], - "linkFrameworkDirectories" : - [ - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks" - ], - "linkLibraries" : [] - }, - "path" : "/usr/bin/gcc", - "version" : "11.0.3.11030032" - }, - "language" : "C", - "sourceFileExtensions" : - [ - "c", - "m" - ] - }, - { - "compiler" : - { - "id" : "AppleClang", - "implicit" : - { - "includeDirectories" : - [ - "/Library/Developer/CommandLineTools/usr/include/c++/v1", - "/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include", - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include", - "/Library/Developer/CommandLineTools/usr/include" - ], - "linkDirectories" : - [ - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib" - ], - "linkFrameworkDirectories" : - [ - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks" - ], - "linkLibraries" : - [ - "c++" - ] - }, - "path" : "/usr/bin/g++", - "version" : "11.0.3.11030032" - }, - "language" : "CXX", - "sourceFileExtensions" : - [ - "C", - "M", - "c++", - "cc", - "cpp", - "cxx", - "mm", - "mpp", - "CPP", - "ixx", - "cppm" - ] - } - ], - "version" : - { - "major" : 1, - "minor" : 0 - } -} diff --git a/cmake-build-debug/CTestTestfile.cmake b/cmake-build-debug/CTestTestfile.cmake deleted file mode 100644 index 59035db9e..000000000 --- a/cmake-build-debug/CTestTestfile.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -subdirs("src") -subdirs("test") -subdirs("tools") -subdirs("apps") diff --git a/cmake-build-debug/Testing/Temporary/LastTest.log b/cmake-build-debug/Testing/Temporary/LastTest.log deleted file mode 100644 index a9c1e3e2f..000000000 --- a/cmake-build-debug/Testing/Temporary/LastTest.log +++ /dev/null @@ -1,3 +0,0 @@ -Start testing: Mar 15 20:46 CST ----------------------------------------------------------- -End testing: Mar 15 20:46 CST diff --git a/cmake-build-debug/apps/CTestTestfile.cmake b/cmake-build-debug/apps/CTestTestfile.cmake deleted file mode 100644 index e9af891dd..000000000 --- a/cmake-build-debug/apps/CTestTestfile.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco/apps -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/apps -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -subdirs("tensor_times_vector") diff --git a/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake b/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake deleted file mode 100644 index f291c9825..000000000 --- a/cmake-build-debug/apps/tensor_times_vector/CTestTestfile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco/apps/tensor_times_vector -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/apps/tensor_times_vector -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. diff --git a/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp b/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp deleted file mode 100644 index 9834b05b6..000000000 --- a/cmake-build-debug/apps/tensor_times_vector/tensor_times_vector.cbp +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - diff --git a/cmake-build-debug/include/taco/version.h b/cmake-build-debug/include/taco/version.h deleted file mode 100644 index c71ee467e..000000000 --- a/cmake-build-debug/include/taco/version.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef TACO_VERSION_H -#define TACO_VERSION_H - -// This file contains version/config info, gathered at cmake config time. - -#define TACO_BUILD_TYPE "Debug" -#define TACO_BUILD_DATE "2022-03-15" - -#define TACO_BUILD_COMPILER_ID "AppleClang" -#define TACO_BUILD_COMPILER_VERSION "11.0.3.11030032" - -#define TACO_VERSION_MAJOR "0" -#define TACO_VERSION_MINOR "1" -// if taco starts using a patch number, add here -// if taco starts using a tweak number, add here - -// For non-git builds, this will be an empty string. -#define TACO_VERSION_GIT_SHORTHASH "7ac49474" - -#define TACO_FEATURE_OPENMP 0 -#define TACO_FEATURE_PYTHON 0 -#define TACO_FEATURE_CUDA 0 - -#endif /* TACO_VERSION_H */ diff --git a/cmake-build-debug/src/CTestTestfile.cmake b/cmake-build-debug/src/CTestTestfile.cmake deleted file mode 100644 index 04f02e46c..000000000 --- a/cmake-build-debug/src/CTestTestfile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco/src -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/src -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. diff --git a/cmake-build-debug/taco.cbp b/cmake-build-debug/taco.cbp deleted file mode 100644 index f155f89ff..000000000 --- a/cmake-build-debug/taco.cbp +++ /dev/null @@ -1,1119 +0,0 @@ - - - - - - diff --git a/cmake-build-debug/test/CTestTestfile.cmake b/cmake-build-debug/test/CTestTestfile.cmake deleted file mode 100644 index 118a27fa6..000000000 --- a/cmake-build-debug/test/CTestTestfile.cmake +++ /dev/null @@ -1,490 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco/test -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/test -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -add_test(iteration_algebra.region "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.region") -set_tests_properties(iteration_algebra.region PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.Complement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Complement") -set_tests_properties(iteration_algebra.Complement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.Union "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Union") -set_tests_properties(iteration_algebra.Union PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.Intersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.Intersect") -set_tests_properties(iteration_algebra.Intersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.comparatorRegion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorRegion") -set_tests_properties(iteration_algebra.comparatorRegion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.comparatorComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorComplement") -set_tests_properties(iteration_algebra.comparatorComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.comparatorIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorIntersect") -set_tests_properties(iteration_algebra.comparatorIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.comparatorUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorUnion") -set_tests_properties(iteration_algebra.comparatorUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.comparatorMix "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.comparatorMix") -set_tests_properties(iteration_algebra.comparatorMix PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.deMorganRegion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganRegion") -set_tests_properties(iteration_algebra.deMorganRegion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.deMorganComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganComplement") -set_tests_properties(iteration_algebra.deMorganComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.DeMorganNestedComplements "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.DeMorganNestedComplements") -set_tests_properties(iteration_algebra.DeMorganNestedComplements PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.deMorganIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganIntersect") -set_tests_properties(iteration_algebra.deMorganIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.deMorganUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.deMorganUnion") -set_tests_properties(iteration_algebra.deMorganUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.UnionComplement "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.UnionComplement") -set_tests_properties(iteration_algebra.UnionComplement PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.flipUnionToIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.flipUnionToIntersect") -set_tests_properties(iteration_algebra.flipUnionToIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.flipIntersectToUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.flipIntersectToUnion") -set_tests_properties(iteration_algebra.flipIntersectToUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.hiddenIntersect "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.hiddenIntersect") -set_tests_properties(iteration_algebra.hiddenIntersect PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(iteration_algebra.hiddenUnion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=iteration_algebra.hiddenUnion") -set_tests_properties(iteration_algebra.hiddenUnion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(makecsr.access_past_pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=makecsr.access_past_pos") -set_tests_properties(makecsr.access_past_pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.annihilator "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.annihilator") -set_tests_properties(properties.annihilator PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.identity "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.identity") -set_tests_properties(properties.identity PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.associative "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.associative") -set_tests_properties(properties.associative PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.commutative "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.commutative") -set_tests_properties(properties.commutative PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.property_conversion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.property_conversion") -set_tests_properties(properties.property_conversion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(properties.findProperty "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=properties.findProperty") -set_tests_properties(properties.findProperty PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apiset.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiset.api/*") -set_tests_properties(*/apiset.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apiget.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiget.api/*") -set_tests_properties(*/apiget.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apiwrb.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiwrb.api/*") -set_tests_properties(*/apiwrb.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apiwmtx.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apiwmtx.api/*") -set_tests_properties(*/apiwmtx.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apitns.api/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apitns.api/*") -set_tests_properties(*/apitns.api/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_copy "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_copy") -set_tests_properties(expr.simplify_copy PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_copy_before_update "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_copy_before_update") -set_tests_properties(expr.simplify_copy_before_update PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_dont_copy_loop_dependent_var "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_dont_copy_loop_dependent_var") -set_tests_properties(expr.simplify_dont_copy_loop_dependent_var PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.expr_dimension_mismatch_freevar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.expr_dimension_mismatch_freevar") -set_tests_properties(error.expr_dimension_mismatch_freevar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.expr_dimension_mismatch_sumvar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.expr_dimension_mismatch_sumvar") -set_tests_properties(error.expr_dimension_mismatch_sumvar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.compile_without_expr "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compile_without_expr") -set_tests_properties(error.compile_without_expr PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.compile_tensor_name_collision "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compile_tensor_name_collision") -set_tests_properties(error.compile_tensor_name_collision PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.assemble_without_compile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.assemble_without_compile") -set_tests_properties(error.assemble_without_compile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(error.compute_without_compile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=error.compute_without_compile") -set_tests_properties(error.compute_without_compile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.reduction0 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.reduction0") -set_tests_properties(expr.reduction0 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.repeated_operand "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.repeated_operand") -set_tests_properties(expr.repeated_operand PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.accumulate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=expr.DISABLED_accumulate") -set_tests_properties(expr.accumulate PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.sub "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.sub") -set_tests_properties(expr.sub PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_neg "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_neg") -set_tests_properties(expr.simplify_neg PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_elmul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_elmul") -set_tests_properties(expr.simplify_elmul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_add") -set_tests_properties(expr.simplify_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_addmul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_addmul") -set_tests_properties(expr.simplify_addmul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.simplify_muladd "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.simplify_muladd") -set_tests_properties(expr.simplify_muladd PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.scalarops "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.scalarops") -set_tests_properties(expr.scalarops PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.redefine "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.redefine") -set_tests_properties(expr.redefine PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.indexVarSimple "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.indexVarSimple") -set_tests_properties(expr.indexVarSimple PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(expr.indexVarMix "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=expr.indexVarMix") -set_tests_properties(expr.indexVarMix PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/expr.storage/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/expr.storage/*") -set_tests_properties(*/expr.storage/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(format.mm_permute_formats "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=format.DISABLED_mm_permute_formats") -set_tests_properties(format.mm_permute_formats PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/format.pack/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/format.pack/*") -set_tests_properties(*/format.pack/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(format.sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=format.sparse") -set_tests_properties(format.sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(format.dense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=format.dense") -set_tests_properties(format.dense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(index.size "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=index.size") -set_tests_properties(index.size PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(index.makeCSR "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=index.makeCSR") -set_tests_properties(index.makeCSR PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.isEinsumNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isEinsumNotation") -set_tests_properties(notation.isEinsumNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.isReductionNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isReductionNotation") -set_tests_properties(notation.isReductionNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.isConcreteNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isConcreteNotation") -set_tests_properties(notation.isConcreteNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.makeReductionNotation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.makeReductionNotation") -set_tests_properties(notation.makeReductionNotation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.isomorphic "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.isomorphic") -set_tests_properties(notation.isomorphic PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.generatePackCOOStmt "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.generatePackCOOStmt") -set_tests_properties(notation.generatePackCOOStmt PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/concrete.notation/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/concrete.notation/*") -set_tests_properties(*/concrete.notation/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(notation.funcIsomorphic "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=notation.funcIsomorphic") -set_tests_properties(notation.funcIsomorphic PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.access") -set_tests_properties(indexexpr.access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.literal "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.literal") -set_tests_properties(indexexpr.literal PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.neg "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.neg") -set_tests_properties(indexexpr.neg PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.add") -set_tests_properties(indexexpr.add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.sub "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.sub") -set_tests_properties(indexexpr.sub PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.mul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.mul") -set_tests_properties(indexexpr.mul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.div "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.div") -set_tests_properties(indexexpr.div PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexexpr.indexvar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexexpr.indexvar") -set_tests_properties(indexexpr.indexvar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.assignment "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.assignment") -set_tests_properties(indexstmt.assignment PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.forall "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.forall") -set_tests_properties(indexstmt.forall PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.where "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.where") -set_tests_properties(indexstmt.where PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.multi "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.multi") -set_tests_properties(indexstmt.multi PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.sequence "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.sequence") -set_tests_properties(indexstmt.sequence PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(indexstmt.spmm "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=indexstmt.spmm") -set_tests_properties(indexstmt.spmm PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.tns "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.tns") -set_tests_properties(io.tns PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.mtx "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.mtx") -set_tests_properties(io.mtx PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.tensor "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.tensor") -set_tests_properties(io.tensor PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.ttxdense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.ttxdense") -set_tests_properties(io.ttxdense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.ttxsparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.ttxsparse") -set_tests_properties(io.ttxsparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(io.mtxsymmetric "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=io.mtxsymmetric") -set_tests_properties(io.mtxsymmetric PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/lower.compile/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/lower.compile/*") -set_tests_properties(*/lower.compile/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/merge_lattice.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/merge_lattice.test/*") -set_tests_properties(*/merge_lattice.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.split "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split") -set_tests_properties(merge_lattice.split PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.split_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split_sparse") -set_tests_properties(merge_lattice.split_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.dense_tile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.dense_tile") -set_tests_properties(merge_lattice.dense_tile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.pos") -set_tests_properties(merge_lattice.pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.pos_mul_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.pos_mul_sparse") -set_tests_properties(merge_lattice.pos_mul_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(merge_lattice.split_pos_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=merge_lattice.split_pos_sparse") -set_tests_properties(merge_lattice.split_pos_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/parafac.eval/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/parafac.eval/*") -set_tests_properties(*/parafac.eval/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(qcd.mul0 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul0") -set_tests_properties(qcd.mul0 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(qcd.mul1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul1") -set_tests_properties(qcd.mul1 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(qcd.mul2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=qcd.mul2") -set_tests_properties(qcd.mul2 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(qcd.mul3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_qcd.mul3") -set_tests_properties(qcd.mul3 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(schedule_parser.normal_operation "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule_parser.normal_operation") -set_tests_properties(schedule_parser.normal_operation PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(schedule_parser.error_reporting "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule_parser.error_reporting") -set_tests_properties(schedule_parser.error_reporting PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.test_spmvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_spmvCPU_temp") -set_tests_properties(scheduling_eval.test_spmvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmvGPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvGPU_temp") -set_tests_properties(scheduling_eval.spmvGPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.test_sptvCPU_temp "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.test_sptvCPU_temp") -set_tests_properties(scheduling_eval.test_sptvCPU_temp PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.example_spmvCPU_splitpos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.example_spmvCPU_splitpos") -set_tests_properties(scheduling_eval.example_spmvCPU_splitpos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmCPU") -set_tests_properties(scheduling_eval.spmmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/spgemm.scheduling_eval/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/spgemm.scheduling_eval/*") -set_tests_properties(*/spgemm.scheduling_eval/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmataddCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmataddCPU") -set_tests_properties(scheduling_eval.spmataddCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.sptenaddCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sptenaddCPU") -set_tests_properties(scheduling_eval.sptenaddCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.sddmmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sddmmCPU") -set_tests_properties(scheduling_eval.sddmmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmvCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvCPU") -set_tests_properties(scheduling_eval.spmvCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.precompute2D "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.precompute2D") -set_tests_properties(scheduling_eval.precompute2D PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.precompute1D "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.precompute1D") -set_tests_properties(scheduling_eval.precompute1D PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.ttvCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvCPU") -set_tests_properties(scheduling_eval.ttvCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.ttvCPU_CSR "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvCPU_CSR") -set_tests_properties(scheduling_eval.ttvCPU_CSR PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.ttmCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttmCPU") -set_tests_properties(scheduling_eval.ttmCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.mttkrpCPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.mttkrpCPU") -set_tests_properties(scheduling_eval.mttkrpCPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmvGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmvGPU") -set_tests_properties(scheduling_eval.spmvGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmGPU") -set_tests_properties(scheduling_eval.spmmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.spmmDCSRGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.spmmDCSRGPU") -set_tests_properties(scheduling_eval.spmmDCSRGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.sddmmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.sddmmGPU") -set_tests_properties(scheduling_eval.sddmmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.ttmGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttmGPU") -set_tests_properties(scheduling_eval.ttmGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.ttvGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.ttvGPU") -set_tests_properties(scheduling_eval.ttvGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.mttkrpGPU "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.mttkrpGPU") -set_tests_properties(scheduling_eval.mttkrpGPU PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.indexVarSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval.indexVarSplit") -set_tests_properties(scheduling_eval.indexVarSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(generate_evaluation_files.cpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_evaluation_files.DISABLED_cpu") -set_tests_properties(generate_evaluation_files.cpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(generate_evaluation_files.gpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_evaluation_files.DISABLED_gpu") -set_tests_properties(generate_evaluation_files.gpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(generate_figures.cpu "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=generate_figures.DISABLED_cpu") -set_tests_properties(generate_figures.cpu PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval.bfsPullScheduled "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=scheduling_eval.DISABLED_bfsPullScheduled") -set_tests_properties(scheduling_eval.bfsPullScheduled PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.splitEquality "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.splitEquality") -set_tests_properties(scheduling.splitEquality PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.forallReplace "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.forallReplace") -set_tests_properties(scheduling.forallReplace PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.splitIndexStmt "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.splitIndexStmt") -set_tests_properties(scheduling.splitIndexStmt PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.fuseDenseLoops "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.fuseDenseLoops") -set_tests_properties(scheduling.fuseDenseLoops PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerDenseMatrixMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerDenseMatrixMul") -set_tests_properties(scheduling.lowerDenseMatrixMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerSparseCopy "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseCopy") -set_tests_properties(scheduling.lowerSparseCopy PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerSparseMulDense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMulDense") -set_tests_properties(scheduling.lowerSparseMulDense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerSparseMulSparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMulSparse") -set_tests_properties(scheduling.lowerSparseMulSparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.precomputeIndependentIndexVars "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.precomputeIndependentIndexVars") -set_tests_properties(scheduling.precomputeIndependentIndexVars PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.precomputeIndependentIndexVarsSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.precomputeIndependentIndexVarsSplit") -set_tests_properties(scheduling.precomputeIndependentIndexVarsSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerSparseAddSparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseAddSparse") -set_tests_properties(scheduling.lowerSparseAddSparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.lowerSparseMatrixMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.lowerSparseMatrixMul") -set_tests_properties(scheduling.lowerSparseMatrixMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.parallelizeAtomicReduction "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.parallelizeAtomicReduction") -set_tests_properties(scheduling.parallelizeAtomicReduction PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.parallelizeTemporaryReduction "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.parallelizeTemporaryReduction") -set_tests_properties(scheduling.parallelizeTemporaryReduction PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.multilevel_tiling "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.multilevel_tiling") -set_tests_properties(scheduling.multilevel_tiling PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_noop "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_noop") -set_tests_properties(scheduling.pos_noop PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_mul_dense "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_dense") -set_tests_properties(scheduling.pos_mul_dense PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_mul_sparse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_sparse") -set_tests_properties(scheduling.pos_mul_sparse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_mul_dense_split "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_mul_dense_split") -set_tests_properties(scheduling.pos_mul_dense_split PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_tile_coord_and_pos "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_tile_coord_and_pos") -set_tests_properties(scheduling.pos_tile_coord_and_pos PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.spmv_warp_per_row "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.spmv_warp_per_row") -set_tests_properties(scheduling.spmv_warp_per_row PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.dense_pos_error "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.dense_pos_error") -set_tests_properties(scheduling.dense_pos_error PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_var_not_in_access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_var_not_in_access") -set_tests_properties(scheduling.pos_var_not_in_access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.pos_wrong_access "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.pos_wrong_access") -set_tests_properties(scheduling.pos_wrong_access PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval_test.spmv_fuse "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.spmv_fuse") -set_tests_properties(scheduling_eval_test.spmv_fuse PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval_test.indexVarSplit "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.indexVarSplit") -set_tests_properties(scheduling_eval_test.indexVarSplit PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling_eval_test.indexVarReorder "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling_eval_test.indexVarReorder") -set_tests_properties(scheduling_eval_test.indexVarReorder PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(scheduling.divide "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=scheduling.divide") -set_tests_properties(scheduling.divide PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/storage.pack/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/storage.pack/*") -set_tests_properties(*/storage.pack/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/alloc.storage/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/alloc.storage/*") -set_tests_properties(*/alloc.storage/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.double_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.double_scalar") -set_tests_properties(tensor.double_scalar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.double_vector "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.double_vector") -set_tests_properties(tensor.double_vector PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.iterate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.iterate") -set_tests_properties(tensor.iterate PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.iterate_empty "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.iterate_empty") -set_tests_properties(tensor.iterate_empty PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.duplicates "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.duplicates") -set_tests_properties(tensor.duplicates PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.duplicates_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.duplicates_scalar") -set_tests_properties(tensor.duplicates_scalar PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.scalar_type_correct "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.scalar_type_correct") -set_tests_properties(tensor.scalar_type_correct PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.non_zero_fill "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.non_zero_fill") -set_tests_properties(tensor.non_zero_fill PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.transpose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.transpose") -set_tests_properties(tensor.transpose PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.operator_parens_insertion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.operator_parens_insertion") -set_tests_properties(tensor.operator_parens_insertion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.get_value "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.get_value") -set_tests_properties(tensor.get_value PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.set_from_components "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.set_from_components") -set_tests_properties(tensor.set_from_components PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.hidden_pack "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.hidden_pack") -set_tests_properties(tensor.hidden_pack PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.automatic_pack_before_iteration "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.automatic_pack_before_iteration") -set_tests_properties(tensor.automatic_pack_before_iteration PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.automatic_pack_before_const_iteration "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.automatic_pack_before_const_iteration") -set_tests_properties(tensor.automatic_pack_before_const_iteration PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.hidden_compiler_methods "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.hidden_compiler_methods") -set_tests_properties(tensor.hidden_compiler_methods PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.explicit_compiler_methods "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.explicit_compiler_methods") -set_tests_properties(tensor.explicit_compiler_methods PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.computation_dependency_modification "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.computation_dependency_modification") -set_tests_properties(tensor.computation_dependency_modification PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.old_dependency_modification "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.old_dependency_modification") -set_tests_properties(tensor.old_dependency_modification PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.skip_recompile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.skip_recompile") -set_tests_properties(tensor.skip_recompile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.recompile "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.recompile") -set_tests_properties(tensor.recompile PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor.cache "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor.cache") -set_tests_properties(tensor.cache PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/ScalarTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/ScalarTensorTest.types/*") -set_tests_properties(*/ScalarTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/ScalarValueTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/ScalarValueTensorTest.types/*") -set_tests_properties(*/ScalarValueTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/VectorTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/VectorTensorTest.types/*") -set_tests_properties(*/VectorTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/IterateTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/IterateTensorTest.types/*") -set_tests_properties(*/IterateTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/AddTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/AddTensorTest.types/*") -set_tests_properties(*/AddTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/MulTensorTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/MulTensorTest.types/*") -set_tests_properties(*/MulTensorTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.complex_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_add") -set_tests_properties(tensor_types.complex_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.complex_mul_complex "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_mul_complex") -set_tests_properties(tensor_types.complex_mul_complex PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.complex_mul_scalar "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_tensor_types.complex_mul_scalar") -set_tests_properties(tensor_types.complex_mul_scalar PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.complex_available_expr "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_available_expr") -set_tests_properties(tensor_types.complex_available_expr PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.complex_accumulate "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.complex_accumulate") -set_tests_properties(tensor_types.complex_accumulate PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.float_double_promotion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.float_double_promotion") -set_tests_properties(tensor_types.float_double_promotion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.int_float_promotion "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=tensor_types.int_float_promotion") -set_tests_properties(tensor_types.int_float_promotion PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(tensor_types.coordinate_types "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_tensor_types.coordinate_types") -set_tests_properties(tensor_types.coordinate_types PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/precondition.transformations/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/precondition.transformations/*") -set_tests_properties(*/precondition.transformations/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/apply.transformations/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/apply.transformations/*") -set_tests_properties(*/apply.transformations/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/reorderLoopsTopologically.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/reorderLoopsTopologically.test/*") -set_tests_properties(*/reorderLoopsTopologically.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/insertTemporaries.test/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/insertTemporaries.test/*") -set_tests_properties(*/insertTemporaries.test/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(schedule.workspace_spmspm "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=schedule.workspace_spmspm") -set_tests_properties(schedule.workspace_spmspm PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(lower.transpose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose") -set_tests_properties(lower.transpose PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(lower.transpose2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose2") -set_tests_properties(lower.transpose2 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(lower.transpose3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=DISABLED_lower.transpose3") -set_tests_properties(lower.transpose3 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(lower.denseIterationTranspose "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=lower.denseIterationTranspose") -set_tests_properties(lower.denseIterationTranspose PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/IntTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/IntTest.types/*") -set_tests_properties(*/IntTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/UIntTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/UIntTest.types/*") -set_tests_properties(*/UIntTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/FloatTest.types/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/FloatTest.types/*") -set_tests_properties(*/FloatTest.types/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(type.equality "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.equality") -set_tests_properties(type.equality PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(type.Dimension "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.Dimension") -set_tests_properties(type.Dimension PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(type.Shape "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.Shape") -set_tests_properties(type.Shape PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(type.TensorType "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=type.TensorType") -set_tests_properties(type.TensorType PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.mixIndexing "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.mixIndexing") -set_tests_properties(windowing.mixIndexing PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.boundsChecks "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.boundsChecks") -set_tests_properties(windowing.boundsChecks PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.sliceMultipleWays "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.sliceMultipleWays") -set_tests_properties(windowing.sliceMultipleWays PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/basic.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/basic.windowing/*") -set_tests_properties(*/basic.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/slicedOutput.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/slicedOutput.windowing/*") -set_tests_properties(*/slicedOutput.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/matrixMultiply.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/matrixMultiply.windowing/*") -set_tests_properties(*/matrixMultiply.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/workspace.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/workspace.windowing/*") -set_tests_properties(*/workspace.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.transformations "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.transformations") -set_tests_properties(windowing.transformations PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/assignment.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/assignment.windowing/*") -set_tests_properties(*/assignment.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/cuda.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/cuda.windowing/*") -set_tests_properties(*/cuda.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/stride.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/stride.windowing/*") -set_tests_properties(*/stride.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/indexSetVectors.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/indexSetVectors.windowing/*") -set_tests_properties(*/indexSetVectors.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(*/indexSetMatrices.windowing/* "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=*/indexSetMatrices.windowing/*") -set_tests_properties(*/indexSetMatrices.windowing/* PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.lhsIndexSet "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.lhsIndexSet") -set_tests_properties(windowing.lhsIndexSet PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(windowing.compoundAssign "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=windowing.compoundAssign") -set_tests_properties(windowing.compoundAssign PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_vecElemMul_NoTail "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_NoTail") -set_tests_properties(workspaces.tile_vecElemMul_NoTail PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_vecElemMul_Tail1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_Tail1") -set_tests_properties(workspaces.tile_vecElemMul_Tail1 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_vecElemMul_Tail2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_vecElemMul_Tail2") -set_tests_properties(workspaces.tile_vecElemMul_Tail2 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_denseMatMul "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_denseMatMul") -set_tests_properties(workspaces.tile_denseMatMul PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute2D_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute2D_add") -set_tests_properties(workspaces.precompute2D_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute4D_add "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute4D_add") -set_tests_properties(workspaces.precompute4D_add PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute4D_multireduce "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute4D_multireduce") -set_tests_properties(workspaces.precompute4D_multireduce PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute3D_TspV "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_TspV") -set_tests_properties(workspaces.precompute3D_TspV PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute3D_multipleWS "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_multipleWS") -set_tests_properties(workspaces.precompute3D_multipleWS PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.precompute3D_renamedIVars_TspV "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.precompute3D_renamedIVars_TspV") -set_tests_properties(workspaces.precompute3D_renamedIVars_TspV PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_dotProduct_1 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=workspaces.DISABLED_tile_dotProduct_1") -set_tests_properties(workspaces.tile_dotProduct_1 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_dotProduct_2 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_also_run_disabled_tests" "--gtest_filter=workspaces.DISABLED_tile_dotProduct_2") -set_tests_properties(workspaces.tile_dotProduct_2 PROPERTIES DISABLED "TRUE" _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;378;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(workspaces.tile_dotProduct_3 "/Users/zhang/Desktop/taco/cmake-build-debug/bin/taco-test" "--gtest_filter=workspaces.tile_dotProduct_3") -set_tests_properties(workspaces.tile_dotProduct_3 PROPERTIES _BACKTRACE_TRIPLES "/Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.21/Modules/GoogleTest.cmake;390;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;21;gtest_add_tests;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") -add_test(taco-cli-test "/Users/zhang/Desktop/taco/test/bats/bin/bats" "/Users/zhang/Desktop/taco/test/") -set_tests_properties(taco-cli-test PROPERTIES _BACKTRACE_TRIPLES "/Users/zhang/Desktop/taco/test/CMakeLists.txt;25;add_test;/Users/zhang/Desktop/taco/test/CMakeLists.txt;0;") diff --git a/cmake-build-debug/tools/CTestTestfile.cmake b/cmake-build-debug/tools/CTestTestfile.cmake deleted file mode 100644 index 62bef847d..000000000 --- a/cmake-build-debug/tools/CTestTestfile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/zhang/Desktop/taco/tools -# Build directory: /Users/zhang/Desktop/taco/cmake-build-debug/tools -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. From d511c592d266122e5dbc15ee75b27ee0261d14ad Mon Sep 17 00:00:00 2001 From: zhang677 Date: Tue, 15 Mar 2022 21:23:15 +0800 Subject: [PATCH 09/12] Comment out unnecessary functions in implPerative class --- src/lower/lowerer_impl_imperative.cpp | 39 +++++++++++++++++++-------- test/tests-scheduling-eval.cpp | 4 +-- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/lower/lowerer_impl_imperative.cpp b/src/lower/lowerer_impl_imperative.cpp index 86b4f713b..5eeec7fa9 100644 --- a/src/lower/lowerer_impl_imperative.cpp +++ b/src/lower/lowerer_impl_imperative.cpp @@ -643,7 +643,7 @@ LowererImplImperative::splitAppenderAndInserters(const vector& results return {appenders, inserters}; } - +/* Stmt LowererImplImperative::lowerForall(Forall forall) { bool hasExactBound = provGraph.hasExactBound(forall.getIndexVar()); @@ -895,7 +895,10 @@ Stmt LowererImplImperative::lowerForall(Forall forall) loops, temporaryValuesInitFree[1]); } - +*/ +Stmt LowererImplImperative::lowerForall(Forall forall) { return lowerForallCloned(forall); } +Stmt LowererImplImperative::lowerForallCloned(Forall foraall) { return Stmt();} +/* Stmt LowererImplImperative::lowerForallCloned(Forall forall) { // want to emit guards outside of loop to prevent unstructured loop exits @@ -1003,7 +1006,7 @@ Stmt LowererImplImperative::lowerForallCloned(Forall forall) { // return guarded loops return Block::make(Block::make(guardRecoverySteps), IfThenElse::make(guardCondition, unvectorizedLoop, vectorizedLoop)); } - +*/ Stmt LowererImplImperative::searchForFusedPositionStart(Forall forall, Iterator posIterator) { vector searchForUnderivedStart; vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); @@ -2126,6 +2129,9 @@ Expr LowererImplImperative::getTemporarySize(Where where) { return Expr(); } + +vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { vector decl; return decl;} +/* vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { // if parallel == true, need to initialize dense accelerator arrays as size*numThreads // and rename all dense accelerator arrays to name + '_all' @@ -2201,7 +2207,7 @@ vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where } } - +*/ // Returns true if the following conditions are met: // 1) The temporary is a dense vector @@ -2216,6 +2222,8 @@ vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where // the sort. CUB support is built into CUDA 11 but not prior versions of // CUDA so in that case, we'd probably need to include the CUB headers in // the generated code. +std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { return std::make_pair(true, true);} +/* std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { // TODO: TEMPORARY -- Needs to be removed if(should_use_CUDA_codegen()) { @@ -2268,10 +2276,12 @@ std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) // Only need to sort the workspace if the result needs to be ordered return std::make_pair(true, varFmt.isOrdered()); } - +*/ // Code to initialize the local temporary workspace from the shared workspace // in codeToInitializeTemporaryParallel for a SINGLE parallel unit // (e.g.) the local workspace that each thread uses +vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decls; return decls; } +/* vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { TensorVar temporary = where.getTemporary(); vector decls; @@ -2336,10 +2346,12 @@ vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where } return decls; } - +*/ // Code to initialize a temporary workspace that is SHARED across ALL parallel units. // New temporaries are denoted by temporary.getName() + '_all' // Currently only supports CPUThreads +vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decl; return decl;} +/* vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { TensorVar temporary = where.getTemporary(); // For the parallel case, need to hoist up a workspace shared by all threads @@ -2386,7 +2398,9 @@ vector LowererImplImperative::codeToInitializeTemporaryParallel(Where wher return {initializeTemporary, freeTemporary}; } - +*/ +vector LowererImplImperative::codeToInitializeTemporary(Where where) {vector decl; return decl;} +/* vector LowererImplImperative::codeToInitializeTemporary(Where where) { TensorVar temporary = where.getTemporary(); @@ -2440,7 +2454,9 @@ vector LowererImplImperative::codeToInitializeTemporary(Where where) { } return {initializeTemporary, freeTemporary}; } - +*/ +Stmt LowererImplImperative::lowerWhere(Where where) { return Stmt(); } +/* Stmt LowererImplImperative::lowerWhere(Where where) { TensorVar temporary = where.getTemporary(); bool accelerateDenseWorkSpace, sortAccelerator; @@ -2532,7 +2548,7 @@ Stmt LowererImplImperative::lowerWhere(Where where) { whereTempsToResult.erase(where.getTemporary()); return Block::make(initializeTemporary, producer, markAssignsAtomicDepth > 0 ? capturedLocatePos : ir::Stmt(), consumer, freeTemporary); } - +*/ Stmt LowererImplImperative::lowerSequence(Sequence sequence) { Stmt definition = lower(sequence.getDefinition()); @@ -3272,7 +3288,8 @@ Stmt LowererImplImperative::resizeAndInitValues(const std::vector& app return result.empty() ? Stmt() : Block::make(result); } - +Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { return Stmt(); } +/* Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { Expr lower = simplify(ir::Mul::make(begin, size)); Expr upper = simplify(ir::Mul::make(ir::Add::make(begin, 1), size)); @@ -3290,7 +3307,7 @@ Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Ex } return For::make(p, lower, upper, 1, zeroInit, parallel); } - +*/ Stmt LowererImplImperative::declLocatePosVars(vector locators) { vector result; for (Iterator& locator : locators) { diff --git a/test/tests-scheduling-eval.cpp b/test/tests-scheduling-eval.cpp index cfb08802c..6b7866e4a 100644 --- a/test/tests-scheduling-eval.cpp +++ b/test/tests-scheduling-eval.cpp @@ -411,9 +411,7 @@ IndexStmt exampleScheduleSPMVPosIteration(IndexStmt stmt, Tensor A) { } TEST(scheduling_eval, test_spmvCPU_temp) { - if (should_use_CUDA_codegen()) { - return; - } + int NUM_I = 1021/10; int NUM_J = 1039/10; float SPARSITY = .3; From b3c3f0747845abe05191b0050da2a609b16ef981 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Fri, 1 Apr 2022 19:41:21 +0800 Subject: [PATCH 10/12] Debug apiset --- src/storage/file_io_mtx.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/storage/file_io_mtx.cpp b/src/storage/file_io_mtx.cpp index 33bd85258..bc0b4c686 100644 --- a/src/storage/file_io_mtx.cpp +++ b/src/storage/file_io_mtx.cpp @@ -125,6 +125,9 @@ TensorBase dispatchReadSparse(std::istream& stream, const T& format, values.push_back(val); } + + + // Create matrix TensorBase tensor(type(), dimensions, format); if (symm) From bbbc0f61dd8b1552d64b8f99b61c196b66c0d0dd Mon Sep 17 00:00:00 2001 From: zhang677 Date: Fri, 1 Apr 2022 20:32:14 +0800 Subject: [PATCH 11/12] Fix Bugs --- src/lower/lowerer_impl_imperative.cpp | 7348 ++++++++++++------------- 1 file changed, 3674 insertions(+), 3674 deletions(-) diff --git a/src/lower/lowerer_impl_imperative.cpp b/src/lower/lowerer_impl_imperative.cpp index 5eeec7fa9..e0c9f29e2 100644 --- a/src/lower/lowerer_impl_imperative.cpp +++ b/src/lower/lowerer_impl_imperative.cpp @@ -25,2189 +25,2189 @@ using taco::util::combine; namespace taco { -class LowererImplImperative::Visitor : public IndexNotationVisitorStrict { -public: - Visitor(LowererImplImperative* impl) : impl(impl) {} - Stmt lower(IndexStmt stmt) { - this->stmt = Stmt(); - impl->accessibleIterators.scope(); - IndexStmtVisitorStrict::visit(stmt); - impl->accessibleIterators.unscope(); - return this->stmt; - } - Expr lower(IndexExpr expr) { - this->expr = Expr(); - IndexExprVisitorStrict::visit(expr); - return this->expr; - } -private: - LowererImplImperative* impl; - Expr expr; - Stmt stmt; - using IndexNotationVisitorStrict::visit; - void visit(const AssignmentNode* node) { stmt = impl->lowerAssignment(node); } - void visit(const YieldNode* node) { stmt = impl->lowerYield(node); } - void visit(const ForallNode* node) { stmt = impl->lowerForall(node); } - void visit(const WhereNode* node) { stmt = impl->lowerWhere(node); } - void visit(const MultiNode* node) { stmt = impl->lowerMulti(node); } - void visit(const SuchThatNode* node) { stmt = impl->lowerSuchThat(node); } - void visit(const SequenceNode* node) { stmt = impl->lowerSequence(node); } - void visit(const AssembleNode* node) { stmt = impl->lowerAssemble(node); } - void visit(const AccessNode* node) { expr = impl->lowerAccess(node); } - void visit(const LiteralNode* node) { expr = impl->lowerLiteral(node); } - void visit(const NegNode* node) { expr = impl->lowerNeg(node); } - void visit(const AddNode* node) { expr = impl->lowerAdd(node); } - void visit(const SubNode* node) { expr = impl->lowerSub(node); } - void visit(const MulNode* node) { expr = impl->lowerMul(node); } - void visit(const DivNode* node) { expr = impl->lowerDiv(node); } - void visit(const SqrtNode* node) { expr = impl->lowerSqrt(node); } - void visit(const CastNode* node) { expr = impl->lowerCast(node); } - void visit(const CallIntrinsicNode* node) { expr = impl->lowerCallIntrinsic(node); } - void visit(const CallNode* node) { expr = impl->lowerTensorOp(node); } - void visit(const ReductionNode* node) { - taco_ierror << "Reduction nodes not supported in concrete index notation"; - } - void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } -}; - -LowererImplImperative::LowererImplImperative() : visitor(new Visitor(this)) { -} - - -static void createCapacityVars(const map& tensorVars, - map* capacityVars) { - for (auto& tensorVar : tensorVars) { - Expr tensor = tensorVar.second; - Expr capacityVar = Var::make(util::toString(tensor) + "_capacity", Int()); - capacityVars->insert({tensor, capacityVar}); - } -} + class LowererImplImperative::Visitor : public IndexNotationVisitorStrict { + public: + Visitor(LowererImplImperative* impl) : impl(impl) {} + Stmt lower(IndexStmt stmt) { + this->stmt = Stmt(); + impl->accessibleIterators.scope(); + IndexStmtVisitorStrict::visit(stmt); + impl->accessibleIterators.unscope(); + return this->stmt; + } + Expr lower(IndexExpr expr) { + this->expr = Expr(); + IndexExprVisitorStrict::visit(expr); + return this->expr; + } + private: + LowererImplImperative* impl; + Expr expr; + Stmt stmt; + using IndexNotationVisitorStrict::visit; + void visit(const AssignmentNode* node) { stmt = impl->lowerAssignment(node); } + void visit(const YieldNode* node) { stmt = impl->lowerYield(node); } + void visit(const ForallNode* node) { stmt = impl->lowerForall(node); } + void visit(const WhereNode* node) { stmt = impl->lowerWhere(node); } + void visit(const MultiNode* node) { stmt = impl->lowerMulti(node); } + void visit(const SuchThatNode* node) { stmt = impl->lowerSuchThat(node); } + void visit(const SequenceNode* node) { stmt = impl->lowerSequence(node); } + void visit(const AssembleNode* node) { stmt = impl->lowerAssemble(node); } + void visit(const AccessNode* node) { expr = impl->lowerAccess(node); } + void visit(const LiteralNode* node) { expr = impl->lowerLiteral(node); } + void visit(const NegNode* node) { expr = impl->lowerNeg(node); } + void visit(const AddNode* node) { expr = impl->lowerAdd(node); } + void visit(const SubNode* node) { expr = impl->lowerSub(node); } + void visit(const MulNode* node) { expr = impl->lowerMul(node); } + void visit(const DivNode* node) { expr = impl->lowerDiv(node); } + void visit(const SqrtNode* node) { expr = impl->lowerSqrt(node); } + void visit(const CastNode* node) { expr = impl->lowerCast(node); } + void visit(const CallIntrinsicNode* node) { expr = impl->lowerCallIntrinsic(node); } + void visit(const CallNode* node) { expr = impl->lowerTensorOp(node); } + void visit(const ReductionNode* node) { + taco_ierror << "Reduction nodes not supported in concrete index notation"; + } + void visit(const IndexVarNode* node) { expr = impl->lowerIndexVar(node); } + }; -static void createReducedValueVars(const vector& inputAccesses, - map* reducedValueVars) { - for (const auto& access : inputAccesses) { - const TensorVar inputTensor = access.getTensorVar(); - const std::string name = inputTensor.getName() + "_val"; - const Datatype type = inputTensor.getType().getDataType(); - reducedValueVars->insert({access, Var::make(name, type)}); - } -} + LowererImplImperative::LowererImplImperative() : visitor(new Visitor(this)) { + } -static void getDependentTensors(IndexStmt stmt, std::set& tensors) { - std::set prev; - do { - prev = tensors; - match(stmt, - function([&]( - const AssignmentNode* n, Matcher* m) { - if (util::contains(tensors, n->lhs.getTensorVar())) { - const auto arguments = getArguments(Assignment(n)); - tensors.insert(arguments.begin(), arguments.end()); - } - }) - ); - } while (prev != tensors); -} -static bool returnsTrue(IndexExpr expr) { - struct ReturnsTrue : public IndexExprRewriterStrict { - void visit(const AccessNode* op) { - if (op->isAccessingStructure) { - expr = op; - } + static void createCapacityVars(const map& tensorVars, + map* capacityVars) { + for (auto& tensorVar : tensorVars) { + Expr tensor = tensorVar.second; + Expr capacityVar = Var::make(util::toString(tensor) + "_capacity", Int()); + capacityVars->insert({tensor, capacityVar}); + } } - void visit(const LiteralNode* op) { - if (op->getDataType() == Bool && op->getVal()) { - expr = op; - } + static void createReducedValueVars(const vector& inputAccesses, + map* reducedValueVars) { + for (const auto& access : inputAccesses) { + const TensorVar inputTensor = access.getTensorVar(); + const std::string name = inputTensor.getName() + "_val"; + const Datatype type = inputTensor.getType().getDataType(); + reducedValueVars->insert({access, Var::make(name, type)}); + } } - void visit(const NegNode* op) { - expr = rewrite(op->a); - } + static void getDependentTensors(IndexStmt stmt, std::set& tensors) { + std::set prev; + do { + prev = tensors; + match(stmt, + function([&]( + const AssignmentNode* n, Matcher* m) { + if (util::contains(tensors, n->lhs.getTensorVar())) { + const auto arguments = getArguments(Assignment(n)); + tensors.insert(arguments.begin(), arguments.end()); + } + }) + ); + } while (prev != tensors); + } + + static bool returnsTrue(IndexExpr expr) { + struct ReturnsTrue : public IndexExprRewriterStrict { + void visit(const AccessNode* op) { + if (op->isAccessingStructure) { + expr = op; + } + } + + void visit(const LiteralNode* op) { + if (op->getDataType() == Bool && op->getVal()) { + expr = op; + } + } + + void visit(const NegNode* op) { + expr = rewrite(op->a); + } + + void visit(const AddNode* op) { + if (rewrite(op->a).defined() || rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const MulNode* op) { + if (rewrite(op->a).defined() && rewrite(op->b).defined()) { + expr = op; + } + } + + void visit(const CastNode* op) { + expr = rewrite(op->a); + } + + void visit(const CallNode* op) { + const auto annihilator = findProperty(op->properties); + + if (!annihilator.defined() || !annihilator.positions().empty()) { + return; + } - void visit(const AddNode* op) { - if (rewrite(op->a).defined() || rewrite(op->b).defined()) { - expr = op; - } + if (equals(annihilator.annihilator(), Literal(false))) { + for (const auto& arg : op->args) { + if (!rewrite(arg).defined()) { + return; + } + } + expr = op; + } else { + for (const auto& arg : op->args) { + if (rewrite(arg).defined()) { + expr = op; + return; + } + } + } + } + + void visit(const SqrtNode* op) {} + void visit(const SubNode* op) {} + void visit(const DivNode* op) {} + void visit(const CallIntrinsicNode* op) {} + void visit(const ReductionNode* op) {} + void visit(const IndexVarNode* op) {} + }; + return ReturnsTrue().rewrite(expr).defined(); } - void visit(const MulNode* op) { - if (rewrite(op->a).defined() && rewrite(op->b).defined()) { - expr = op; - } + static bool needComputeValues(IndexStmt stmt, TensorVar tensor) { + if (tensor.getType().getDataType() != Bool) { + return true; + } + + bool needComputeValue = false; + match(stmt, + function([&]( + const AssignmentNode* n, Matcher* m) { + if (n->lhs.getTensorVar() == tensor && !returnsTrue(n->rhs)) { + needComputeValue = true; + } + }) + ); + + return needComputeValue; } - void visit(const CastNode* op) { - expr = rewrite(op->a); +/// Returns the set of result tensors that is assembled by inserting a sparse +/// set of coordinates (meaning they will not be fully initialized without an +/// explicit zero-initialization loop). + static std::set hasSparseInserts(IndexStmt stmt, Iterators iterators, + ProvenanceGraph provGraph) { + std::set ret; + std::set definedIndexVars; + + match(stmt, + function([&](const ForallNode* op, + Matcher* ctx) { + definedIndexVars.insert(op->indexVar); + const auto lattice = MergeLattice::make(Forall(op), iterators, + provGraph, definedIndexVars); + if (any(lattice.iterators(), + [](Iterator it){ return !it.isFull() && + !it.isDimensionIterator(); }) || + any(lattice.points()[0].locators(), + [](Iterator it) { return !it.isFull(); })) { + for (const auto& result : lattice.results()) { + // FIXME: Also zero init if result is assembled by ungrouped insertion + // and is not compact or not unpadded (i.e., if result allocates + // additional space for components that aren't explicitly inserted) + if (result.hasInsert()) { + ret.insert(result.getTensor()); + } + } + } + ctx->match(op->stmt); + definedIndexVars.erase(op->indexVar); + }) + ); + return ret; } - void visit(const CallNode* op) { - const auto annihilator = findProperty(op->properties); + Stmt + LowererImplImperative::lower(IndexStmt stmt, string name, + bool assemble, bool compute, bool pack, bool unpack) + { + this->assemble = assemble; + this->compute = compute; + definedIndexVarsOrdered = {}; + definedIndexVars = {}; + loopOrderAllowsShortCircuit = allForFreeLoopsBeforeAllReductionLoops(stmt); - if (!annihilator.defined() || !annihilator.positions().empty()) { - return; - } + // Create result and parameter variables + vector results = getResults(stmt); + vector arguments = getArguments(stmt); + vector temporaries = getTemporaries(stmt); - if (equals(annihilator.annihilator(), Literal(false))) { - for (const auto& arg : op->args) { - if (!rewrite(arg).defined()) { - return; - } + needCompute = {}; + if (generateAssembleCode()) { + const auto attrQueryResults = getAttrQueryResults(stmt); + needCompute.insert(attrQueryResults.begin(), attrQueryResults.end()); } - expr = op; - } else { - for (const auto& arg : op->args) { - if (rewrite(arg).defined()) { - expr = op; - return; - } + if (generateComputeCode()) { + needCompute.insert(results.begin(), results.end()); + } + getDependentTensors(stmt, needCompute); + + assembledByUngroupedInsert = util::toSet( + getAssembledByUngroupedInsertion(stmt)); + + // Create datastructure needed for temporary workspace hoisting/reuse + temporaryInitialization = getTemporaryLocations(stmt); + + // Convert tensor results and arguments IR variables + map resultVars; + vector resultsIR = createVars(results, &resultVars, unpack); + tensorVars.insert(resultVars.begin(), resultVars.end()); + vector argumentsIR = createVars(arguments, &tensorVars, pack); + + // Create variables for index sets on result tensors. + vector indexSetArgs; + for (auto& access : getResultAccesses(stmt).first) { + // Any accesses that have index sets will be added. + if (access.hasIndexSetModes()) { + for (size_t i = 0; i < access.getIndexVars().size(); i++) { + if (access.isModeIndexSet(i)) { + auto t = access.getModeIndexSetTensor(i); + if (tensorVars.count(t) == 0) { + ir::Expr irVar = ir::Var::make(t.getName(), t.getType().getDataType(), true, true, pack); + tensorVars.insert({t, irVar}); + indexSetArgs.push_back(irVar); + } + } + } + } + } + argumentsIR.insert(argumentsIR.begin(), indexSetArgs.begin(), indexSetArgs.end()); + + // Create variables for temporaries + // TODO Remove this + for (auto& temp : temporaries) { + ir::Expr irVar = ir::Var::make(temp.getName(), temp.getType().getDataType(), + true, true); + tensorVars.insert({temp, irVar}); } - } - } - void visit(const SqrtNode* op) {} - void visit(const SubNode* op) {} - void visit(const DivNode* op) {} - void visit(const CallIntrinsicNode* op) {} - void visit(const ReductionNode* op) {} - void visit(const IndexVarNode* op) {} - }; - return ReturnsTrue().rewrite(expr).defined(); -} + // Create variables for keeping track of result values array capacity + createCapacityVars(resultVars, &capacityVars); -static bool needComputeValues(IndexStmt stmt, TensorVar tensor) { - if (tensor.getType().getDataType() != Bool) { - return true; - } - - bool needComputeValue = false; - match(stmt, - function([&]( - const AssignmentNode* n, Matcher* m) { - if (n->lhs.getTensorVar() == tensor && !returnsTrue(n->rhs)) { - needComputeValue = true; - } - }) - ); - - return needComputeValue; -} + // Create iterators + iterators = Iterators(stmt, tensorVars); -/// Returns the set of result tensors that is assembled by inserting a sparse -/// set of coordinates (meaning they will not be fully initialized without an -/// explicit zero-initialization loop). -static std::set hasSparseInserts(IndexStmt stmt, Iterators iterators, - ProvenanceGraph provGraph) { - std::set ret; - std::set definedIndexVars; - - match(stmt, - function([&](const ForallNode* op, - Matcher* ctx) { - definedIndexVars.insert(op->indexVar); - const auto lattice = MergeLattice::make(Forall(op), iterators, - provGraph, definedIndexVars); - if (any(lattice.iterators(), - [](Iterator it){ return !it.isFull() && - !it.isDimensionIterator(); }) || - any(lattice.points()[0].locators(), - [](Iterator it) { return !it.isFull(); })) { - for (const auto& result : lattice.results()) { - // FIXME: Also zero init if result is assembled by ungrouped insertion - // and is not compact or not unpadded (i.e., if result allocates - // additional space for components that aren't explicitly inserted) - if (result.hasInsert()) { - ret.insert(result.getTensor()); - } - } - } - ctx->match(op->stmt); - definedIndexVars.erase(op->indexVar); - }) - ); - return ret; -} + provGraph = ProvenanceGraph(stmt); -Stmt -LowererImplImperative::lower(IndexStmt stmt, string name, - bool assemble, bool compute, bool pack, bool unpack) -{ - this->assemble = assemble; - this->compute = compute; - definedIndexVarsOrdered = {}; - definedIndexVars = {}; - loopOrderAllowsShortCircuit = allForFreeLoopsBeforeAllReductionLoops(stmt); - - // Create result and parameter variables - vector results = getResults(stmt); - vector arguments = getArguments(stmt); - vector temporaries = getTemporaries(stmt); - - needCompute = {}; - if (generateAssembleCode()) { - const auto attrQueryResults = getAttrQueryResults(stmt); - needCompute.insert(attrQueryResults.begin(), attrQueryResults.end()); - } - if (generateComputeCode()) { - needCompute.insert(results.begin(), results.end()); - } - getDependentTensors(stmt, needCompute); - - assembledByUngroupedInsert = util::toSet( - getAssembledByUngroupedInsertion(stmt)); - - // Create datastructure needed for temporary workspace hoisting/reuse - temporaryInitialization = getTemporaryLocations(stmt); - - // Convert tensor results and arguments IR variables - map resultVars; - vector resultsIR = createVars(results, &resultVars, unpack); - tensorVars.insert(resultVars.begin(), resultVars.end()); - vector argumentsIR = createVars(arguments, &tensorVars, pack); - - // Create variables for index sets on result tensors. - vector indexSetArgs; - for (auto& access : getResultAccesses(stmt).first) { - // Any accesses that have index sets will be added. - if (access.hasIndexSetModes()) { - for (size_t i = 0; i < access.getIndexVars().size(); i++) { - if (access.isModeIndexSet(i)) { - auto t = access.getModeIndexSetTensor(i); - if (tensorVars.count(t) == 0) { - ir::Expr irVar = ir::Var::make(t.getName(), t.getType().getDataType(), true, true, pack); - tensorVars.insert({t, irVar}); - indexSetArgs.push_back(irVar); - } - } - } - } - } - argumentsIR.insert(argumentsIR.begin(), indexSetArgs.begin(), indexSetArgs.end()); - - // Create variables for temporaries - // TODO Remove this - for (auto& temp : temporaries) { - ir::Expr irVar = ir::Var::make(temp.getName(), temp.getType().getDataType(), - true, true); - tensorVars.insert({temp, irVar}); - } - - // Create variables for keeping track of result values array capacity - createCapacityVars(resultVars, &capacityVars); - - // Create iterators - iterators = Iterators(stmt, tensorVars); - - provGraph = ProvenanceGraph(stmt); - - for (const IndexVar& indexVar : provGraph.getAllIndexVars()) { - if (iterators.modeIterators().count(indexVar)) { - indexVarToExprMap.insert({indexVar, iterators.modeIterators()[indexVar].getIteratorVar()}); - } - else { - indexVarToExprMap.insert({indexVar, Var::make(indexVar.getName(), Int())}); - } - } - - vector inputAccesses, resultAccesses; - set reducedAccesses; - inputAccesses = getArgumentAccesses(stmt); - std::tie(resultAccesses, reducedAccesses) = getResultAccesses(stmt); - - // Create variables that represent the reduced values of duplicated tensor - // components - createReducedValueVars(inputAccesses, &reducedValueVars); - - map scalars; - - // Define and initialize dimension variables - set temporariesSet(temporaries.begin(), temporaries.end()); - vector indexVars = getIndexVars(stmt); - for (auto& indexVar : indexVars) { - Expr dimension; - // getDimension extracts an Expr that holds the dimension - // of a particular tensor mode. This Expr should be used as a loop bound - // when iterating over the dimension of the target tensor. - auto getDimension = [&](const TensorVar& tv, const Access& a, int mode) { - // If the tensor mode is windowed, then the dimension for iteration is the bounds - // of the window. Otherwise, it is the actual dimension of the mode. - if (a.isModeWindowed(mode)) { - // The mode value used to access .levelIterator is 1-indexed, while - // the mode input to getDimension is 0-indexed. So, we shift it up by 1. - auto iter = iterators.levelIterator(ModeAccess(a, mode+1)); - return ir::Div::make(ir::Sub::make(iter.getWindowUpperBound(), iter.getWindowLowerBound()), iter.getStride()); - } else if (a.isModeIndexSet(mode)) { - // If the mode has an index set, then the dimension is the size of - // the index set. - return ir::Literal::make(a.getIndexSet(mode).size()); - } else { - return GetProperty::make(tensorVars.at(tv), TensorProperty::Dimension, mode); - } - }; - match(stmt, - function([&]( - const AssignmentNode* n, Matcher* m) { - m->match(n->rhs); - if (!dimension.defined()) { - auto ivars = n->lhs.getIndexVars(); - auto tv = n->lhs.getTensorVar(); - int loc = (int)distance(ivars.begin(), - find(ivars.begin(),ivars.end(), indexVar)); - if(!util::contains(temporariesSet, tv)) { - dimension = getDimension(tv, n->lhs, loc); - } - } - }), - function([&](const AccessNode* n) { - auto indexVars = n->indexVars; - if (util::contains(indexVars, indexVar)) { - int loc = (int)distance(indexVars.begin(), - find(indexVars.begin(),indexVars.end(), - indexVar)); - if(!util::contains(temporariesSet, n->tensorVar)) { - dimension = getDimension(n->tensorVar, Access(n), loc); - } - } - }) - ); - dimensions.insert({indexVar, dimension}); - underivedBounds.insert({indexVar, {ir::Literal::make(0), dimension}}); - } - - // Define and initialize scalar results and arguments - if (generateComputeCode()) { - for (auto& result : results) { - if (isScalar(result.getType())) { - taco_iassert(!util::contains(scalars, result)); - taco_iassert(util::contains(tensorVars, result)); - scalars.insert({result, tensorVars.at(result)}); - header.push_back(defineScalarVariable(result, true)); - } - } - for (auto& argument : arguments) { - if (isScalar(argument.getType())) { - taco_iassert(!util::contains(scalars, argument)); - taco_iassert(util::contains(tensorVars, argument)); - scalars.insert({argument, tensorVars.at(argument)}); - header.push_back(defineScalarVariable(argument, false)); - } - } - } - - // Allocate memory for scalar results - if (generateAssembleCode()) { - for (auto& result : results) { - if (result.getOrder() == 0) { - Expr resultIR = resultVars.at(result); - Expr vals = GetProperty::make(resultIR, TensorProperty::Values); - header.push_back(Allocate::make(vals, 1)); - } - } - } - - // Identify the set of result tensors that must be explicitly initialized - nonFullyInitializedResults = hasSparseInserts(stmt, iterators, provGraph); - - // Allocate and initialize append and insert mode indices - Stmt initializeResults = initResultArrays(resultAccesses, reducedAccesses); - - // Lower the index statement to compute and/or assemble - Stmt body = lower(stmt); - - // Post-process result modes and allocate memory for values if necessary - Stmt finalizeResults = finalizeResultArrays(resultAccesses); - - // Post-process body to replace workspace/temporary GetProperties with local variables - if (generateComputeCode()) - body = rewriteTemporaryGP(body, temporaries, temporarySizeMap); - - // Store scalar stack variables back to results - if (generateComputeCode()) { - for (auto& result : results) { - if (isScalar(result.getType())) { - taco_iassert(util::contains(scalars, result)); - taco_iassert(util::contains(tensorVars, result)); - Expr resultIR = scalars.at(result); - Expr varValueIR = tensorVars.at(result); - Expr valuesArrIR = GetProperty::make(resultIR, TensorProperty::Values); - footer.push_back(Store::make(valuesArrIR, 0, varValueIR, markAssignsAtomicDepth > 0, atomicParallelUnit)); - } - } - } - - // Create function - return Function::make(name, resultsIR, argumentsIR, - Block::blanks(Block::make(header), - initializeResults, - body, - finalizeResults, - Block::make(footer))); -} + for (const IndexVar& indexVar : provGraph.getAllIndexVars()) { + if (iterators.modeIterators().count(indexVar)) { + indexVarToExprMap.insert({indexVar, iterators.modeIterators()[indexVar].getIteratorVar()}); + } + else { + indexVarToExprMap.insert({indexVar, Var::make(indexVar.getName(), Int())}); + } + } + vector inputAccesses, resultAccesses; + set reducedAccesses; + inputAccesses = getArgumentAccesses(stmt); + std::tie(resultAccesses, reducedAccesses) = getResultAccesses(stmt); + + // Create variables that represent the reduced values of duplicated tensor + // components + createReducedValueVars(inputAccesses, &reducedValueVars); + + map scalars; + + // Define and initialize dimension variables + set temporariesSet(temporaries.begin(), temporaries.end()); + vector indexVars = getIndexVars(stmt); + for (auto& indexVar : indexVars) { + Expr dimension; + // getDimension extracts an Expr that holds the dimension + // of a particular tensor mode. This Expr should be used as a loop bound + // when iterating over the dimension of the target tensor. + auto getDimension = [&](const TensorVar& tv, const Access& a, int mode) { + // If the tensor mode is windowed, then the dimension for iteration is the bounds + // of the window. Otherwise, it is the actual dimension of the mode. + if (a.isModeWindowed(mode)) { + // The mode value used to access .levelIterator is 1-indexed, while + // the mode input to getDimension is 0-indexed. So, we shift it up by 1. + auto iter = iterators.levelIterator(ModeAccess(a, mode+1)); + return ir::Div::make(ir::Sub::make(iter.getWindowUpperBound(), iter.getWindowLowerBound()), iter.getStride()); + } else if (a.isModeIndexSet(mode)) { + // If the mode has an index set, then the dimension is the size of + // the index set. + return ir::Literal::make(a.getIndexSet(mode).size()); + } else { + return GetProperty::make(tensorVars.at(tv), TensorProperty::Dimension, mode); + } + }; + match(stmt, + function([&]( + const AssignmentNode* n, Matcher* m) { + m->match(n->rhs); + if (!dimension.defined()) { + auto ivars = n->lhs.getIndexVars(); + auto tv = n->lhs.getTensorVar(); + int loc = (int)distance(ivars.begin(), + find(ivars.begin(),ivars.end(), indexVar)); + if(!util::contains(temporariesSet, tv)) { + dimension = getDimension(tv, n->lhs, loc); + } + } + }), + function([&](const AccessNode* n) { + auto indexVars = n->indexVars; + if (util::contains(indexVars, indexVar)) { + int loc = (int)distance(indexVars.begin(), + find(indexVars.begin(),indexVars.end(), + indexVar)); + if(!util::contains(temporariesSet, n->tensorVar)) { + dimension = getDimension(n->tensorVar, Access(n), loc); + } + } + }) + ); + dimensions.insert({indexVar, dimension}); + underivedBounds.insert({indexVar, {ir::Literal::make(0), dimension}}); + } -Stmt LowererImplImperative::lowerAssignment(Assignment assignment) -{ - taco_iassert(generateAssembleCode() || generateComputeCode()); - - Stmt computeStmt; - TensorVar result = assignment.getLhs().getTensorVar(); - Expr var = getTensorVar(result); - - const bool needComputeAssign = util::contains(needCompute, result); - - Expr rhs; - if (needComputeAssign) { - rhs = lower(assignment.getRhs()); - } - - // Assignment to scalar variables. - if (isScalar(result.getType())) { - if (needComputeAssign) { - if (!assignment.getOperator().defined()) { - computeStmt = Assign::make(var, rhs); - } - else { - bool useAtomics = markAssignsAtomicDepth > 0 && - !util::contains(whereTemps, result); - if (isa(assignment.getOperator())) { - computeStmt = compoundAssign(var, rhs, useAtomics, atomicParallelUnit); - } else { - taco_iassert(isa(assignment.getOperator())); + // Define and initialize scalar results and arguments + if (generateComputeCode()) { + for (auto& result : results) { + if (isScalar(result.getType())) { + taco_iassert(!util::contains(scalars, result)); + taco_iassert(util::contains(tensorVars, result)); + scalars.insert({result, tensorVars.at(result)}); + header.push_back(defineScalarVariable(result, true)); + } + } + for (auto& argument : arguments) { + if (isScalar(argument.getType())) { + taco_iassert(!util::contains(scalars, argument)); + taco_iassert(util::contains(tensorVars, argument)); + scalars.insert({argument, tensorVars.at(argument)}); + header.push_back(defineScalarVariable(argument, false)); + } + } + } + + // Allocate memory for scalar results + if (generateAssembleCode()) { + for (auto& result : results) { + if (result.getOrder() == 0) { + Expr resultIR = resultVars.at(result); + Expr vals = GetProperty::make(resultIR, TensorProperty::Values); + header.push_back(Allocate::make(vals, 1)); + } + } + } + + // Identify the set of result tensors that must be explicitly initialized + nonFullyInitializedResults = hasSparseInserts(stmt, iterators, provGraph); + + // Allocate and initialize append and insert mode indices + Stmt initializeResults = initResultArrays(resultAccesses, reducedAccesses); + + // Lower the index statement to compute and/or assemble + Stmt body = lower(stmt); - Call op = to(assignment.getOperator()); - Expr assignOp = op.getFunc()({var, rhs}); - Stmt assign = Assign::make(var, assignOp, useAtomics, - atomicParallelUnit); + // Post-process result modes and allocate memory for values if necessary + Stmt finalizeResults = finalizeResultArrays(resultAccesses); - std::vector properties = op.getProperties(); - computeStmt = Block::make(assign, emitEarlyExit(var, properties)); + // Post-process body to replace workspace/temporary GetProperties with local variables + if (generateComputeCode()) + body = rewriteTemporaryGP(body, temporaries, temporarySizeMap); + + // Store scalar stack variables back to results + if (generateComputeCode()) { + for (auto& result : results) { + if (isScalar(result.getType())) { + taco_iassert(util::contains(scalars, result)); + taco_iassert(util::contains(tensorVars, result)); + Expr resultIR = scalars.at(result); + Expr varValueIR = tensorVars.at(result); + Expr valuesArrIR = GetProperty::make(resultIR, TensorProperty::Values); + footer.push_back(Store::make(valuesArrIR, 0, varValueIR, markAssignsAtomicDepth > 0, atomicParallelUnit)); + } + } } - } + + // Create function + return Function::make(name, resultsIR, argumentsIR, + Block::blanks(Block::make(header), + initializeResults, + body, + finalizeResults, + Block::make(footer))); } - } - // Assignments to tensor variables (non-scalar). - else { - Expr values = getValuesArray(result); - Expr loc = generateValueLocExpr(assignment.getLhs()); - std::vector accessStmts; - if (isAssembledByUngroupedInsertion(result)) { - std::vector coords; - Expr prevPos = 0; - size_t i = 0; - const auto resultIterators = getIterators(assignment.getLhs()); - for (const auto& it : resultIterators) { - // TODO: Should only assemble levels that can be assembled together - //if (it == this->nextTopResultIterator) { - // break; - //} + Stmt LowererImplImperative::lowerAssignment(Assignment assignment) + { + taco_iassert(generateAssembleCode() || generateComputeCode()); - coords.push_back(getCoordinateVar(it)); + Stmt computeStmt; + TensorVar result = assignment.getLhs().getTensorVar(); + Expr var = getTensorVar(result); - const auto yieldPos = it.getYieldPos(prevPos, coords); - accessStmts.push_back(yieldPos.compute()); - Expr pos = it.getPosVar(); - accessStmts.push_back(VarDecl::make(pos, yieldPos[0])); + const bool needComputeAssign = util::contains(needCompute, result); - if (generateAssembleCode()) { - accessStmts.push_back(it.getInsertCoord(prevPos, pos, coords)); + Expr rhs; + if (needComputeAssign) { + rhs = lower(assignment.getRhs()); } - prevPos = pos; - ++i; - } - } + // Assignment to scalar variables. + if (isScalar(result.getType())) { + if (needComputeAssign) { + if (!assignment.getOperator().defined()) { + computeStmt = Assign::make(var, rhs); + } + else { + bool useAtomics = markAssignsAtomicDepth > 0 && + !util::contains(whereTemps, result); + if (isa(assignment.getOperator())) { + computeStmt = compoundAssign(var, rhs, useAtomics, atomicParallelUnit); + } else { + taco_iassert(isa(assignment.getOperator())); + + Call op = to(assignment.getOperator()); + Expr assignOp = op.getFunc()({var, rhs}); + Stmt assign = Assign::make(var, assignOp, useAtomics, + atomicParallelUnit); + + std::vector properties = op.getProperties(); + computeStmt = Block::make(assign, emitEarlyExit(var, properties)); + } + } + } + } + // Assignments to tensor variables (non-scalar). + else { + Expr values = getValuesArray(result); + Expr loc = generateValueLocExpr(assignment.getLhs()); + + std::vector accessStmts; + + if (isAssembledByUngroupedInsertion(result)) { + std::vector coords; + Expr prevPos = 0; + size_t i = 0; + const auto resultIterators = getIterators(assignment.getLhs()); + for (const auto& it : resultIterators) { + // TODO: Should only assemble levels that can be assembled together + //if (it == this->nextTopResultIterator) { + // break; + //} + + coords.push_back(getCoordinateVar(it)); + + const auto yieldPos = it.getYieldPos(prevPos, coords); + accessStmts.push_back(yieldPos.compute()); + Expr pos = it.getPosVar(); + accessStmts.push_back(VarDecl::make(pos, yieldPos[0])); + + if (generateAssembleCode()) { + accessStmts.push_back(it.getInsertCoord(prevPos, pos, coords)); + } + + prevPos = pos; + ++i; + } + } - if (needComputeAssign && values.defined()) { - if (!assignment.getOperator().defined()) { - computeStmt = Store::make(values, loc, rhs); - } - else { - if (isa(assignment.getOperator())) { - computeStmt = compoundStore(values, loc, rhs, markAssignsAtomicDepth > 0, atomicParallelUnit); - } else { + if (needComputeAssign && values.defined()) { + if (!assignment.getOperator().defined()) { + computeStmt = Store::make(values, loc, rhs); + } + else { + if (isa(assignment.getOperator())) { + computeStmt = compoundStore(values, loc, rhs, markAssignsAtomicDepth > 0, atomicParallelUnit); + } else { + + taco_iassert(isa(assignment.getOperator())); + + Call op = to(assignment.getOperator()); + Expr assignOp = op.getFunc()({Load::make(values, loc), rhs}); + computeStmt = Store::make(values, loc, assignOp, + markAssignsAtomicDepth > 0 && !util::contains(whereTemps, result), + atomicParallelUnit); + + std::vector properties = op.getProperties(); + computeStmt = Block::make(computeStmt, emitEarlyExit(Load::make(values, loc), properties)); + } + } + taco_iassert(computeStmt.defined()); + } + + if (!accessStmts.empty()) { + accessStmts.push_back(computeStmt); + computeStmt = Block::make(accessStmts); + } + } - taco_iassert(isa(assignment.getOperator())); + if (util::contains(guardedTemps, result) && result.getOrder() == 0) { + Expr guard = tempToBitGuard[result]; + Stmt setGuard = Assign::make(guard, true, markAssignsAtomicDepth > 0, + atomicParallelUnit); + computeStmt = Block::make(computeStmt, setGuard); + } - Call op = to(assignment.getOperator()); - Expr assignOp = op.getFunc()({Load::make(values, loc), rhs}); - computeStmt = Store::make(values, loc, assignOp, - markAssignsAtomicDepth > 0 && !util::contains(whereTemps, result), - atomicParallelUnit); + Expr assembleGuard = generateAssembleGuard(assignment.getRhs()); + const bool assembleGuardTrivial = isa(assembleGuard); - std::vector properties = op.getProperties(); - computeStmt = Block::make(computeStmt, emitEarlyExit(Load::make(values, loc), properties)); + // TODO: If only assembling so defer allocating value memory to the end when + // we'll know exactly how much we need. + bool temporaryWithSparseAcceleration = util::contains(tempToIndexList, result); + if (generateComputeCode() && !temporaryWithSparseAcceleration) { + taco_iassert(computeStmt.defined()); + return assembleGuardTrivial ? computeStmt : IfThenElse::make(assembleGuard, + computeStmt); + } + + if (temporaryWithSparseAcceleration) { + taco_iassert(markAssignsAtomicDepth == 0) + << "Parallel assembly of sparse accelerator not supported"; + + Expr values = getValuesArray(result); + Expr loc = generateValueLocExpr(assignment.getLhs()); + + Expr bitGuardArr = tempToBitGuard.at(result); + Expr indexList = tempToIndexList.at(result); + Expr indexListSize = tempToIndexListSize.at(result); + + Stmt markBitGuardAsTrue = Store::make(bitGuardArr, loc, true); + Stmt trackIndex = Store::make(indexList, indexListSize, loc); + Expr incrementSize = ir::Add::make(indexListSize, 1); + Stmt incrementStmt = Assign::make(indexListSize, incrementSize); + + Stmt firstWriteAtIndex = Block::make(trackIndex, markBitGuardAsTrue, incrementStmt); + if (needComputeAssign && values.defined()) { + Stmt initialStorage = computeStmt; + if (assignment.getOperator().defined()) { + // computeStmt is a compund stmt so we need to emit an initial store + // into the temporary + initialStorage = Store::make(values, loc, rhs); + } + firstWriteAtIndex = Block::make(initialStorage, firstWriteAtIndex); + } + + Expr readBitGuard = Load::make(bitGuardArr, loc); + computeStmt = IfThenElse::make(ir::Neg::make(readBitGuard), + firstWriteAtIndex, computeStmt); } - } - taco_iassert(computeStmt.defined()); - } - if (!accessStmts.empty()) { - accessStmts.push_back(computeStmt); - computeStmt = Block::make(accessStmts); + return assembleGuardTrivial ? computeStmt : IfThenElse::make(assembleGuard, + computeStmt); } - } - if (util::contains(guardedTemps, result) && result.getOrder() == 0) { - Expr guard = tempToBitGuard[result]; - Stmt setGuard = Assign::make(guard, true, markAssignsAtomicDepth > 0, - atomicParallelUnit); - computeStmt = Block::make(computeStmt, setGuard); - } - Expr assembleGuard = generateAssembleGuard(assignment.getRhs()); - const bool assembleGuardTrivial = isa(assembleGuard); + Stmt LowererImplImperative::lowerYield(Yield yield) { + std::vector coords; + for (auto& indexVar : yield.getIndexVars()) { + coords.push_back(getCoordinateVar(indexVar)); + } + Expr val = lower(yield.getExpr()); + return ir::Yield::make(coords, val); + } - // TODO: If only assembling so defer allocating value memory to the end when - // we'll know exactly how much we need. - bool temporaryWithSparseAcceleration = util::contains(tempToIndexList, result); - if (generateComputeCode() && !temporaryWithSparseAcceleration) { - taco_iassert(computeStmt.defined()); - return assembleGuardTrivial ? computeStmt : IfThenElse::make(assembleGuard, - computeStmt); - } - if (temporaryWithSparseAcceleration) { - taco_iassert(markAssignsAtomicDepth == 0) - << "Parallel assembly of sparse accelerator not supported"; + pair, vector> + LowererImplImperative::splitAppenderAndInserters(const vector& results) { + vector appenders; + vector inserters; - Expr values = getValuesArray(result); - Expr loc = generateValueLocExpr(assignment.getLhs()); + // TODO: Choose insert when the current forall is nested inside a reduction + for (auto& result : results) { + if (isAssembledByUngroupedInsertion(result.getTensor())) { + continue; + } - Expr bitGuardArr = tempToBitGuard.at(result); - Expr indexList = tempToIndexList.at(result); - Expr indexListSize = tempToIndexListSize.at(result); + taco_iassert(result.hasAppend() || result.hasInsert()) + << "Results must support append or insert"; - Stmt markBitGuardAsTrue = Store::make(bitGuardArr, loc, true); - Stmt trackIndex = Store::make(indexList, indexListSize, loc); - Expr incrementSize = ir::Add::make(indexListSize, 1); - Stmt incrementStmt = Assign::make(indexListSize, incrementSize); + if (result.hasAppend()) { + appenders.push_back(result); + } + else { + taco_iassert(result.hasInsert()); + inserters.push_back(result); + } + } - Stmt firstWriteAtIndex = Block::make(trackIndex, markBitGuardAsTrue, incrementStmt); - if (needComputeAssign && values.defined()) { - Stmt initialStorage = computeStmt; - if (assignment.getOperator().defined()) { - // computeStmt is a compund stmt so we need to emit an initial store - // into the temporary - initialStorage = Store::make(values, loc, rhs); - } - firstWriteAtIndex = Block::make(initialStorage, firstWriteAtIndex); + return {appenders, inserters}; } - Expr readBitGuard = Load::make(bitGuardArr, loc); - computeStmt = IfThenElse::make(ir::Neg::make(readBitGuard), - firstWriteAtIndex, computeStmt); - } - return assembleGuardTrivial ? computeStmt : IfThenElse::make(assembleGuard, - computeStmt); -} + Stmt LowererImplImperative::lowerForall(Forall forall) + { + bool hasExactBound = provGraph.hasExactBound(forall.getIndexVar()); + bool forallNeedsUnderivedGuards = !hasExactBound && emitUnderivedGuards; + if (!ignoreVectorize && forallNeedsUnderivedGuards && + (forall.getParallelUnit() == ParallelUnit::CPUVector || + forall.getUnrollFactor() > 0)) { + return lowerForallCloned(forall); + } + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth++; + } -Stmt LowererImplImperative::lowerYield(Yield yield) { - std::vector coords; - for (auto& indexVar : yield.getIndexVars()) { - coords.push_back(getCoordinateVar(indexVar)); - } - Expr val = lower(yield.getExpr()); - return ir::Yield::make(coords, val); -} + // Recover any available parents that were not recoverable previously + vector recoverySteps; + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(forall.getIndexVar(), definedIndexVars)) { + // place pos guard + if (forallNeedsUnderivedGuards && provGraph.isCoordVariable(varToRecover) && + provGraph.getChildren(varToRecover).size() == 1 && + provGraph.isPosVariable(provGraph.getChildren(varToRecover)[0])) { + IndexVar posVar = provGraph.getChildren(varToRecover)[0]; + std::vector iterBounds = provGraph.deriveIterBounds(posVar, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + Expr minGuard = Lt::make(indexVarToExprMap[posVar], iterBounds[0]); + Expr maxGuard = Gte::make(indexVarToExprMap[posVar], iterBounds[1]); + Expr guardCondition = Or::make(minGuard, maxGuard); + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardCondition = maxGuard; + } + ir::Stmt guard = ir::IfThenElse::make(guardCondition, ir::Continue::make()); + recoverySteps.push_back(guard); + } + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + taco_iassert(indexVarToExprMap.count(varToRecover)); + recoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + + // After we've recovered this index variable, some iterators are now + // accessible for use when declaring locator access variables. So, generate + // the accessors for those locator variables as part of the recovery process. + // This is necessary after a fuse transformation, for example: If we fuse + // two index variables (i, j) into f, then after we've generated the loop for + // f, all locate accessors for i and j are now available for use. + std::vector itersForVar; + for (auto& iters : iterators.levelIterators()) { + // Collect all level iterators that have locate and iterate over + // the recovered index variable. + if (iters.second.getIndexVar() == varToRecover && iters.second.hasLocate()) { + itersForVar.push_back(iters.second); + } + } + // Finally, declare all of the collected iterators' position access variables. + recoverySteps.push_back(this->declLocatePosVars(itersForVar)); + + // place underived guard + std::vector iterBounds = provGraph.deriveIterBounds(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + if (forallNeedsUnderivedGuards && underivedBounds.count(varToRecover) && + !provGraph.hasPosDescendant(varToRecover)) { + + // FIXME: [Olivia] Check this with someone + // Removed underived guard if indexVar is bounded is divisible by its split child indexVar + vector children = provGraph.getChildren(varToRecover); + bool hasDirectDivBound = false; + std::vector iterBoundsInner = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + for (auto& c: children) { + if (provGraph.hasExactBound(c) && + provGraph.derivationPath(varToRecover, c).size() == 2) { + const auto iterBoundsUnderivedChild = + provGraph.deriveIterBounds(c, definedIndexVarsOrdered, + underivedBounds, indexVarToExprMap, + iterators); + if (iterBoundsUnderivedChild[1].as()->getValue() % + iterBoundsInner[1].as()->getValue() == 0) { + hasDirectDivBound = true; + break; + } + } + } + if (!hasDirectDivBound) { + Stmt guard = IfThenElse::make(Gte::make(indexVarToExprMap[varToRecover], + underivedBounds[varToRecover][1]), + Continue::make()); + recoverySteps.push_back(guard); + } + } -pair, vector> -LowererImplImperative::splitAppenderAndInserters(const vector& results) { - vector appenders; - vector inserters; + // If this index variable was divided into multiple equal chunks, then we + // must add an extra guard to make sure that further scheduling operations + // on descendent index variables exceed the bounds of each equal portion of + // the loop. For a concrete example, consider a loop of size 10 that is divided + // into two equal components -- 5 and 5. If the loop is then transformed + // with .split(..., 3), each inner chunk of 5 will be split into chunks of + // 3. Without an extra guard, the second chunk of 3 in the first group of 5 + // may attempt to perform an iteration for the second group of 5, which is + // incorrect. + if (this->provGraph.isDivided(varToRecover)) { + // Collect the children iteration variables. + auto children = this->provGraph.getChildren(varToRecover); + auto outer = children[0]; + auto inner = children[1]; + // Find the iteration bounds of the inner variable -- that is the size + // that the outer loop was broken into. + auto bounds = this->provGraph.deriveIterBounds(inner, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + // Use the difference between the bounds to find the size of the loop. + auto dimLen = ir::Sub::make(bounds[1], bounds[0]); + // For a variable f divided into into f1 and f2, the guard ensures that + // for iteration f, f should be within f1 * dimLen and (f1 + 1) * dimLen. + auto guard = ir::Gte::make(this->indexVarToExprMap[varToRecover], ir::Mul::make(ir::Add::make(this->indexVarToExprMap[outer], 1), dimLen)); + recoverySteps.push_back(IfThenElse::make(guard, ir::Continue::make())); + } + } + Stmt recoveryStmt = Block::make(recoverySteps); + + taco_iassert(!definedIndexVars.count(forall.getIndexVar())); + definedIndexVars.insert(forall.getIndexVar()); + definedIndexVarsOrdered.push_back(forall.getIndexVar()); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + taco_iassert(!parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(!parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars[forall.getParallelUnit()] = forall.getIndexVar(); + vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + parallelUnitSizes[forall.getParallelUnit()] = ir::Sub::make(bounds[1], bounds[0]); + } - // TODO: Choose insert when the current forall is nested inside a reduction - for (auto& result : results) { - if (isAssembledByUngroupedInsertion(result.getTensor())) { - continue; - } + MergeLattice caseLattice = MergeLattice::make(forall, iterators, provGraph, definedIndexVars, whereTempsToResult); + vector resultAccesses; + set reducedAccesses; + std::tie(resultAccesses, reducedAccesses) = getResultAccesses(forall); + + // Pre-allocate/initialize memory of value arrays that are full below this + // loops index variable + Stmt preInitValues = initResultArrays(forall.getIndexVar(), resultAccesses, + reducedAccesses); + + // Emit temporary initialization if forall is sequential or parallelized by + // cpu threads and leads to a where statement + // This is for workspace hoisting by 1-level + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + auto temp = temporaryInitialization.find(forall); + if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temp->second.getTemporary().getType())) + temporaryValuesInitFree = codeToInitializeTemporary(temp->second); + else if (temp != temporaryInitialization.end() && forall.getParallelUnit() == + ParallelUnit::CPUThread && !isScalar(temp->second.getTemporary().getType())) { + temporaryValuesInitFree = codeToInitializeTemporaryParallel(temp->second, forall.getParallelUnit()); + } - taco_iassert(result.hasAppend() || result.hasInsert()) - << "Results must support append or insert"; + Stmt loops; + // Emit a loop that iterates over over a single iterator (optimization) + if (caseLattice.iterators().size() == 1 && caseLattice.iterators()[0].isUnique()) { + MergeLattice loopLattice = caseLattice.getLoopLattice(); - if (result.hasAppend()) { - appenders.push_back(result); - } - else { - taco_iassert(result.hasInsert()); - inserters.push_back(result); - } - } + MergePoint point = loopLattice.points()[0]; + Iterator iterator = loopLattice.iterators()[0]; - return {appenders, inserters}; -} + vector locators = point.locators(); + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(point.results()); + + std::vector underivedAncestors = provGraph.getUnderivedAncestors(iterator.getIndexVar()); + IndexVar posDescendant; + bool hasPosDescendant = false; + if (!underivedAncestors.empty()) { + hasPosDescendant = provGraph.getPosIteratorFullyDerivedDescendant(underivedAncestors[0], &posDescendant); + } + + bool isWhereProducer = false; + vector results = point.results(); + for (Iterator result : results) { + for (auto it = tensorVars.begin(); it != tensorVars.end(); it++) { + if (it->second == result.getTensor()) { + if (whereTempsToResult.count(it->first)) { + isWhereProducer = true; + break; + } + } + } + } -/* -Stmt LowererImplImperative::lowerForall(Forall forall) -{ - bool hasExactBound = provGraph.hasExactBound(forall.getIndexVar()); - bool forallNeedsUnderivedGuards = !hasExactBound && emitUnderivedGuards; - if (!ignoreVectorize && forallNeedsUnderivedGuards && - (forall.getParallelUnit() == ParallelUnit::CPUVector || - forall.getUnrollFactor() > 0)) { - return lowerForallCloned(forall); - } - - if (forall.getParallelUnit() != ParallelUnit::NotParallel) { - inParallelLoopDepth++; - } - - // Recover any available parents that were not recoverable previously - vector recoverySteps; - for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(forall.getIndexVar(), definedIndexVars)) { - // place pos guard - if (forallNeedsUnderivedGuards && provGraph.isCoordVariable(varToRecover) && - provGraph.getChildren(varToRecover).size() == 1 && - provGraph.isPosVariable(provGraph.getChildren(varToRecover)[0])) { - IndexVar posVar = provGraph.getChildren(varToRecover)[0]; - std::vector iterBounds = provGraph.deriveIterBounds(posVar, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - - Expr minGuard = Lt::make(indexVarToExprMap[posVar], iterBounds[0]); - Expr maxGuard = Gte::make(indexVarToExprMap[posVar], iterBounds[1]); - Expr guardCondition = Or::make(minGuard, maxGuard); - if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { - guardCondition = maxGuard; - } - ir::Stmt guard = ir::IfThenElse::make(guardCondition, ir::Continue::make()); - recoverySteps.push_back(guard); - } - - Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - taco_iassert(indexVarToExprMap.count(varToRecover)); - recoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); - - // After we've recovered this index variable, some iterators are now - // accessible for use when declaring locator access variables. So, generate - // the accessors for those locator variables as part of the recovery process. - // This is necessary after a fuse transformation, for example: If we fuse - // two index variables (i, j) into f, then after we've generated the loop for - // f, all locate accessors for i and j are now available for use. - std::vector itersForVar; - for (auto& iters : iterators.levelIterators()) { - // Collect all level iterators that have locate and iterate over - // the recovered index variable. - if (iters.second.getIndexVar() == varToRecover && iters.second.hasLocate()) { - itersForVar.push_back(iters.second); - } - } - // Finally, declare all of the collected iterators' position access variables. - recoverySteps.push_back(this->declLocatePosVars(itersForVar)); - - // place underived guard - std::vector iterBounds = provGraph.deriveIterBounds(varToRecover, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - if (forallNeedsUnderivedGuards && underivedBounds.count(varToRecover) && - !provGraph.hasPosDescendant(varToRecover)) { - - // FIXME: [Olivia] Check this with someone - // Removed underived guard if indexVar is bounded is divisible by its split child indexVar - vector children = provGraph.getChildren(varToRecover); - bool hasDirectDivBound = false; - std::vector iterBoundsInner = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - for (auto& c: children) { - if (provGraph.hasExactBound(c) && - provGraph.derivationPath(varToRecover, c).size() == 2) { - const auto iterBoundsUnderivedChild = - provGraph.deriveIterBounds(c, definedIndexVarsOrdered, - underivedBounds, indexVarToExprMap, - iterators); - if (iterBoundsUnderivedChild[1].as()->getValue() % - iterBoundsInner[1].as()->getValue() == 0) { - hasDirectDivBound = true; - break; - } - } - } - if (!hasDirectDivBound) { - Stmt guard = IfThenElse::make(Gte::make(indexVarToExprMap[varToRecover], - underivedBounds[varToRecover][1]), - Continue::make()); - recoverySteps.push_back(guard); - } - } - - // If this index variable was divided into multiple equal chunks, then we - // must add an extra guard to make sure that further scheduling operations - // on descendent index variables exceed the bounds of each equal portion of - // the loop. For a concrete example, consider a loop of size 10 that is divided - // into two equal components -- 5 and 5. If the loop is then transformed - // with .split(..., 3), each inner chunk of 5 will be split into chunks of - // 3. Without an extra guard, the second chunk of 3 in the first group of 5 - // may attempt to perform an iteration for the second group of 5, which is - // incorrect. - if (this->provGraph.isDivided(varToRecover)) { - // Collect the children iteration variables. - auto children = this->provGraph.getChildren(varToRecover); - auto outer = children[0]; - auto inner = children[1]; - // Find the iteration bounds of the inner variable -- that is the size - // that the outer loop was broken into. - auto bounds = this->provGraph.deriveIterBounds(inner, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - // Use the difference between the bounds to find the size of the loop. - auto dimLen = ir::Sub::make(bounds[1], bounds[0]); - // For a variable f divided into into f1 and f2, the guard ensures that - // for iteration f, f should be within f1 * dimLen and (f1 + 1) * dimLen. - auto guard = ir::Gte::make(this->indexVarToExprMap[varToRecover], ir::Mul::make(ir::Add::make(this->indexVarToExprMap[outer], 1), dimLen)); - recoverySteps.push_back(IfThenElse::make(guard, ir::Continue::make())); - } - } - Stmt recoveryStmt = Block::make(recoverySteps); - - taco_iassert(!definedIndexVars.count(forall.getIndexVar())); - definedIndexVars.insert(forall.getIndexVar()); - definedIndexVarsOrdered.push_back(forall.getIndexVar()); - - if (forall.getParallelUnit() != ParallelUnit::NotParallel) { - taco_iassert(!parallelUnitSizes.count(forall.getParallelUnit())); - taco_iassert(!parallelUnitIndexVars.count(forall.getParallelUnit())); - parallelUnitIndexVars[forall.getParallelUnit()] = forall.getIndexVar(); - vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - parallelUnitSizes[forall.getParallelUnit()] = ir::Sub::make(bounds[1], bounds[0]); - } - - MergeLattice caseLattice = MergeLattice::make(forall, iterators, provGraph, definedIndexVars, whereTempsToResult); - vector resultAccesses; - set reducedAccesses; - std::tie(resultAccesses, reducedAccesses) = getResultAccesses(forall); - - // Pre-allocate/initialize memory of value arrays that are full below this - // loops index variable - Stmt preInitValues = initResultArrays(forall.getIndexVar(), resultAccesses, - reducedAccesses); - - // Emit temporary initialization if forall is sequential or parallelized by - // cpu threads and leads to a where statement - // This is for workspace hoisting by 1-level - vector temporaryValuesInitFree = {Stmt(), Stmt()}; - auto temp = temporaryInitialization.find(forall); - if (temp != temporaryInitialization.end() && forall.getParallelUnit() == - ParallelUnit::NotParallel && !isScalar(temp->second.getTemporary().getType())) - temporaryValuesInitFree = codeToInitializeTemporary(temp->second); - else if (temp != temporaryInitialization.end() && forall.getParallelUnit() == - ParallelUnit::CPUThread && !isScalar(temp->second.getTemporary().getType())) { - temporaryValuesInitFree = codeToInitializeTemporaryParallel(temp->second, forall.getParallelUnit()); - } - - Stmt loops; - // Emit a loop that iterates over over a single iterator (optimization) - if (caseLattice.iterators().size() == 1 && caseLattice.iterators()[0].isUnique()) { - MergeLattice loopLattice = caseLattice.getLoopLattice(); - - MergePoint point = loopLattice.points()[0]; - Iterator iterator = loopLattice.iterators()[0]; - - vector locators = point.locators(); - vector appenders; - vector inserters; - tie(appenders, inserters) = splitAppenderAndInserters(point.results()); - - std::vector underivedAncestors = provGraph.getUnderivedAncestors(iterator.getIndexVar()); - IndexVar posDescendant; - bool hasPosDescendant = false; - if (!underivedAncestors.empty()) { - hasPosDescendant = provGraph.getPosIteratorFullyDerivedDescendant(underivedAncestors[0], &posDescendant); - } - - bool isWhereProducer = false; - vector results = point.results(); - for (Iterator result : results) { - for (auto it = tensorVars.begin(); it != tensorVars.end(); it++) { - if (it->second == result.getTensor()) { - if (whereTempsToResult.count(it->first)) { - isWhereProducer = true; - break; - } - } - } - } - - // For now, this only works when consuming a single workspace. - bool canAccelWithSparseIteration = - provGraph.isFullyDerived(iterator.getIndexVar()) && - iterator.isDimensionIterator() && locators.size() == 1; - if (canAccelWithSparseIteration) { - bool indexListsExist = false; - // We are iterating over a dimension and locating into a temporary with a tracker to keep indices. Instead, we - // can just iterate over the indices and locate into the dense workspace. - for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { - if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { - indexListsExist = true; - break; - } - } - canAccelWithSparseIteration &= indexListsExist; - } - - if (!isWhereProducer && hasPosDescendant && underivedAncestors.size() > 1 && provGraph.isPosVariable(iterator.getIndexVar()) && posDescendant == forall.getIndexVar()) { - loops = lowerForallFusedPosition(forall, iterator, locators, inserters, appenders, caseLattice, - reducedAccesses, recoveryStmt); - } - else if (canAccelWithSparseIteration) { - loops = lowerForallDenseAcceleration(forall, locators, inserters, appenders, caseLattice, reducedAccesses, recoveryStmt); - } - // Emit dimension coordinate iteration loop - else if (iterator.isDimensionIterator()) { - loops = lowerForallDimension(forall, point.locators(), inserters, appenders, caseLattice, - reducedAccesses, recoveryStmt); - } - // Emit position iteration loop - else if (iterator.hasPosIter()) { - loops = lowerForallPosition(forall, iterator, locators, inserters, appenders, caseLattice, - reducedAccesses, recoveryStmt); - } - // Emit coordinate iteration loop - else { - taco_iassert(iterator.hasCoordIter()); + // For now, this only works when consuming a single workspace. + bool canAccelWithSparseIteration = + provGraph.isFullyDerived(iterator.getIndexVar()) && + iterator.isDimensionIterator() && locators.size() == 1; + if (canAccelWithSparseIteration) { + bool indexListsExist = false; + // We are iterating over a dimension and locating into a temporary with a tracker to keep indices. Instead, we + // can just iterate over the indices and locate into the dense workspace. + for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { + if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { + indexListsExist = true; + break; + } + } + canAccelWithSparseIteration &= indexListsExist; + } + + if (!isWhereProducer && hasPosDescendant && underivedAncestors.size() > 1 && provGraph.isPosVariable(iterator.getIndexVar()) && posDescendant == forall.getIndexVar()) { + loops = lowerForallFusedPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + else if (canAccelWithSparseIteration) { + loops = lowerForallDenseAcceleration(forall, locators, inserters, appenders, caseLattice, reducedAccesses, recoveryStmt); + } + // Emit dimension coordinate iteration loop + else if (iterator.isDimensionIterator()) { + loops = lowerForallDimension(forall, point.locators(), inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit position iteration loop + else if (iterator.hasPosIter()) { + loops = lowerForallPosition(forall, iterator, locators, inserters, appenders, caseLattice, + reducedAccesses, recoveryStmt); + } + // Emit coordinate iteration loop + else { + taco_iassert(iterator.hasCoordIter()); // taco_not_supported_yet - loops = Stmt(); - } - } - // Emit general loops to merge multiple iterators - else { - std::vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); - taco_iassert(underivedAncestors.size() == 1); // TODO: add support for fused coordinate of pos loop - loops = lowerMergeLattice(caseLattice, underivedAncestors[0], - forall.getStmt(), reducedAccesses); - } + loops = Stmt(); + } + } + // Emit general loops to merge multiple iterators + else { + std::vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); + taco_iassert(underivedAncestors.size() == 1); // TODO: add support for fused coordinate of pos loop + loops = lowerMergeLattice(caseLattice, underivedAncestors[0], + forall.getStmt(), reducedAccesses); + } // taco_iassert(loops.defined()); - if (!generateComputeCode() && !hasStores(loops)) { - // If assembly loop does not modify output arrays, then it can be safely - // omitted. - loops = Stmt(); - } - definedIndexVars.erase(forall.getIndexVar()); - definedIndexVarsOrdered.pop_back(); - if (forall.getParallelUnit() != ParallelUnit::NotParallel) { - inParallelLoopDepth--; - taco_iassert(parallelUnitSizes.count(forall.getParallelUnit())); - taco_iassert(parallelUnitIndexVars.count(forall.getParallelUnit())); - parallelUnitIndexVars.erase(forall.getParallelUnit()); - parallelUnitSizes.erase(forall.getParallelUnit()); - } - return Block::blanks(preInitValues, - temporaryValuesInitFree[0], - loops, - temporaryValuesInitFree[1]); -} -*/ -Stmt LowererImplImperative::lowerForall(Forall forall) { return lowerForallCloned(forall); } -Stmt LowererImplImperative::lowerForallCloned(Forall foraall) { return Stmt();} -/* -Stmt LowererImplImperative::lowerForallCloned(Forall forall) { - // want to emit guards outside of loop to prevent unstructured loop exits - - // construct guard - // underived or pos variables that have a descendant that has not been defined yet - vector varsWithGuard; - for (auto var : provGraph.getAllIndexVars()) { - if (provGraph.isRecoverable(var, definedIndexVars)) { - continue; // already recovered - } - if (provGraph.isUnderived(var) && !provGraph.hasPosDescendant(var)) { // if there is pos descendant then will be guarded already - varsWithGuard.push_back(var); - } - else if (provGraph.isPosVariable(var)) { - // if parent is coord then this is variable that will be guarded when indexing into coord array - if(provGraph.getParents(var).size() == 1 && provGraph.isCoordVariable(provGraph.getParents(var)[0])) { - varsWithGuard.push_back(var); - } - } - } - - // determine min and max values for vars given already defined variables. - // we do a recovery where we fill in undefined variables with either 0's or the max of their iteration - std::map minVarValues; - std::map maxVarValues; - set definedForGuard = definedIndexVars; - vector guardRecoverySteps; - Expr maxOffset = 0; - bool setMaxOffset = false; - - for (auto var : varsWithGuard) { - std::vector currentDefinedVarOrder = definedIndexVarsOrdered; // TODO: get defined vars at time of this recovery - - std::map minChildValues = indexVarToExprMap; - std::map maxChildValues = indexVarToExprMap; - - for (auto child : provGraph.getFullyDerivedDescendants(var)) { - if (!definedIndexVars.count(child)) { - std::vector childBounds = provGraph.deriveIterBounds(child, currentDefinedVarOrder, underivedBounds, indexVarToExprMap, iterators); - - minChildValues[child] = childBounds[0]; - maxChildValues[child] = childBounds[1]; - - // recover new parents - for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(child, definedForGuard)) { - Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, - minChildValues, iterators); - Expr maxRecoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, - maxChildValues, iterators); - if (!setMaxOffset) { // TODO: work on simplifying this - maxOffset = ir::Add::make(maxOffset, ir::Sub::make(maxRecoveredValue, recoveredValue)); - setMaxOffset = true; - } - taco_iassert(indexVarToExprMap.count(varToRecover)); - - guardRecoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); - definedForGuard.insert(varToRecover); - } - definedForGuard.insert(child); - } - } - - minVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, minChildValues, iterators); - maxVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, maxChildValues, iterators); - } - - // Build guards - Expr guardCondition; - for (auto var : varsWithGuard) { - std::vector iterBounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - - Expr minGuard = Lt::make(minVarValues[var], iterBounds[0]); - Expr maxGuard = Gte::make(ir::Add::make(maxVarValues[var], ir::simplify(maxOffset)), iterBounds[1]); - Expr guardConditionCurrent = Or::make(minGuard, maxGuard); - - if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { - guardConditionCurrent = maxGuard; - } - - if (guardCondition.defined()) { - guardCondition = Or::make(guardConditionCurrent, guardCondition); - } - else { - guardCondition = guardConditionCurrent; - } - } - - Stmt unvectorizedLoop; - - taco_uassert(guardCondition.defined()) - << "Unable to vectorize or unroll loop over unbound variable " << forall.getIndexVar(); - - // build loop with guards (not vectorized) - if (!varsWithGuard.empty()) { - ignoreVectorize = true; - unvectorizedLoop = lowerForall(forall); - ignoreVectorize = false; - } - - // build loop without guards - emitUnderivedGuards = false; - Stmt vectorizedLoop = lowerForall(forall); - emitUnderivedGuards = true; + if (!generateComputeCode() && !hasStores(loops)) { + // If assembly loop does not modify output arrays, then it can be safely + // omitted. + loops = Stmt(); + } + definedIndexVars.erase(forall.getIndexVar()); + definedIndexVarsOrdered.pop_back(); + if (forall.getParallelUnit() != ParallelUnit::NotParallel) { + inParallelLoopDepth--; + taco_iassert(parallelUnitSizes.count(forall.getParallelUnit())); + taco_iassert(parallelUnitIndexVars.count(forall.getParallelUnit())); + parallelUnitIndexVars.erase(forall.getParallelUnit()); + parallelUnitSizes.erase(forall.getParallelUnit()); + } + return Block::blanks(preInitValues, + temporaryValuesInitFree[0], + loops, + temporaryValuesInitFree[1]); + } - // return guarded loops - return Block::make(Block::make(guardRecoverySteps), IfThenElse::make(guardCondition, unvectorizedLoop, vectorizedLoop)); -} -*/ -Stmt LowererImplImperative::searchForFusedPositionStart(Forall forall, Iterator posIterator) { - vector searchForUnderivedStart; - vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); - ir::Expr last_block_start_temporary; - for (int i = (int) underivedAncestors.size() - 2; i >= 0; i--) { - Iterator posIteratorLevel = posIterator; - for (int j = (int) underivedAncestors.size() - 2; j > i; j--) { // take parent of iterator enough times to get correct level - posIteratorLevel = posIteratorLevel.getParent(); - } - - // want to get size of pos array not of crd_array - ir::Expr parentSize = 1; // to find size of segment walk down sizes of iterator chain - Iterator rootIterator = posIterator; - while (!rootIterator.isRoot()) { - rootIterator = rootIterator.getParent(); - } - while (rootIterator.getChild() != posIteratorLevel) { - rootIterator = rootIterator.getChild(); - if (rootIterator.hasAppend()) { - parentSize = rootIterator.getSize(parentSize); - } else if (rootIterator.hasInsert()) { - parentSize = ir::Mul::make(parentSize, rootIterator.getWidth()); - } - } - - // emit bounds search on cpu just bounds, on gpu search in blocks - if (parallelUnitIndexVars.count(ParallelUnit::GPUBlock)) { - Expr values_per_block; - { - // we do a recovery where we fill in undefined variables with 0's to get start target (just like for vector guards) - std::map zeroedChildValues = indexVarToExprMap; - zeroedChildValues[parallelUnitIndexVars[ParallelUnit::GPUBlock]] = 1; - set zeroDefinedIndexVars = {parallelUnitIndexVars[ParallelUnit::GPUBlock]}; - for (IndexVar child : provGraph.getFullyDerivedDescendants(posIterator.getIndexVar())) { - if (child != parallelUnitIndexVars[ParallelUnit::GPUBlock]) { - zeroedChildValues[child] = 0; - - // recover new parents - for (const IndexVar &varToRecover : provGraph.newlyRecoverableParents(child, zeroDefinedIndexVars)) { - Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, - zeroedChildValues, iterators); - taco_iassert(indexVarToExprMap.count(varToRecover)); - zeroedChildValues[varToRecover] = recoveredValue; - zeroDefinedIndexVars.insert(varToRecover); - if (varToRecover == posIterator.getIndexVar()) { - break; - } - } - zeroDefinedIndexVars.insert(child); - } - } - values_per_block = zeroedChildValues[posIterator.getIndexVar()]; - } - - IndexVar underived = underivedAncestors[i]; - ir::Expr blockStarts_temporary = ir::Var::make(underived.getName() + "_blockStarts", - getCoordinateVar(underived).type(), true, false); - header.push_back(ir::VarDecl::make(blockStarts_temporary, 0)); - header.push_back( - Allocate::make(blockStarts_temporary, ir::Add::make(parallelUnitSizes[ParallelUnit::GPUBlock], 1))); - footer.push_back(Free::make(blockStarts_temporary)); - - - Expr blockSize; - if (parallelUnitSizes.count(ParallelUnit::GPUThread)) { - blockSize = parallelUnitSizes[ParallelUnit::GPUThread]; - if (parallelUnitSizes.count(ParallelUnit::GPUWarp)) { - blockSize = ir::Mul::make(blockSize, parallelUnitSizes[ParallelUnit::GPUWarp]); - } - } else { - std::vector definedIndexVarsMatched = definedIndexVarsOrdered; - // find sub forall that tells us block size - match(forall.getStmt(), - function([&]( - const ForallNode *n, Matcher *m) { - if (n->parallel_unit == ParallelUnit::GPUThread) { - vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsMatched, - underivedBounds, indexVarToExprMap, iterators); - blockSize = ir::Sub::make(bounds[1], bounds[0]); - } - definedIndexVarsMatched.push_back(n->indexVar); - }) - ); - } - taco_iassert(blockSize.defined()); - - if (i == (int) underivedAncestors.size() - 2) { - std::vector args = { - posIteratorLevel.getMode().getModePack().getArray(0), // array - blockStarts_temporary, // results - ir::Literal::zero(posIteratorLevel.getBeginVar().type()), // arrayStart - parentSize, // arrayEnd - values_per_block, // values_per_block - blockSize, // block_size - parallelUnitSizes[ParallelUnit::GPUBlock] // num_blocks - }; - header.push_back(ir::Assign::make(blockStarts_temporary, - ir::Call::make("taco_binarySearchBeforeBlockLaunch", args, - getCoordinateVar(underived).type()))); - } - else { - std::vector args = { - posIteratorLevel.getMode().getModePack().getArray(0), // array - blockStarts_temporary, // results - ir::Literal::zero(posIteratorLevel.getBeginVar().type()), // arrayStart - parentSize, // arrayEnd - last_block_start_temporary, // targets - blockSize, // block_size - parallelUnitSizes[ParallelUnit::GPUBlock] // num_blocks - }; - header.push_back(ir::Assign::make(blockStarts_temporary, - ir::Call::make("taco_binarySearchIndirectBeforeBlockLaunch", args, - getCoordinateVar(underived).type()))); - } - searchForUnderivedStart.push_back(VarDecl::make(posIteratorLevel.getBeginVar(), - ir::Load::make(blockStarts_temporary, - indexVarToExprMap[parallelUnitIndexVars[ParallelUnit::GPUBlock]]))); - searchForUnderivedStart.push_back(VarDecl::make(posIteratorLevel.getEndVar(), - ir::Load::make(blockStarts_temporary, ir::Add::make( - indexVarToExprMap[parallelUnitIndexVars[ParallelUnit::GPUBlock]], - 1)))); - last_block_start_temporary = blockStarts_temporary; - } else { - header.push_back(VarDecl::make(posIteratorLevel.getBeginVar(), ir::Literal::zero(posIteratorLevel.getBeginVar().type()))); - header.push_back(VarDecl::make(posIteratorLevel.getEndVar(), parentSize)); - } - - // we do a recovery where we fill in undefined variables with 0's to get start target (just like for vector guards) - Expr underivedStartTarget; - if (i == (int) underivedAncestors.size() - 2) { - std::map minChildValues = indexVarToExprMap; - set minDefinedIndexVars = definedIndexVars; - minDefinedIndexVars.erase(forall.getIndexVar()); - - for (IndexVar child : provGraph.getFullyDerivedDescendants(posIterator.getIndexVar())) { - if (!minDefinedIndexVars.count(child)) { - std::vector childBounds = provGraph.deriveIterBounds(child, definedIndexVarsOrdered, - underivedBounds, - indexVarToExprMap, iterators); - minChildValues[child] = childBounds[0]; - - // recover new parents - for (const IndexVar &varToRecover : provGraph.newlyRecoverableParents(child, minDefinedIndexVars)) { - Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, - minChildValues, iterators); - taco_iassert(indexVarToExprMap.count(varToRecover)); - searchForUnderivedStart.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); - minDefinedIndexVars.insert(varToRecover); - if (varToRecover == posIterator.getIndexVar()) { - break; +//Stmt LowererImplImperative::lowerForall(Forall forall) { return lowerForallCloned(forall); } +//Stmt LowererImplImperative::lowerForallCloned(Forall foraall) { return Stmt();} + + Stmt LowererImplImperative::lowerForallCloned(Forall forall) { + // want to emit guards outside of loop to prevent unstructured loop exits + + // construct guard + // underived or pos variables that have a descendant that has not been defined yet + vector varsWithGuard; + for (auto var : provGraph.getAllIndexVars()) { + if (provGraph.isRecoverable(var, definedIndexVars)) { + continue; // already recovered + } + if (provGraph.isUnderived(var) && !provGraph.hasPosDescendant(var)) { // if there is pos descendant then will be guarded already + varsWithGuard.push_back(var); + } + else if (provGraph.isPosVariable(var)) { + // if parent is coord then this is variable that will be guarded when indexing into coord array + if(provGraph.getParents(var).size() == 1 && provGraph.isCoordVariable(provGraph.getParents(var)[0])) { + varsWithGuard.push_back(var); + } } - } - minDefinedIndexVars.insert(child); } - } - underivedStartTarget = indexVarToExprMap[posIterator.getIndexVar()]; - } - else { - underivedStartTarget = this->iterators.modeIterator(underivedAncestors[i+1]).getPosVar(); - } - vector binarySearchArgs = { - posIteratorLevel.getMode().getModePack().getArray(0), // array - posIteratorLevel.getBeginVar(), // arrayStart - posIteratorLevel.getEndVar(), // arrayEnd - underivedStartTarget // target - }; - Expr posVarUnknown = this->iterators.modeIterator(underivedAncestors[i]).getPosVar(); - searchForUnderivedStart.push_back(ir::VarDecl::make(posVarUnknown, - ir::Call::make("taco_binarySearchBefore", binarySearchArgs, - getCoordinateVar(underivedAncestors[i]).type()))); - Stmt locateCoordVar; - if (posIteratorLevel.getParent().hasPosIter()) { - locateCoordVar = ir::VarDecl::make(indexVarToExprMap[underivedAncestors[i]], ir::Load::make(posIteratorLevel.getParent().getMode().getModePack().getArray(1), posVarUnknown)); - } - else { - locateCoordVar = ir::VarDecl::make(indexVarToExprMap[underivedAncestors[i]], posVarUnknown); - } - searchForUnderivedStart.push_back(locateCoordVar); - } - return ir::Block::make(searchForUnderivedStart); -} + // determine min and max values for vars given already defined variables. + // we do a recovery where we fill in undefined variables with either 0's or the max of their iteration + std::map minVarValues; + std::map maxVarValues; + set definedForGuard = definedIndexVars; + vector guardRecoverySteps; + Expr maxOffset = 0; + bool setMaxOffset = false; + + for (auto var : varsWithGuard) { + std::vector currentDefinedVarOrder = definedIndexVarsOrdered; // TODO: get defined vars at time of this recovery + + std::map minChildValues = indexVarToExprMap; + std::map maxChildValues = indexVarToExprMap; + + for (auto child : provGraph.getFullyDerivedDescendants(var)) { + if (!definedIndexVars.count(child)) { + std::vector childBounds = provGraph.deriveIterBounds(child, currentDefinedVarOrder, underivedBounds, indexVarToExprMap, iterators); + + minChildValues[child] = childBounds[0]; + maxChildValues[child] = childBounds[1]; + + // recover new parents + for (const IndexVar& varToRecover : provGraph.newlyRecoverableParents(child, definedForGuard)) { + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + minChildValues, iterators); + Expr maxRecoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + maxChildValues, iterators); + if (!setMaxOffset) { // TODO: work on simplifying this + maxOffset = ir::Add::make(maxOffset, ir::Sub::make(maxRecoveredValue, recoveredValue)); + setMaxOffset = true; + } + taco_iassert(indexVarToExprMap.count(varToRecover)); + + guardRecoverySteps.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + definedForGuard.insert(varToRecover); + } + definedForGuard.insert(child); + } + } -Stmt LowererImplImperative::lowerForallDimension(Forall forall, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - set reducedAccesses, - ir::Stmt recoveryStmt) -{ - Expr coordinate = getCoordinateVar(forall.getIndexVar()); - - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth++; - atomicParallelUnit = forall.getParallelUnit(); - } - - Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, - appenders, caseLattice, reducedAccesses); - - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth--; - } - - body = Block::make({recoveryStmt, body}); - - Stmt posAppend = generateAppendPositions(appenders); - - // Emit loop with preamble and postamble - std::vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - - LoopKind kind = LoopKind::Serial; - if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { - kind = LoopKind::Vectorized; - } - else if (forall.getParallelUnit() != ParallelUnit::NotParallel - && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { - kind = LoopKind::Runtime; - } - - return Block::blanks(For::make(coordinate, bounds[0], bounds[1], 1, body, - kind, - ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor()), - posAppend); -} + minVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, minChildValues, iterators); + maxVarValues[var] = provGraph.recoverVariable(var, currentDefinedVarOrder, underivedBounds, maxChildValues, iterators); + } - Stmt LowererImplImperative::lowerForallDenseAcceleration(Forall forall, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - set reducedAccesses, - ir::Stmt recoveryStmt) - { - taco_iassert(locators.size() == 1) << "Optimizing a dense workspace is only supported when the consumer is the only RHS tensor"; - taco_iassert(provGraph.isFullyDerived(forall.getIndexVar())) << "Sparsely accelerating a dense workspace only works with fully derived index vars"; - taco_iassert(forall.getParallelUnit() == ParallelUnit::NotParallel) << "Sparsely accelerating a dense workspace only works within serial loops"; + // Build guards + Expr guardCondition; + for (auto var : varsWithGuard) { + std::vector iterBounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + Expr minGuard = Lt::make(minVarValues[var], iterBounds[0]); + Expr maxGuard = Gte::make(ir::Add::make(maxVarValues[var], ir::simplify(maxOffset)), iterBounds[1]); + Expr guardConditionCurrent = Or::make(minGuard, maxGuard); - TensorVar var; - for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { - if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { - var = it->first; - break; - } - } + if (isa(ir::simplify(iterBounds[0])) && ir::simplify(iterBounds[0]).as()->equalsScalar(0)) { + guardConditionCurrent = maxGuard; + } - Expr indexList = tempToIndexList.at(var); - Expr indexListSize = tempToIndexListSize.at(var); - Expr bitGuard = tempToBitGuard.at(var); - Expr loopVar = ir::Var::make(var.getName() + "_index_locator", taco::Int32, false, false); - Expr coordinate = getCoordinateVar(forall.getIndexVar()); + if (guardCondition.defined()) { + guardCondition = Or::make(guardConditionCurrent, guardCondition); + } + else { + guardCondition = guardConditionCurrent; + } + } - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth++; - atomicParallelUnit = forall.getParallelUnit(); - } + Stmt unvectorizedLoop; + + taco_uassert(guardCondition.defined()) + << "Unable to vectorize or unroll loop over unbound variable " << forall.getIndexVar(); + + // build loop with guards (not vectorized) + if (!varsWithGuard.empty()) { + ignoreVectorize = true; + unvectorizedLoop = lowerForall(forall); + ignoreVectorize = false; + } - Stmt declareVar = VarDecl::make(coordinate, Load::make(indexList, loopVar)); - Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, appenders, caseLattice, reducedAccesses); - Stmt resetGuard = ir::Store::make(bitGuard, coordinate, ir::Literal::make(false), markAssignsAtomicDepth > 0, atomicParallelUnit); + // build loop without guards + emitUnderivedGuards = false; + Stmt vectorizedLoop = lowerForall(forall); + emitUnderivedGuards = true; - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth--; + // return guarded loops + return Block::make(Block::make(guardRecoverySteps), IfThenElse::make(guardCondition, unvectorizedLoop, vectorizedLoop)); } - body = Block::make(declareVar, recoveryStmt, body, resetGuard); + Stmt LowererImplImperative::searchForFusedPositionStart(Forall forall, Iterator posIterator) { + vector searchForUnderivedStart; + vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); + ir::Expr last_block_start_temporary; + for (int i = (int) underivedAncestors.size() - 2; i >= 0; i--) { + Iterator posIteratorLevel = posIterator; + for (int j = (int) underivedAncestors.size() - 2; j > i; j--) { // take parent of iterator enough times to get correct level + posIteratorLevel = posIteratorLevel.getParent(); + } - Stmt posAppend = generateAppendPositions(appenders); + // want to get size of pos array not of crd_array + ir::Expr parentSize = 1; // to find size of segment walk down sizes of iterator chain + Iterator rootIterator = posIterator; + while (!rootIterator.isRoot()) { + rootIterator = rootIterator.getParent(); + } + while (rootIterator.getChild() != posIteratorLevel) { + rootIterator = rootIterator.getChild(); + if (rootIterator.hasAppend()) { + parentSize = rootIterator.getSize(parentSize); + } else if (rootIterator.hasInsert()) { + parentSize = ir::Mul::make(parentSize, rootIterator.getWidth()); + } + } - LoopKind kind = LoopKind::Serial; - if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { - kind = LoopKind::Vectorized; - } - else if (forall.getParallelUnit() != ParallelUnit::NotParallel - && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { - kind = LoopKind::Runtime; - } + // emit bounds search on cpu just bounds, on gpu search in blocks + if (parallelUnitIndexVars.count(ParallelUnit::GPUBlock)) { + Expr values_per_block; + { + // we do a recovery where we fill in undefined variables with 0's to get start target (just like for vector guards) + std::map zeroedChildValues = indexVarToExprMap; + zeroedChildValues[parallelUnitIndexVars[ParallelUnit::GPUBlock]] = 1; + set zeroDefinedIndexVars = {parallelUnitIndexVars[ParallelUnit::GPUBlock]}; + for (IndexVar child : provGraph.getFullyDerivedDescendants(posIterator.getIndexVar())) { + if (child != parallelUnitIndexVars[ParallelUnit::GPUBlock]) { + zeroedChildValues[child] = 0; + + // recover new parents + for (const IndexVar &varToRecover : provGraph.newlyRecoverableParents(child, zeroDefinedIndexVars)) { + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + zeroedChildValues, iterators); + taco_iassert(indexVarToExprMap.count(varToRecover)); + zeroedChildValues[varToRecover] = recoveredValue; + zeroDefinedIndexVars.insert(varToRecover); + if (varToRecover == posIterator.getIndexVar()) { + break; + } + } + zeroDefinedIndexVars.insert(child); + } + } + values_per_block = zeroedChildValues[posIterator.getIndexVar()]; + } + + IndexVar underived = underivedAncestors[i]; + ir::Expr blockStarts_temporary = ir::Var::make(underived.getName() + "_blockStarts", + getCoordinateVar(underived).type(), true, false); + header.push_back(ir::VarDecl::make(blockStarts_temporary, 0)); + header.push_back( + Allocate::make(blockStarts_temporary, ir::Add::make(parallelUnitSizes[ParallelUnit::GPUBlock], 1))); + footer.push_back(Free::make(blockStarts_temporary)); + + + Expr blockSize; + if (parallelUnitSizes.count(ParallelUnit::GPUThread)) { + blockSize = parallelUnitSizes[ParallelUnit::GPUThread]; + if (parallelUnitSizes.count(ParallelUnit::GPUWarp)) { + blockSize = ir::Mul::make(blockSize, parallelUnitSizes[ParallelUnit::GPUWarp]); + } + } else { + std::vector definedIndexVarsMatched = definedIndexVarsOrdered; + // find sub forall that tells us block size + match(forall.getStmt(), + function([&]( + const ForallNode *n, Matcher *m) { + if (n->parallel_unit == ParallelUnit::GPUThread) { + vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsMatched, + underivedBounds, indexVarToExprMap, iterators); + blockSize = ir::Sub::make(bounds[1], bounds[0]); + } + definedIndexVarsMatched.push_back(n->indexVar); + }) + ); + } + taco_iassert(blockSize.defined()); + + if (i == (int) underivedAncestors.size() - 2) { + std::vector args = { + posIteratorLevel.getMode().getModePack().getArray(0), // array + blockStarts_temporary, // results + ir::Literal::zero(posIteratorLevel.getBeginVar().type()), // arrayStart + parentSize, // arrayEnd + values_per_block, // values_per_block + blockSize, // block_size + parallelUnitSizes[ParallelUnit::GPUBlock] // num_blocks + }; + header.push_back(ir::Assign::make(blockStarts_temporary, + ir::Call::make("taco_binarySearchBeforeBlockLaunch", args, + getCoordinateVar(underived).type()))); + } + else { + std::vector args = { + posIteratorLevel.getMode().getModePack().getArray(0), // array + blockStarts_temporary, // results + ir::Literal::zero(posIteratorLevel.getBeginVar().type()), // arrayStart + parentSize, // arrayEnd + last_block_start_temporary, // targets + blockSize, // block_size + parallelUnitSizes[ParallelUnit::GPUBlock] // num_blocks + }; + header.push_back(ir::Assign::make(blockStarts_temporary, + ir::Call::make("taco_binarySearchIndirectBeforeBlockLaunch", args, + getCoordinateVar(underived).type()))); + } + searchForUnderivedStart.push_back(VarDecl::make(posIteratorLevel.getBeginVar(), + ir::Load::make(blockStarts_temporary, + indexVarToExprMap[parallelUnitIndexVars[ParallelUnit::GPUBlock]]))); + searchForUnderivedStart.push_back(VarDecl::make(posIteratorLevel.getEndVar(), + ir::Load::make(blockStarts_temporary, ir::Add::make( + indexVarToExprMap[parallelUnitIndexVars[ParallelUnit::GPUBlock]], + 1)))); + last_block_start_temporary = blockStarts_temporary; + } else { + header.push_back(VarDecl::make(posIteratorLevel.getBeginVar(), ir::Literal::zero(posIteratorLevel.getBeginVar().type()))); + header.push_back(VarDecl::make(posIteratorLevel.getEndVar(), parentSize)); + } - return Block::blanks(For::make(loopVar, 0, indexListSize, 1, body, kind, - ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), - ignoreVectorize ? 0 : forall.getUnrollFactor()), - posAppend); - } + // we do a recovery where we fill in undefined variables with 0's to get start target (just like for vector guards) + Expr underivedStartTarget; + if (i == (int) underivedAncestors.size() - 2) { + std::map minChildValues = indexVarToExprMap; + set minDefinedIndexVars = definedIndexVars; + minDefinedIndexVars.erase(forall.getIndexVar()); + + for (IndexVar child : provGraph.getFullyDerivedDescendants(posIterator.getIndexVar())) { + if (!minDefinedIndexVars.count(child)) { + std::vector childBounds = provGraph.deriveIterBounds(child, definedIndexVarsOrdered, + underivedBounds, + indexVarToExprMap, iterators); + minChildValues[child] = childBounds[0]; + + // recover new parents + for (const IndexVar &varToRecover : provGraph.newlyRecoverableParents(child, minDefinedIndexVars)) { + Expr recoveredValue = provGraph.recoverVariable(varToRecover, definedIndexVarsOrdered, underivedBounds, + minChildValues, iterators); + taco_iassert(indexVarToExprMap.count(varToRecover)); + searchForUnderivedStart.push_back(VarDecl::make(indexVarToExprMap[varToRecover], recoveredValue)); + minDefinedIndexVars.insert(varToRecover); + if (varToRecover == posIterator.getIndexVar()) { + break; + } + } + minDefinedIndexVars.insert(child); + } + } + underivedStartTarget = indexVarToExprMap[posIterator.getIndexVar()]; + } + else { + underivedStartTarget = this->iterators.modeIterator(underivedAncestors[i+1]).getPosVar(); + } -Stmt LowererImplImperative::lowerForallCoordinate(Forall forall, Iterator iterator, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - set reducedAccesses, - ir::Stmt recoveryStmt) { - taco_not_supported_yet; - return Stmt(); -} + vector binarySearchArgs = { + posIteratorLevel.getMode().getModePack().getArray(0), // array + posIteratorLevel.getBeginVar(), // arrayStart + posIteratorLevel.getEndVar(), // arrayEnd + underivedStartTarget // target + }; + Expr posVarUnknown = this->iterators.modeIterator(underivedAncestors[i]).getPosVar(); + searchForUnderivedStart.push_back(ir::VarDecl::make(posVarUnknown, + ir::Call::make("taco_binarySearchBefore", binarySearchArgs, + getCoordinateVar(underivedAncestors[i]).type()))); + Stmt locateCoordVar; + if (posIteratorLevel.getParent().hasPosIter()) { + locateCoordVar = ir::VarDecl::make(indexVarToExprMap[underivedAncestors[i]], ir::Load::make(posIteratorLevel.getParent().getMode().getModePack().getArray(1), posVarUnknown)); + } + else { + locateCoordVar = ir::VarDecl::make(indexVarToExprMap[underivedAncestors[i]], posVarUnknown); + } + searchForUnderivedStart.push_back(locateCoordVar); + } + return ir::Block::make(searchForUnderivedStart); + } + + Stmt LowererImplImperative::lowerForallDimension(Forall forall, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + set reducedAccesses, + ir::Stmt recoveryStmt) + { + Expr coordinate = getCoordinateVar(forall.getIndexVar()); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth++; + atomicParallelUnit = forall.getParallelUnit(); + } -Stmt LowererImplImperative::lowerForallPosition(Forall forall, Iterator iterator, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - set reducedAccesses, - ir::Stmt recoveryStmt) -{ - Expr coordinate = getCoordinateVar(forall.getIndexVar()); - Stmt declareCoordinate = Stmt(); - Stmt strideGuard = Stmt(); - Stmt boundsGuard = Stmt(); - if (provGraph.isCoordVariable(forall.getIndexVar())) { - Expr coordinateArray = iterator.posAccess(iterator.getPosVar(), - coordinates(iterator)).getResults()[0]; - // If the iterator is windowed, we must recover the coordinate index - // variable from the windowed space. - if (iterator.isWindowed()) { - if (iterator.isStrided()) { - // In this case, we're iterating over a compressed level with a for - // loop. Since the iterator variable will get incremented by the for - // loop, the guard introduced for stride checking doesn't need to - // increment the iterator variable. - strideGuard = this->strideBoundsGuard(iterator, coordinateArray, false /* incrementPosVar */); - } - coordinateArray = this->projectWindowedPositionToCanonicalSpace(iterator, coordinateArray); - // If this forall is being parallelized via CPU threads (OpenMP), then we can't - // emit a `break` statement, since OpenMP doesn't support breaking out of a - // parallel loop. Instead, we'll bound the top of the loop and omit the check. - if (forall.getParallelUnit() != ParallelUnit::CPUThread) { - boundsGuard = this->upperBoundGuardForWindowPosition(iterator, coordinate); - } - } - declareCoordinate = VarDecl::make(coordinate, coordinateArray); - } - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth++; - } - - Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, appenders, caseLattice, reducedAccesses); - - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth--; - } - - body = Block::make(recoveryStmt, body); - - // Code to append positions - Stmt posAppend = generateAppendPositions(appenders); - - // Code to compute iteration bounds - Stmt boundsCompute; - Expr startBound, endBound; - Expr parentPos = iterator.getParent().getPosVar(); - if (!provGraph.isUnderived(iterator.getIndexVar())) { - vector bounds = provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - startBound = bounds[0]; - endBound = bounds[1]; - } - else if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { - // E.g. a compressed mode without duplicates - ModeFunction bounds = iterator.posBounds(parentPos); - boundsCompute = bounds.compute(); - startBound = bounds[0]; - endBound = bounds[1]; - // If we have a window on this iterator, then search for the start of - // the window rather than starting at the beginning of the level. - if (iterator.isWindowed()) { - auto startBoundCopy = startBound; - startBound = this->searchForStartOfWindowPosition(iterator, startBound, endBound); - // As discussed above, if this position loop is parallelized over CPU - // threads (OpenMP), then we need to have an explicit upper bound to - // the for loop, instead of breaking out of the loop in the middle. - if (forall.getParallelUnit() == ParallelUnit::CPUThread) { - endBound = this->searchForEndOfWindowPosition(iterator, startBoundCopy, endBound); - } - } - } else { - taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); - taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); - - // E.g. a compressed mode with duplicates. Apply iterator chaining - Expr parentSegend = iterator.getParent().getSegendVar(); - ModeFunction startBounds = iterator.posBounds(parentPos); - ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); - boundsCompute = Block::make(startBounds.compute(), endBounds.compute()); - startBound = startBounds[0]; - endBound = endBounds[1]; - } - - LoopKind kind = LoopKind::Serial; - if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { - kind = LoopKind::Vectorized; - } - else if (forall.getParallelUnit() != ParallelUnit::NotParallel - && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { - kind = LoopKind::Runtime; - } - - // Loop with preamble and postamble - return Block::blanks( - boundsCompute, - For::make(iterator.getPosVar(), startBound, endBound, 1, - Block::make(strideGuard, declareCoordinate, boundsGuard, body), - kind, - ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor()), - posAppend); + Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, + appenders, caseLattice, reducedAccesses); -} + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth--; + } + + body = Block::make({recoveryStmt, body}); + + Stmt posAppend = generateAppendPositions(appenders); + + // Emit loop with preamble and postamble + std::vector bounds = provGraph.deriveIterBounds(forall.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + + LoopKind kind = LoopKind::Serial; + if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { + kind = LoopKind::Vectorized; + } + else if (forall.getParallelUnit() != ParallelUnit::NotParallel + && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { + kind = LoopKind::Runtime; + } + + return Block::blanks(For::make(coordinate, bounds[0], bounds[1], 1, body, + kind, + ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor()), + posAppend); + } + + Stmt LowererImplImperative::lowerForallDenseAcceleration(Forall forall, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + set reducedAccesses, + ir::Stmt recoveryStmt) + { + taco_iassert(locators.size() == 1) << "Optimizing a dense workspace is only supported when the consumer is the only RHS tensor"; + taco_iassert(provGraph.isFullyDerived(forall.getIndexVar())) << "Sparsely accelerating a dense workspace only works with fully derived index vars"; + taco_iassert(forall.getParallelUnit() == ParallelUnit::NotParallel) << "Sparsely accelerating a dense workspace only works within serial loops"; + + + TensorVar var; + for (auto it = tensorVars.begin(); it != tensorVars.end(); ++it) { + if (it->second == locators[0].getTensor() && util::contains(tempToIndexList, it->first)) { + var = it->first; + break; + } + } + + Expr indexList = tempToIndexList.at(var); + Expr indexListSize = tempToIndexListSize.at(var); + Expr bitGuard = tempToBitGuard.at(var); + Expr loopVar = ir::Var::make(var.getName() + "_index_locator", taco::Int32, false, false); + Expr coordinate = getCoordinateVar(forall.getIndexVar()); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth++; + atomicParallelUnit = forall.getParallelUnit(); + } + + Stmt declareVar = VarDecl::make(coordinate, Load::make(indexList, loopVar)); + Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, appenders, caseLattice, reducedAccesses); + Stmt resetGuard = ir::Store::make(bitGuard, coordinate, ir::Literal::make(false), markAssignsAtomicDepth > 0, atomicParallelUnit); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth--; + } + + body = Block::make(declareVar, recoveryStmt, body, resetGuard); + + Stmt posAppend = generateAppendPositions(appenders); -Stmt LowererImplImperative::lowerForallFusedPosition(Forall forall, Iterator iterator, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - set reducedAccesses, - ir::Stmt recoveryStmt) -{ - Expr coordinate = getCoordinateVar(forall.getIndexVar()); - Stmt declareCoordinate = Stmt(); - if (provGraph.isCoordVariable(forall.getIndexVar())) { - Expr coordinateArray = iterator.posAccess(iterator.getPosVar(), - coordinates(iterator)).getResults()[0]; - declareCoordinate = VarDecl::make(coordinate, coordinateArray); - } - - // declare upper-level underived ancestors that will be tracked with while loops - Expr writeResultCond; - vector loopsToTrackUnderived; - vector searchForUnderivedStart; - std::map> coordinateBounds = provGraph.deriveCoordBounds(definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); - if (underivedAncestors.size() > 1) { - // each underived ancestor is initialized to min coordinate bound - IndexVar posIteratorVar; + LoopKind kind = LoopKind::Serial; + if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { + kind = LoopKind::Vectorized; + } + else if (forall.getParallelUnit() != ParallelUnit::NotParallel + && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { + kind = LoopKind::Runtime; + } + + return Block::blanks(For::make(loopVar, 0, indexListSize, 1, body, kind, + ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), + ignoreVectorize ? 0 : forall.getUnrollFactor()), + posAppend); + } + + Stmt LowererImplImperative::lowerForallCoordinate(Forall forall, Iterator iterator, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + set reducedAccesses, + ir::Stmt recoveryStmt) { + taco_not_supported_yet; + return Stmt(); + } + + Stmt LowererImplImperative::lowerForallPosition(Forall forall, Iterator iterator, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + set reducedAccesses, + ir::Stmt recoveryStmt) + { + Expr coordinate = getCoordinateVar(forall.getIndexVar()); + Stmt declareCoordinate = Stmt(); + Stmt strideGuard = Stmt(); + Stmt boundsGuard = Stmt(); + if (provGraph.isCoordVariable(forall.getIndexVar())) { + Expr coordinateArray = iterator.posAccess(iterator.getPosVar(), + coordinates(iterator)).getResults()[0]; + // If the iterator is windowed, we must recover the coordinate index + // variable from the windowed space. + if (iterator.isWindowed()) { + if (iterator.isStrided()) { + // In this case, we're iterating over a compressed level with a for + // loop. Since the iterator variable will get incremented by the for + // loop, the guard introduced for stride checking doesn't need to + // increment the iterator variable. + strideGuard = this->strideBoundsGuard(iterator, coordinateArray, false /* incrementPosVar */); + } + coordinateArray = this->projectWindowedPositionToCanonicalSpace(iterator, coordinateArray); + // If this forall is being parallelized via CPU threads (OpenMP), then we can't + // emit a `break` statement, since OpenMP doesn't support breaking out of a + // parallel loop. Instead, we'll bound the top of the loop and omit the check. + if (forall.getParallelUnit() != ParallelUnit::CPUThread) { + boundsGuard = this->upperBoundGuardForWindowPosition(iterator, coordinate); + } + } + declareCoordinate = VarDecl::make(coordinate, coordinateArray); + } + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth++; + } + + Stmt body = lowerForallBody(coordinate, forall.getStmt(), locators, inserters, appenders, caseLattice, reducedAccesses); + + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth--; + } + + body = Block::make(recoveryStmt, body); + + // Code to append positions + Stmt posAppend = generateAppendPositions(appenders); + + // Code to compute iteration bounds + Stmt boundsCompute; + Expr startBound, endBound; + Expr parentPos = iterator.getParent().getPosVar(); + if (!provGraph.isUnderived(iterator.getIndexVar())) { + vector bounds = provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + startBound = bounds[0]; + endBound = bounds[1]; + } + else if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { + // E.g. a compressed mode without duplicates + ModeFunction bounds = iterator.posBounds(parentPos); + boundsCompute = bounds.compute(); + startBound = bounds[0]; + endBound = bounds[1]; + // If we have a window on this iterator, then search for the start of + // the window rather than starting at the beginning of the level. + if (iterator.isWindowed()) { + auto startBoundCopy = startBound; + startBound = this->searchForStartOfWindowPosition(iterator, startBound, endBound); + // As discussed above, if this position loop is parallelized over CPU + // threads (OpenMP), then we need to have an explicit upper bound to + // the for loop, instead of breaking out of the loop in the middle. + if (forall.getParallelUnit() == ParallelUnit::CPUThread) { + endBound = this->searchForEndOfWindowPosition(iterator, startBoundCopy, endBound); + } + } + } else { + taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); + taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); + + // E.g. a compressed mode with duplicates. Apply iterator chaining + Expr parentSegend = iterator.getParent().getSegendVar(); + ModeFunction startBounds = iterator.posBounds(parentPos); + ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); + boundsCompute = Block::make(startBounds.compute(), endBounds.compute()); + startBound = startBounds[0]; + endBound = endBounds[1]; + } + + LoopKind kind = LoopKind::Serial; + if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { + kind = LoopKind::Vectorized; + } + else if (forall.getParallelUnit() != ParallelUnit::NotParallel + && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { + kind = LoopKind::Runtime; + } + + // Loop with preamble and postamble + return Block::blanks( + boundsCompute, + For::make(iterator.getPosVar(), startBound, endBound, 1, + Block::make(strideGuard, declareCoordinate, boundsGuard, body), + kind, + ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor()), + posAppend); + + } + + Stmt LowererImplImperative::lowerForallFusedPosition(Forall forall, Iterator iterator, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + set reducedAccesses, + ir::Stmt recoveryStmt) + { + Expr coordinate = getCoordinateVar(forall.getIndexVar()); + Stmt declareCoordinate = Stmt(); + if (provGraph.isCoordVariable(forall.getIndexVar())) { + Expr coordinateArray = iterator.posAccess(iterator.getPosVar(), + coordinates(iterator)).getResults()[0]; + declareCoordinate = VarDecl::make(coordinate, coordinateArray); + } + + // declare upper-level underived ancestors that will be tracked with while loops + Expr writeResultCond; + vector loopsToTrackUnderived; + vector searchForUnderivedStart; + std::map> coordinateBounds = provGraph.deriveCoordBounds(definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + vector underivedAncestors = provGraph.getUnderivedAncestors(forall.getIndexVar()); + if (underivedAncestors.size() > 1) { + // each underived ancestor is initialized to min coordinate bound + IndexVar posIteratorVar; #if TACO_ASSERTS - bool hasIteratorAncestor = provGraph.getPosIteratorAncestor( - iterator.getIndexVar(), &posIteratorVar); - taco_iassert(hasIteratorAncestor); + bool hasIteratorAncestor = provGraph.getPosIteratorAncestor( + iterator.getIndexVar(), &posIteratorVar); + taco_iassert(hasIteratorAncestor); #else /* !TACO_ASSERTS */ - provGraph.getPosIteratorAncestor( + provGraph.getPosIteratorAncestor( iterator.getIndexVar(), &posIteratorVar); #endif /* TACO_ASSERTS */ - // get pos variable then search for leveliterators to find the corresponding iterator - - Iterator posIterator; - auto iteratorMap = iterators.levelIterators(); - int modePos = -1; // select lowest level possible - for (auto it = iteratorMap.begin(); it != iteratorMap.end(); it++) { - if (it->second.getIndexVar() == posIteratorVar && (int) it->first.getModePos() > modePos) { - posIterator = it->second; - modePos = (int) it->first.getModePos(); - } - } - taco_iassert(posIterator.hasPosIter()); - - if (inParallelLoopDepth == 0) { - for (int i = 0; i < (int) underivedAncestors.size() - 1; i ++) { - // TODO: only if level is sparse emit underived_pos - header.push_back(VarDecl::make(this->iterators.modeIterator(underivedAncestors[i]).getPosVar(), 0)); // TODO: set to start position bound - header.push_back(VarDecl::make(getCoordinateVar(underivedAncestors[i]), coordinateBounds[underivedAncestors[i]][0])); - } - } else { - searchForUnderivedStart.push_back(searchForFusedPositionStart(forall, posIterator)); - } - - Expr parentPos = this->iterators.modeIterator(underivedAncestors[underivedAncestors.size() - 2]).getPosVar(); - ModeFunction posBounds = posIterator.posBounds(parentPos); - writeResultCond = ir::Eq::make(ir::Add::make(indexVarToExprMap[posIterator.getIndexVar()], 1), posBounds[1]); - - Stmt loopToTrackUnderiveds; // to track next ancestor - for (int i = 0; i < (int) underivedAncestors.size() - 1; i++) { - Expr coordVarUnknown = getCoordinateVar(underivedAncestors[i]); - Expr posVarKnown = this->iterators.modeIterator(underivedAncestors[i+1]).getPosVar(); - if (i == (int) underivedAncestors.size() - 2) { - posVarKnown = indexVarToExprMap[posIterator.getIndexVar()]; - } - Expr posVarUnknown = this->iterators.modeIterator(underivedAncestors[i]).getPosVar(); - - Iterator posIteratorLevel = posIterator; - for (int j = (int) underivedAncestors.size() - 2; j > i; j--) { // take parent of iterator enough times to get correct level - posIteratorLevel = posIteratorLevel.getParent(); - } - - ModeFunction posBoundsLevel = posIteratorLevel.posBounds(posVarUnknown); - Expr loopcond = ir::Eq::make(posVarKnown, posBoundsLevel[1]); - Stmt locateCoordVar; - if (posIteratorLevel.getParent().hasPosIter()) { - locateCoordVar = ir::Assign::make(coordVarUnknown, ir::Load::make(posIteratorLevel.getParent().getMode().getModePack().getArray(1), posVarUnknown)); - } - else { - locateCoordVar = ir::Assign::make(coordVarUnknown, posVarUnknown); - } - Stmt loopBody = ir::Block::make(compoundAssign(posVarUnknown, 1), locateCoordVar, loopToTrackUnderiveds); - if (posIteratorLevel.getParent().hasPosIter()) { // TODO: if level is unique or not - loopToTrackUnderiveds = IfThenElse::make(loopcond, loopBody); - } - else { - loopToTrackUnderiveds = While::make(loopcond, loopBody); - } - } - loopsToTrackUnderived.push_back(loopToTrackUnderiveds); - } - - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth++; - } - - Stmt body = lowerForallBody(coordinate, forall.getStmt(), - locators, inserters, appenders, caseLattice, reducedAccesses); - - if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { - markAssignsAtomicDepth--; - } - - body = Block::make(recoveryStmt, Block::make(loopsToTrackUnderived), body); - - // Code to write results if using temporary and reset temporary - if (!whereConsumers.empty() && whereConsumers.back().defined()) { - Expr temp = tensorVars.find(whereTemps.back())->second; - Stmt writeResults = Block::make(whereConsumers.back(), ir::Assign::make(temp, ir::Literal::zero(temp.type()))); - body = Block::make(body, IfThenElse::make(writeResultCond, writeResults)); - } - - // Code to append positions - Stmt posAppend = generateAppendPositions(appenders); - - // Code to compute iteration bounds - Stmt boundsCompute; - Expr startBound, endBound; - if (!provGraph.isUnderived(iterator.getIndexVar())) { - vector bounds = provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); - startBound = bounds[0]; - endBound = bounds[1]; - } - else if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { - // E.g. a compressed mode without duplicates - Expr parentPos = iterator.getParent().getPosVar(); - ModeFunction bounds = iterator.posBounds(parentPos); - boundsCompute = bounds.compute(); - startBound = bounds[0]; - endBound = bounds[1]; - } else { - taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); - taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); - - // E.g. a compressed mode with duplicates. Apply iterator chaining - Expr parentPos = iterator.getParent().getPosVar(); - Expr parentSegend = iterator.getParent().getSegendVar(); - ModeFunction startBounds = iterator.posBounds(parentPos); - ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); - boundsCompute = Block::make(startBounds.compute(), endBounds.compute()); - startBound = startBounds[0]; - endBound = endBounds[1]; - } - - LoopKind kind = LoopKind::Serial; - if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { - kind = LoopKind::Vectorized; - } - else if (forall.getParallelUnit() != ParallelUnit::NotParallel - && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { - kind = LoopKind::Runtime; - } - // Loop with preamble and postamble - return Block::blanks(boundsCompute, - Block::make(Block::make(searchForUnderivedStart), - For::make(indexVarToExprMap[iterator.getIndexVar()], startBound, endBound, 1, - Block::make(declareCoordinate, body), - kind, - ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor())), - posAppend); + // get pos variable then search for leveliterators to find the corresponding iterator + + Iterator posIterator; + auto iteratorMap = iterators.levelIterators(); + int modePos = -1; // select lowest level possible + for (auto it = iteratorMap.begin(); it != iteratorMap.end(); it++) { + if (it->second.getIndexVar() == posIteratorVar && (int) it->first.getModePos() > modePos) { + posIterator = it->second; + modePos = (int) it->first.getModePos(); + } + } + taco_iassert(posIterator.hasPosIter()); -} + if (inParallelLoopDepth == 0) { + for (int i = 0; i < (int) underivedAncestors.size() - 1; i ++) { + // TODO: only if level is sparse emit underived_pos + header.push_back(VarDecl::make(this->iterators.modeIterator(underivedAncestors[i]).getPosVar(), 0)); // TODO: set to start position bound + header.push_back(VarDecl::make(getCoordinateVar(underivedAncestors[i]), coordinateBounds[underivedAncestors[i]][0])); + } + } else { + searchForUnderivedStart.push_back(searchForFusedPositionStart(forall, posIterator)); + } -Stmt LowererImplImperative::lowerMergeLattice(MergeLattice caseLattice, IndexVar coordinateVar, - IndexStmt statement, - const std::set& reducedAccesses) -{ - // Lower merge lattice always gets called from lowerForAll. So we want loop lattice - MergeLattice loopLattice = caseLattice.getLoopLattice(); - - Expr coordinate = getCoordinateVar(coordinateVar); - vector appenders = filter(loopLattice.results(), - [](Iterator it){return it.hasAppend();}); - - vector mergers = loopLattice.points()[0].mergers(); - Stmt iteratorVarInits = codeToInitializeIteratorVars(loopLattice.iterators(), loopLattice.points()[0].rangers(), mergers, coordinate, coordinateVar); - - // if modeiteratornonmerger then will be declared in codeToInitializeIteratorVars - auto modeIteratorsNonMergers = - filter(loopLattice.points()[0].iterators(), [mergers](Iterator it){ - bool isMerger = find(mergers.begin(), mergers.end(), it) != mergers.end(); - return it.isDimensionIterator() && !isMerger; - }); - bool resolvedCoordDeclared = !modeIteratorsNonMergers.empty(); - - vector mergeLoopsVec; - for (MergePoint point : loopLattice.points()) { - // Each iteration of this loop generates a while loop for one of the merge - // points in the merge lattice. - IndexStmt zeroedStmt = zero(statement, getExhaustedAccesses(point, caseLattice)); - MergeLattice sublattice = caseLattice.subLattice(point); - Stmt mergeLoop = lowerMergePoint(sublattice, coordinate, coordinateVar, zeroedStmt, reducedAccesses, resolvedCoordDeclared); - mergeLoopsVec.push_back(mergeLoop); - } - Stmt mergeLoops = Block::make(mergeLoopsVec); - - // Append position to the pos array - Stmt appendPositions = generateAppendPositions(appenders); - - return Block::blanks(iteratorVarInits, - mergeLoops, - appendPositions); -} + Expr parentPos = this->iterators.modeIterator(underivedAncestors[underivedAncestors.size() - 2]).getPosVar(); + ModeFunction posBounds = posIterator.posBounds(parentPos); + writeResultCond = ir::Eq::make(ir::Add::make(indexVarToExprMap[posIterator.getIndexVar()], 1), posBounds[1]); -Stmt LowererImplImperative::lowerMergePoint(MergeLattice pointLattice, - ir::Expr coordinate, IndexVar coordinateVar, IndexStmt statement, - const std::set& reducedAccesses, bool resolvedCoordDeclared) -{ - MergePoint point = pointLattice.points().front(); - - vector iterators = point.iterators(); - vector mergers = point.mergers(); - vector rangers = point.rangers(); - vector locators = point.locators(); - - taco_iassert(iterators.size() > 0); - taco_iassert(mergers.size() > 0); - taco_iassert(rangers.size() > 0); - - // Load coordinates from position iterators - Stmt loadPosIterCoordinates = codeToLoadCoordinatesFromPosIterators(iterators, !resolvedCoordDeclared); - - // Any iterators with an index set have extra work to do at the header - // of the merge point. - std::vector indexSetStmts; - for (auto& iter : filter(iterators, [](Iterator it) { return it.hasIndexSet(); })) { - // For each iterator A with an index set B, emit the following code: - // setMatch = min(A, B); // Check whether A matches its index set at this point. - // if (A == setMatch && B == setMatch) { - // // If there was a match, project down the values of the iterators - // // to be the position variable of the index set iterator. This has the - // // effect of remapping the index of A to be the i'th position of the set. - // A_coord = B_pos; - // B_coord = B_pos; - // } else { - // // Advance the iterator and it's index set iterator accordingly if - // // there wasn't a match. - // A_pos += (A == setMatch); - // B_pos += (B == setMatch); - // // We must continue so that we only proceed to the rest of the cases in - // // the merge if there actually is a point present for A. - // continue; - // } - auto setMatch = ir::Var::make("setMatch", Int()); - auto indexSetIter = iter.getIndexSetIterator(); - indexSetStmts.push_back(ir::VarDecl::make(setMatch, ir::Min::make(this->coordinates({iter, indexSetIter})))); - // Equality checks for each iterator. - auto iterEq = ir::Eq::make(iter.getCoordVar(), setMatch); - auto setEq = ir::Eq::make(indexSetIter.getCoordVar(), setMatch); - // Code to shift down each iterator to the position space of the index set. - auto shiftDown = ir::Block::make( - ir::Assign::make(iter.getCoordVar(), indexSetIter.getPosVar()), - ir::Assign::make(indexSetIter.getCoordVar(), indexSetIter.getPosVar()) - ); - // Code to increment both iterator variables. - auto incr = ir::Block::make( - compoundAssign(iter.getIteratorVar(), ir::Cast::make(Eq::make(iter.getCoordVar(), setMatch), iter.getIteratorVar().type())), - compoundAssign(indexSetIter.getIteratorVar(), ir::Cast::make(Eq::make(indexSetIter.getCoordVar(), setMatch), indexSetIter.getIteratorVar().type())), - ir::Continue::make() - ); - // Code that uses the defined parts together in the if-then-else. - indexSetStmts.push_back(ir::IfThenElse::make(ir::And::make(iterEq, setEq), shiftDown, incr)); - } - - // Merge iterator coordinate variables - Stmt resolvedCoordinate = resolveCoordinate(mergers, coordinate, !resolvedCoordDeclared); - - // Locate positions - Stmt loadLocatorPosVars = declLocatePosVars(locators); - - // Deduplication loops - auto dupIters = filter(iterators, [](Iterator it){return !it.isUnique() && - it.hasPosIter();}); - bool alwaysReduce = (mergers.size() == 1 && mergers[0].hasPosIter()); - Stmt deduplicationLoops = reduceDuplicateCoordinates(coordinate, dupIters, - alwaysReduce); - - // One case for each child lattice point lp - Stmt caseStmts = lowerMergeCases(coordinate, coordinateVar, statement, pointLattice, - reducedAccesses); - - // Increment iterator position variables - Stmt incIteratorVarStmts = codeToIncIteratorVars(coordinate, coordinateVar, iterators, mergers); - - /// While loop over rangers - return While::make(checkThatNoneAreExhausted(rangers), - Block::make(loadPosIterCoordinates, - ir::Block::make(indexSetStmts), - resolvedCoordinate, - loadLocatorPosVars, - deduplicationLoops, - caseStmts, - incIteratorVarStmts)); -} + Stmt loopToTrackUnderiveds; // to track next ancestor + for (int i = 0; i < (int) underivedAncestors.size() - 1; i++) { + Expr coordVarUnknown = getCoordinateVar(underivedAncestors[i]); + Expr posVarKnown = this->iterators.modeIterator(underivedAncestors[i+1]).getPosVar(); + if (i == (int) underivedAncestors.size() - 2) { + posVarKnown = indexVarToExprMap[posIterator.getIndexVar()]; + } + Expr posVarUnknown = this->iterators.modeIterator(underivedAncestors[i]).getPosVar(); -Stmt LowererImplImperative::resolveCoordinate(std::vector mergers, ir::Expr coordinate, bool emitVarDecl) { - if (mergers.size() == 1) { - Iterator merger = mergers[0]; - if (merger.hasPosIter()) { - // Just one position iterator so it is the resolved coordinate - ModeFunction posAccess = merger.posAccess(merger.getPosVar(), - coordinates(merger)); - auto access = posAccess[0]; - auto windowVarDecl = Stmt(); - auto stride = Stmt(); - auto guard = Stmt(); - // If the iterator is windowed, we must recover the coordinate index - // variable from the windowed space. - if (merger.isWindowed()) { - - // If the iterator is strided, then we have to skip over coordinates - // that don't match the stride. To do that, we insert a guard on the - // access. We first extract the access into a temp to avoid emitting - // a duplicate load on the _crd array. - if (merger.isStrided()) { - windowVarDecl = VarDecl::make(merger.getWindowVar(), access); - access = merger.getWindowVar(); - // Since we're merging values from a compressed array (not iterating over it), - // we need to advance the outer loop if the current coordinate is not - // along the desired stride. So, we pass true to the incrementPosVar - // argument of strideBoundsGuard. - stride = this->strideBoundsGuard(merger, access, true /* incrementPosVar */); - } - - access = this->projectWindowedPositionToCanonicalSpace(merger, access); - guard = this->upperBoundGuardForWindowPosition(merger, coordinate); - } - Stmt resolution = emitVarDecl ? VarDecl::make(coordinate, access) : Assign::make(coordinate, access); - return Block::make(posAccess.compute(), - windowVarDecl, - stride, - resolution, - guard); - } - else if (merger.hasCoordIter()) { - taco_not_supported_yet; - return Stmt(); - } - else if (merger.isDimensionIterator()) { - // Just one dimension iterator so resolved coordinate already exist and we - // do nothing - return Stmt(); - } - else { - taco_ierror << "Unexpected type of single iterator " << merger; - return Stmt(); - } - } - else { - // Multiple position iterators so the smallest is the resolved coordinate - if (emitVarDecl) { - return VarDecl::make(coordinate, Min::make(coordinates(mergers))); - } - else { - return Assign::make(coordinate, Min::make(coordinates(mergers))); - } - } -} + Iterator posIteratorLevel = posIterator; + for (int j = (int) underivedAncestors.size() - 2; j > i; j--) { // take parent of iterator enough times to get correct level + posIteratorLevel = posIteratorLevel.getParent(); + } -Stmt LowererImplImperative::lowerMergeCases(ir::Expr coordinate, IndexVar coordinateVar, IndexStmt stmt, - MergeLattice caseLattice, - const std::set& reducedAccesses) -{ - vector result; - - if (caseLattice.anyModeIteratorIsLeaf() && caseLattice.needExplicitZeroChecks()) { - // Can check value array of some tensor - Stmt body = lowerMergeCasesWithExplicitZeroChecks(coordinate, coordinateVar, stmt, caseLattice, reducedAccesses); - result.push_back(body); - return Block::make(result); - } - - // Emitting structural cases so unconditionally apply lattice optimizations. - MergeLattice loopLattice = caseLattice.getLoopLattice(); - - vector appenders; - vector inserters; - tie(appenders, inserters) = splitAppenderAndInserters(loopLattice.results()); - - // If loo - if (loopLattice.iterators().size() == 1 || (loopLattice.exact() && - isa(stmt) && returnsTrue(stmt.as().getRhs()))) { - // Just one iterator so no conditional - taco_iassert(!loopLattice.points()[0].isOmitter()); - Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, - appenders, loopLattice, reducedAccesses); - result.push_back(body); - } - else if (!loopLattice.points().empty()) { - vector> cases; - for (MergePoint point : loopLattice.points()) { - - // if(point.isOmitter()) { - // continue; - // } - - // Construct case expression - vector coordComparisons = compareToResolvedCoordinate(point.rangers(), coordinate, coordinateVar); - vector omittedRegionIterators = loopLattice.retrieveRegionIteratorsToOmit(point); - if (!point.isOmitter()) { - std::vector neqComparisons = compareToResolvedCoordinate(omittedRegionIterators, coordinate, - coordinateVar); - append(coordComparisons, neqComparisons); - } - - coordComparisons = filter(coordComparisons, [](const Expr& e) { return e.defined(); }); - - // Construct case body - IndexStmt zeroedStmt = zero(stmt, getExhaustedAccesses(point, loopLattice)); - Stmt body = lowerForallBody(coordinate, zeroedStmt, {}, - inserters, appenders, MergeLattice({point}), reducedAccesses); - if (coordComparisons.empty()) { - Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, - appenders, MergeLattice({point}), reducedAccesses); - result.push_back(body); - break; - } - cases.push_back({taco::ir::conjunction(coordComparisons), body}); - } - result.push_back(Case::make(cases, loopLattice.exact())); - } - - return Block::make(result); -} + ModeFunction posBoundsLevel = posIteratorLevel.posBounds(posVarUnknown); + Expr loopcond = ir::Eq::make(posVarKnown, posBoundsLevel[1]); + Stmt locateCoordVar; + if (posIteratorLevel.getParent().hasPosIter()) { + locateCoordVar = ir::Assign::make(coordVarUnknown, ir::Load::make(posIteratorLevel.getParent().getMode().getModePack().getArray(1), posVarUnknown)); + } + else { + locateCoordVar = ir::Assign::make(coordVarUnknown, posVarUnknown); + } + Stmt loopBody = ir::Block::make(compoundAssign(posVarUnknown, 1), locateCoordVar, loopToTrackUnderiveds); + if (posIteratorLevel.getParent().hasPosIter()) { // TODO: if level is unique or not + loopToTrackUnderiveds = IfThenElse::make(loopcond, loopBody); + } + else { + loopToTrackUnderiveds = While::make(loopcond, loopBody); + } + } + loopsToTrackUnderived.push_back(loopToTrackUnderiveds); + } -ir::Expr LowererImplImperative::constructCheckForAccessZero(Access access) { - Expr tensorValue = lower(access); - IndexExpr zeroVal = Literal::zero(tensorValue.type()); //TODO ARRAY Generalize - return Neq::make(tensorValue, lower(zeroVal)); -} + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth++; + } -std::vector LowererImplImperative::getModeIterators(const std::vector& iters) { - // For now only check mode iterators. - return filter(iters, [](const Iterator& it){return it.isModeIterator();}); -} + Stmt body = lowerForallBody(coordinate, forall.getStmt(), + locators, inserters, appenders, caseLattice, reducedAccesses); -std::vector LowererImplImperative::constructInnerLoopCasePreamble(ir::Expr coordinate, IndexVar coordinateVar, - MergeLattice lattice, - map& iteratorToConditionMap) { - vector result; - - // First, get mode iterator coordinate comparisons - std::vector modeIterators = getModeIterators(lattice.iterators()); - vector coordComparisonsForModeIters = compareToResolvedCoordinate(modeIterators, coordinate, coordinateVar); - - std::vector modeItersWithIndexCases; - std::vector coordComparisons; - for(size_t i = 0; i < coordComparisonsForModeIters.size(); ++i) { - Expr expr = coordComparisonsForModeIters[i]; - if (expr.defined()) { - modeItersWithIndexCases.push_back(modeIterators[i]); - coordComparisons.push_back(expr); - } - } - - // Construct tensor iterators with modeIterators first then locate iterators to keep a mapping between vector indices - vector tensorIterators = combine(modeItersWithIndexCases, lattice.locators()); - tensorIterators = getModeIterators(tensorIterators); - - // Get value comparisons for all tensor iterators - vector itAccesses; - vector valueComparisons; - for(auto it : tensorIterators) { - Access itAccess = iterators.modeAccess(it).getAccess(); - itAccesses.push_back(itAccess); - if(it.isLeaf()) { - valueComparisons.push_back(constructCheckForAccessZero(itAccess)); - } else { - valueComparisons.push_back(Expr()); - } - } - - // Construct isNonZero cases - for(size_t i = 0; i < coordComparisons.size(); ++i) { - Expr nonZeroCase; - if(coordComparisons[i].defined() && valueComparisons[i].defined()) { - nonZeroCase = conjunction({coordComparisons[i], valueComparisons[i]}); - } else if (valueComparisons[i].defined()) { - nonZeroCase = valueComparisons[i]; - } else if (coordComparisons[i].defined()) { - nonZeroCase = coordComparisons[i]; - } else { - continue; - } - Expr caseName = Var::make(itAccesses[i].getTensorVar().getName() + "_isNonZero", taco::Bool); - Stmt declaration = VarDecl::make(caseName, nonZeroCase); - result.push_back(declaration); - iteratorToConditionMap[tensorIterators[i]] = caseName; - } - - for(size_t i = modeItersWithIndexCases.size(); i < valueComparisons.size(); ++i) { - Expr caseName = Var::make(itAccesses[i].getTensorVar().getName() + "_isNonZero", taco::Bool); - Stmt declaration = VarDecl::make(caseName, valueComparisons[i]); - result.push_back(declaration); - iteratorToConditionMap[tensorIterators[i]] = caseName; - } - - return result; -} + if (forall.getParallelUnit() != ParallelUnit::NotParallel && forall.getOutputRaceStrategy() == OutputRaceStrategy::Atomics) { + markAssignsAtomicDepth--; + } -vector LowererImplImperative::lowerCasesFromMap(map iteratorToCondition, - ir::Expr coordinate, IndexStmt stmt, const MergeLattice& lattice, - const std::set& reducedAccesses) { - - vector appenders; - vector inserters; - tie(appenders, inserters) = splitAppenderAndInserters(lattice.results()); - - std::vector result; - vector> cases; - for (MergePoint point : lattice.points()) { - - if(point.isOmitter()) { - continue; - } - - // Construct case expression - vector isNonZeroComparisions; - for(auto& it : combine(point.rangers(), point.locators())) { - if(util::contains(iteratorToCondition, it)) { - taco_iassert(iteratorToCondition.at(it).type() == taco::Bool) << "Map must have boolean types"; - isNonZeroComparisions.push_back(iteratorToCondition.at(it)); - } - } - - function getNegatedComparison = [&](const Iterator& it) {return ir::Neg::make(iteratorToCondition.at(it));}; - vector omittedRegionIterators = lattice.retrieveRegionIteratorsToOmit(point); - for(auto& it : omittedRegionIterators) { - if(util::contains(iteratorToCondition, it)) { - isNonZeroComparisions.push_back(ir::Neg::make(iteratorToCondition.at(it))); - } - } - - // Construct case body - IndexStmt zeroedStmt = zero(stmt, getExhaustedAccesses(point, lattice)); - Stmt body = lowerForallBody(coordinate, zeroedStmt, {}, - inserters, appenders, MergeLattice({point}), reducedAccesses); - if (isNonZeroComparisions.empty()) { - Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, - appenders, MergeLattice({point}), reducedAccesses); - result.push_back(body); - break; - } - cases.push_back({taco::ir::conjunction(isNonZeroComparisions), body}); - } - - vector inputs = combine(lattice.iterators(), lattice.locators()); - inputs = getModeIterators(inputs); - - if(!lattice.exact() && util::any(inserters, [](Iterator it){return it.isFull();}) && hasNoForAlls(stmt) - && any(inputs, [](Iterator it){return it.isFull();})) { - // Currently, if the lattice is not exact, the output is full and any of the inputs are full, we initialize - // the result tensor - vector stmts; - for(auto& it : inserters) { - if(it.isFull()) { - Access access = iterators.modeAccess(it).getAccess(); - IndexStmt initStmt = Assignment(access, Literal::zero(access.getDataType())); - Stmt initialization = lowerForallBody(coordinate, initStmt, {}, inserters, - appenders, MergeLattice({}), reducedAccesses); - stmts.push_back(initialization); - } - } - Stmt backgroundInit = Block::make(stmts); - cases.push_back({Expr((bool) true), backgroundInit}); - result.push_back(Case::make(cases, true)); - } else { - result.push_back(Case::make(cases, lattice.exact())); - } - return result; -} + body = Block::make(recoveryStmt, Block::make(loopsToTrackUnderived), body); -/// Lowers a merge lattice to cases assuming there are no more loops to be emitted in stmt. -Stmt LowererImplImperative::lowerMergeCasesWithExplicitZeroChecks(ir::Expr coordinate, IndexVar coordinateVar, IndexStmt stmt, - MergeLattice lattice, const std::set& reducedAccesses) { - - vector result; - if (lattice.points().size() == 1 && lattice.iterators().size() == 1 - || (lattice.exact() && - isa(stmt) && returnsTrue(stmt.as().getRhs()))) { - // Just one iterator so no conditional - vector appenders; - vector inserters; - tie(appenders, inserters) = splitAppenderAndInserters(lattice.results()); - taco_iassert(!lattice.points()[0].isOmitter()); - Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, - appenders, lattice, reducedAccesses); - result.push_back(body); - } else if (!lattice.points().empty()) { - map iteratorToConditionMap; - - vector preamble = constructInnerLoopCasePreamble(coordinate, coordinateVar, lattice, iteratorToConditionMap); - util::append(result, preamble); - vector cases = lowerCasesFromMap(iteratorToConditionMap, coordinate, stmt, lattice, reducedAccesses); - util::append(result, cases); - } - - return Block::make(result); -} + // Code to write results if using temporary and reset temporary + if (!whereConsumers.empty() && whereConsumers.back().defined()) { + Expr temp = tensorVars.find(whereTemps.back())->second; + Stmt writeResults = Block::make(whereConsumers.back(), ir::Assign::make(temp, ir::Literal::zero(temp.type()))); + body = Block::make(body, IfThenElse::make(writeResultCond, writeResults)); + } -Stmt LowererImplImperative::lowerForallBody(Expr coordinate, IndexStmt stmt, - vector locators, - vector inserters, - vector appenders, - MergeLattice caseLattice, - const set& reducedAccesses) { + // Code to append positions + Stmt posAppend = generateAppendPositions(appenders); + + // Code to compute iteration bounds + Stmt boundsCompute; + Expr startBound, endBound; + if (!provGraph.isUnderived(iterator.getIndexVar())) { + vector bounds = provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, iterators); + startBound = bounds[0]; + endBound = bounds[1]; + } + else if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { + // E.g. a compressed mode without duplicates + Expr parentPos = iterator.getParent().getPosVar(); + ModeFunction bounds = iterator.posBounds(parentPos); + boundsCompute = bounds.compute(); + startBound = bounds[0]; + endBound = bounds[1]; + } else { + taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); + taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); + + // E.g. a compressed mode with duplicates. Apply iterator chaining + Expr parentPos = iterator.getParent().getPosVar(); + Expr parentSegend = iterator.getParent().getSegendVar(); + ModeFunction startBounds = iterator.posBounds(parentPos); + ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); + boundsCompute = Block::make(startBounds.compute(), endBounds.compute()); + startBound = startBounds[0]; + endBound = endBounds[1]; + } + + LoopKind kind = LoopKind::Serial; + if (forall.getParallelUnit() == ParallelUnit::CPUVector && !ignoreVectorize) { + kind = LoopKind::Vectorized; + } + else if (forall.getParallelUnit() != ParallelUnit::NotParallel + && forall.getOutputRaceStrategy() != OutputRaceStrategy::ParallelReduction && !ignoreVectorize) { + kind = LoopKind::Runtime; + } + // Loop with preamble and postamble + return Block::blanks(boundsCompute, + Block::make(Block::make(searchForUnderivedStart), + For::make(indexVarToExprMap[iterator.getIndexVar()], startBound, endBound, 1, + Block::make(declareCoordinate, body), + kind, + ignoreVectorize ? ParallelUnit::NotParallel : forall.getParallelUnit(), ignoreVectorize ? 0 : forall.getUnrollFactor())), + posAppend); + + } + + Stmt LowererImplImperative::lowerMergeLattice(MergeLattice caseLattice, IndexVar coordinateVar, + IndexStmt statement, + const std::set& reducedAccesses) + { + // Lower merge lattice always gets called from lowerForAll. So we want loop lattice + MergeLattice loopLattice = caseLattice.getLoopLattice(); + + Expr coordinate = getCoordinateVar(coordinateVar); + vector appenders = filter(loopLattice.results(), + [](Iterator it){return it.hasAppend();}); + + vector mergers = loopLattice.points()[0].mergers(); + Stmt iteratorVarInits = codeToInitializeIteratorVars(loopLattice.iterators(), loopLattice.points()[0].rangers(), mergers, coordinate, coordinateVar); + + // if modeiteratornonmerger then will be declared in codeToInitializeIteratorVars + auto modeIteratorsNonMergers = + filter(loopLattice.points()[0].iterators(), [mergers](Iterator it){ + bool isMerger = find(mergers.begin(), mergers.end(), it) != mergers.end(); + return it.isDimensionIterator() && !isMerger; + }); + bool resolvedCoordDeclared = !modeIteratorsNonMergers.empty(); + + vector mergeLoopsVec; + for (MergePoint point : loopLattice.points()) { + // Each iteration of this loop generates a while loop for one of the merge + // points in the merge lattice. + IndexStmt zeroedStmt = zero(statement, getExhaustedAccesses(point, caseLattice)); + MergeLattice sublattice = caseLattice.subLattice(point); + Stmt mergeLoop = lowerMergePoint(sublattice, coordinate, coordinateVar, zeroedStmt, reducedAccesses, resolvedCoordDeclared); + mergeLoopsVec.push_back(mergeLoop); + } + Stmt mergeLoops = Block::make(mergeLoopsVec); + + // Append position to the pos array + Stmt appendPositions = generateAppendPositions(appenders); + + return Block::blanks(iteratorVarInits, + mergeLoops, + appendPositions); + } + + Stmt LowererImplImperative::lowerMergePoint(MergeLattice pointLattice, + ir::Expr coordinate, IndexVar coordinateVar, IndexStmt statement, + const std::set& reducedAccesses, bool resolvedCoordDeclared) + { + MergePoint point = pointLattice.points().front(); + + vector iterators = point.iterators(); + vector mergers = point.mergers(); + vector rangers = point.rangers(); + vector locators = point.locators(); + + taco_iassert(iterators.size() > 0); + taco_iassert(mergers.size() > 0); + taco_iassert(rangers.size() > 0); + + // Load coordinates from position iterators + Stmt loadPosIterCoordinates = codeToLoadCoordinatesFromPosIterators(iterators, !resolvedCoordDeclared); + + // Any iterators with an index set have extra work to do at the header + // of the merge point. + std::vector indexSetStmts; + for (auto& iter : filter(iterators, [](Iterator it) { return it.hasIndexSet(); })) { + // For each iterator A with an index set B, emit the following code: + // setMatch = min(A, B); // Check whether A matches its index set at this point. + // if (A == setMatch && B == setMatch) { + // // If there was a match, project down the values of the iterators + // // to be the position variable of the index set iterator. This has the + // // effect of remapping the index of A to be the i'th position of the set. + // A_coord = B_pos; + // B_coord = B_pos; + // } else { + // // Advance the iterator and it's index set iterator accordingly if + // // there wasn't a match. + // A_pos += (A == setMatch); + // B_pos += (B == setMatch); + // // We must continue so that we only proceed to the rest of the cases in + // // the merge if there actually is a point present for A. + // continue; + // } + auto setMatch = ir::Var::make("setMatch", Int()); + auto indexSetIter = iter.getIndexSetIterator(); + indexSetStmts.push_back(ir::VarDecl::make(setMatch, ir::Min::make(this->coordinates({iter, indexSetIter})))); + // Equality checks for each iterator. + auto iterEq = ir::Eq::make(iter.getCoordVar(), setMatch); + auto setEq = ir::Eq::make(indexSetIter.getCoordVar(), setMatch); + // Code to shift down each iterator to the position space of the index set. + auto shiftDown = ir::Block::make( + ir::Assign::make(iter.getCoordVar(), indexSetIter.getPosVar()), + ir::Assign::make(indexSetIter.getCoordVar(), indexSetIter.getPosVar()) + ); + // Code to increment both iterator variables. + auto incr = ir::Block::make( + compoundAssign(iter.getIteratorVar(), ir::Cast::make(Eq::make(iter.getCoordVar(), setMatch), iter.getIteratorVar().type())), + compoundAssign(indexSetIter.getIteratorVar(), ir::Cast::make(Eq::make(indexSetIter.getCoordVar(), setMatch), indexSetIter.getIteratorVar().type())), + ir::Continue::make() + ); + // Code that uses the defined parts together in the if-then-else. + indexSetStmts.push_back(ir::IfThenElse::make(ir::And::make(iterEq, setEq), shiftDown, incr)); + } - // Inserter positions - Stmt declInserterPosVars = declLocatePosVars(inserters); + // Merge iterator coordinate variables + Stmt resolvedCoordinate = resolveCoordinate(mergers, coordinate, !resolvedCoordDeclared); + + // Locate positions + Stmt loadLocatorPosVars = declLocatePosVars(locators); + + // Deduplication loops + auto dupIters = filter(iterators, [](Iterator it){return !it.isUnique() && + it.hasPosIter();}); + bool alwaysReduce = (mergers.size() == 1 && mergers[0].hasPosIter()); + Stmt deduplicationLoops = reduceDuplicateCoordinates(coordinate, dupIters, + alwaysReduce); + + // One case for each child lattice point lp + Stmt caseStmts = lowerMergeCases(coordinate, coordinateVar, statement, pointLattice, + reducedAccesses); + + // Increment iterator position variables + Stmt incIteratorVarStmts = codeToIncIteratorVars(coordinate, coordinateVar, iterators, mergers); + + /// While loop over rangers + return While::make(checkThatNoneAreExhausted(rangers), + Block::make(loadPosIterCoordinates, + ir::Block::make(indexSetStmts), + resolvedCoordinate, + loadLocatorPosVars, + deduplicationLoops, + caseStmts, + incIteratorVarStmts)); + } + + Stmt LowererImplImperative::resolveCoordinate(std::vector mergers, ir::Expr coordinate, bool emitVarDecl) { + if (mergers.size() == 1) { + Iterator merger = mergers[0]; + if (merger.hasPosIter()) { + // Just one position iterator so it is the resolved coordinate + ModeFunction posAccess = merger.posAccess(merger.getPosVar(), + coordinates(merger)); + auto access = posAccess[0]; + auto windowVarDecl = Stmt(); + auto stride = Stmt(); + auto guard = Stmt(); + // If the iterator is windowed, we must recover the coordinate index + // variable from the windowed space. + if (merger.isWindowed()) { + + // If the iterator is strided, then we have to skip over coordinates + // that don't match the stride. To do that, we insert a guard on the + // access. We first extract the access into a temp to avoid emitting + // a duplicate load on the _crd array. + if (merger.isStrided()) { + windowVarDecl = VarDecl::make(merger.getWindowVar(), access); + access = merger.getWindowVar(); + // Since we're merging values from a compressed array (not iterating over it), + // we need to advance the outer loop if the current coordinate is not + // along the desired stride. So, we pass true to the incrementPosVar + // argument of strideBoundsGuard. + stride = this->strideBoundsGuard(merger, access, true /* incrementPosVar */); + } + + access = this->projectWindowedPositionToCanonicalSpace(merger, access); + guard = this->upperBoundGuardForWindowPosition(merger, coordinate); + } + Stmt resolution = emitVarDecl ? VarDecl::make(coordinate, access) : Assign::make(coordinate, access); + return Block::make(posAccess.compute(), + windowVarDecl, + stride, + resolution, + guard); + } + else if (merger.hasCoordIter()) { + taco_not_supported_yet; + return Stmt(); + } + else if (merger.isDimensionIterator()) { + // Just one dimension iterator so resolved coordinate already exist and we + // do nothing + return Stmt(); + } + else { + taco_ierror << "Unexpected type of single iterator " << merger; + return Stmt(); + } + } + else { + // Multiple position iterators so the smallest is the resolved coordinate + if (emitVarDecl) { + return VarDecl::make(coordinate, Min::make(coordinates(mergers))); + } + else { + return Assign::make(coordinate, Min::make(coordinates(mergers))); + } + } + } - // Locate positions - Stmt declLocatorPosVars = declLocatePosVars(locators); + Stmt LowererImplImperative::lowerMergeCases(ir::Expr coordinate, IndexVar coordinateVar, IndexStmt stmt, + MergeLattice caseLattice, + const std::set& reducedAccesses) + { + vector result; - if (captureNextLocatePos) { - capturedLocatePos = Block::make(declInserterPosVars, declLocatorPosVars); - captureNextLocatePos = false; - } + if (caseLattice.anyModeIteratorIsLeaf() && caseLattice.needExplicitZeroChecks()) { + // Can check value array of some tensor + Stmt body = lowerMergeCasesWithExplicitZeroChecks(coordinate, coordinateVar, stmt, caseLattice, reducedAccesses); + result.push_back(body); + return Block::make(result); + } - if (caseLattice.anyModeIteratorIsLeaf() && caseLattice.points().size() > 1) { + // Emitting structural cases so unconditionally apply lattice optimizations. + MergeLattice loopLattice = caseLattice.getLoopLattice(); + + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(loopLattice.results()); + + // If loo + if (loopLattice.iterators().size() == 1 || (loopLattice.exact() && + isa(stmt) && returnsTrue(stmt.as().getRhs()))) { + // Just one iterator so no conditional + taco_iassert(!loopLattice.points()[0].isOmitter()); + Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, + appenders, loopLattice, reducedAccesses); + result.push_back(body); + } + else if (!loopLattice.points().empty()) { + vector> cases; + for (MergePoint point : loopLattice.points()) { + + // if(point.isOmitter()) { + // continue; + // } + + // Construct case expression + vector coordComparisons = compareToResolvedCoordinate(point.rangers(), coordinate, coordinateVar); + vector omittedRegionIterators = loopLattice.retrieveRegionIteratorsToOmit(point); + if (!point.isOmitter()) { + std::vector neqComparisons = compareToResolvedCoordinate(omittedRegionIterators, coordinate, + coordinateVar); + append(coordComparisons, neqComparisons); + } - // Code of loop body statement - // Explicit zero checks needed - std::vector stmts; + coordComparisons = filter(coordComparisons, [](const Expr& e) { return e.defined(); }); + + // Construct case body + IndexStmt zeroedStmt = zero(stmt, getExhaustedAccesses(point, loopLattice)); + Stmt body = lowerForallBody(coordinate, zeroedStmt, {}, + inserters, appenders, MergeLattice({point}), reducedAccesses); + if (coordComparisons.empty()) { + Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, + appenders, MergeLattice({point}), reducedAccesses); + result.push_back(body); + break; + } + cases.push_back({taco::ir::conjunction(coordComparisons), body}); + } + result.push_back(Case::make(cases, loopLattice.exact())); + } - // Need to emit checks based on case lattice - vector modeIterators = getModeIterators(combine(caseLattice.iterators(), caseLattice.locators())); - std::map caseMap; - for(auto it : modeIterators) { - if(it.isLeaf()) { - // Only emit explicit 0 checks for leaf iterators since these are the only iterators can can access tensor - // values array - Access itAccess = iterators.modeAccess(it).getAccess(); - Expr accessCase = constructCheckForAccessZero(itAccess); - caseMap.insert({it, accessCase}); - } + return Block::make(result); } - // This will lower the body for each case to actually compute. Therefore, we don't need to resize assembly arrays - std::vector loweredCases = lowerCasesFromMap(caseMap, coordinate, stmt, caseLattice, reducedAccesses); + ir::Expr LowererImplImperative::constructCheckForAccessZero(Access access) { + Expr tensorValue = lower(access); + IndexExpr zeroVal = Literal::zero(tensorValue.type()); //TODO ARRAY Generalize + return Neq::make(tensorValue, lower(zeroVal)); + } - append(stmts, loweredCases); - Stmt body = Block::make(stmts); + std::vector LowererImplImperative::getModeIterators(const std::vector& iters) { + // For now only check mode iterators. + return filter(iters, [](const Iterator& it){return it.isModeIterator();}); + } - return Block::make(declInserterPosVars, declLocatorPosVars, body); - } + std::vector LowererImplImperative::constructInnerLoopCasePreamble(ir::Expr coordinate, IndexVar coordinateVar, + MergeLattice lattice, + map& iteratorToConditionMap) { + vector result; - Stmt initVals = resizeAndInitValues(appenders, reducedAccesses); + // First, get mode iterator coordinate comparisons + std::vector modeIterators = getModeIterators(lattice.iterators()); + vector coordComparisonsForModeIters = compareToResolvedCoordinate(modeIterators, coordinate, coordinateVar); - // Code of loop body statement - Stmt body = lower(stmt); + std::vector modeItersWithIndexCases; + std::vector coordComparisons; + for(size_t i = 0; i < coordComparisonsForModeIters.size(); ++i) { + Expr expr = coordComparisonsForModeIters[i]; + if (expr.defined()) { + modeItersWithIndexCases.push_back(modeIterators[i]); + coordComparisons.push_back(expr); + } + } - // Code to append coordinates - Stmt appendCoords = appendCoordinate(appenders, coordinate); + // Construct tensor iterators with modeIterators first then locate iterators to keep a mapping between vector indices + vector tensorIterators = combine(modeItersWithIndexCases, lattice.locators()); + tensorIterators = getModeIterators(tensorIterators); + + // Get value comparisons for all tensor iterators + vector itAccesses; + vector valueComparisons; + for(auto it : tensorIterators) { + Access itAccess = iterators.modeAccess(it).getAccess(); + itAccesses.push_back(itAccess); + if(it.isLeaf()) { + valueComparisons.push_back(constructCheckForAccessZero(itAccess)); + } else { + valueComparisons.push_back(Expr()); + } + } - // TODO: Emit code to insert coordinates + // Construct isNonZero cases + for(size_t i = 0; i < coordComparisons.size(); ++i) { + Expr nonZeroCase; + if(coordComparisons[i].defined() && valueComparisons[i].defined()) { + nonZeroCase = conjunction({coordComparisons[i], valueComparisons[i]}); + } else if (valueComparisons[i].defined()) { + nonZeroCase = valueComparisons[i]; + } else if (coordComparisons[i].defined()) { + nonZeroCase = coordComparisons[i]; + } else { + continue; + } + Expr caseName = Var::make(itAccesses[i].getTensorVar().getName() + "_isNonZero", taco::Bool); + Stmt declaration = VarDecl::make(caseName, nonZeroCase); + result.push_back(declaration); + iteratorToConditionMap[tensorIterators[i]] = caseName; + } - return Block::make(initVals, - declInserterPosVars, - declLocatorPosVars, - body, - appendCoords); -} + for(size_t i = modeItersWithIndexCases.size(); i < valueComparisons.size(); ++i) { + Expr caseName = Var::make(itAccesses[i].getTensorVar().getName() + "_isNonZero", taco::Bool); + Stmt declaration = VarDecl::make(caseName, valueComparisons[i]); + result.push_back(declaration); + iteratorToConditionMap[tensorIterators[i]] = caseName; + } -Expr LowererImplImperative::getTemporarySize(Where where) { - TensorVar temporary = where.getTemporary(); - int temporaryOrder = temporary.getType().getShape().getOrder(); - - Access temporaryAccess = getResultAccesses(where.getProducer()).first[0]; - std::vector indexVars = temporaryAccess.getIndexVars(); - - if(util::all(indexVars, [&](const IndexVar& var) { return provGraph.isUnderived(var);})) { - // All index vars underived then use tensor properties to get tensor size - taco_iassert(util::contains(dimensions, indexVars[0])) << "Missing " << indexVars[0]; - ir::Expr size = dimensions.at(indexVars[0]); - vector temporarySizeVector = {size}; - - for(size_t i = 1; i < indexVars.size(); ++i) { - taco_iassert(util::contains(dimensions, indexVars[i])) << "Missing " << indexVars[i]; - auto dimGP = dimensions.at(indexVars[i]); - size = ir::Mul::make(size, dimGP); - temporarySizeVector.push_back(dimGP); - } - temporarySizeMap[temporary] = temporarySizeVector; - return size; - } - - vector sizeVector; - Expr finalSize; - for (int i = 0; i < temporaryOrder; i++) { - Dimension temporarySize = temporary.getType().getShape().getDimension(i); - Expr size; - if (temporarySize.isFixed()) { - size = ir::Literal::make(temporarySize.getSize()); - - } else if (temporarySize.isIndexVarSized()) { - IndexVar var = temporarySize.getIndexVarSize(); - vector bounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, - indexVarToExprMap, iterators); - size = ir::Sub::make(bounds[1], bounds[0]); - } - sizeVector.push_back(size); - if (i == 0) - finalSize = size; - else - finalSize = ir::Mul::make(finalSize, size); - } - temporarySizeMap[temporary] = sizeVector; - return finalSize; - - taco_ierror; // TODO - return Expr(); -} + return result; + } + vector LowererImplImperative::lowerCasesFromMap(map iteratorToCondition, + ir::Expr coordinate, IndexStmt stmt, const MergeLattice& lattice, + const std::set& reducedAccesses) { -vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { vector decl; return decl;} -/* -vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { - // if parallel == true, need to initialize dense accelerator arrays as size*numThreads - // and rename all dense accelerator arrays to name + '_all' - - TensorVar temporary = where.getTemporary(); - - // TODO: emit as uint64 and manually emit bit pack code - const Datatype bitGuardType = taco::Bool; - std::string bitGuardSuffix; - if (parallel) - bitGuardSuffix = "_already_set_all"; - else - bitGuardSuffix = "_already_set"; - const std::string bitGuardName = temporary.getName() + bitGuardSuffix; - - Expr bitGuardSize = getTemporarySize(where); - Expr maxThreads = ir::Call::make("omp_get_max_threads", {}, bitGuardSize.type()); - if (parallel) - bitGuardSize = ir::Mul::make(bitGuardSize, maxThreads); - - const Expr alreadySetArr = ir::Var::make(bitGuardName, - bitGuardType, - true, false); - - // TODO: TACO should probably keep state on if it can use int32 or if it should switch to - // using int64 for indices. This assumption is made in other places of taco. - const Datatype indexListType = taco::Int32; - std::string indexListSuffix; - if (parallel) - indexListSuffix = "_index_list_all"; - else - indexListSuffix = "_index_list"; - - const std::string indexListName = temporary.getName() + indexListSuffix; - const Expr indexListArr = ir::Var::make(indexListName, - indexListType, - true, false); - - // no decl for shared memory - Stmt alreadySetDecl = Stmt(); - Stmt indexListDecl = Stmt(); - Stmt freeTemps = Block::make(Free::make(indexListArr), Free::make(alreadySetArr)); - if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { - alreadySetDecl = VarDecl::make(alreadySetArr, ir::Literal::make(0)); - indexListDecl = VarDecl::make(indexListArr, ir::Literal::make(0)); - } - - if (parallel) { - whereToIndexListAll[where] = indexListArr; - whereToBitGuardAll[where] = alreadySetArr; - } else { - const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); - tempToIndexList[temporary] = indexListArr; - tempToIndexListSize[temporary] = indexListSizeExpr; - tempToBitGuard[temporary] = alreadySetArr; - } - - Stmt allocateIndexList = Allocate::make(indexListArr, bitGuardSize); - if(should_use_CUDA_codegen()) { - Stmt allocateAlreadySet = Allocate::make(alreadySetArr, bitGuardSize); - Expr p = Var::make("p" + temporary.getName(), Int()); - Stmt guardZeroInit = Store::make(alreadySetArr, p, ir::Literal::zero(bitGuardType)); - - Stmt zeroInitLoop = For::make(p, 0, bitGuardSize, 1, guardZeroInit, LoopKind::Serial); - Stmt inits = Block::make(alreadySetDecl, indexListDecl, allocateAlreadySet, allocateIndexList, zeroInitLoop); - return {inits, freeTemps}; - } else { - Expr sizeOfElt = Sizeof::make(bitGuardType); - Expr callocAlreadySet = ir::Call::make("calloc", {bitGuardSize, sizeOfElt}, Int()); - Stmt allocateAlreadySet = VarDecl::make(alreadySetArr, callocAlreadySet); - Stmt inits = Block::make(indexListDecl, allocateIndexList, allocateAlreadySet); - return {inits, freeTemps}; - } + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(lattice.results()); + + std::vector result; + vector> cases; + for (MergePoint point : lattice.points()) { + + if(point.isOmitter()) { + continue; + } + + // Construct case expression + vector isNonZeroComparisions; + for(auto& it : combine(point.rangers(), point.locators())) { + if(util::contains(iteratorToCondition, it)) { + taco_iassert(iteratorToCondition.at(it).type() == taco::Bool) << "Map must have boolean types"; + isNonZeroComparisions.push_back(iteratorToCondition.at(it)); + } + } + + function getNegatedComparison = [&](const Iterator& it) {return ir::Neg::make(iteratorToCondition.at(it));}; + vector omittedRegionIterators = lattice.retrieveRegionIteratorsToOmit(point); + for(auto& it : omittedRegionIterators) { + if(util::contains(iteratorToCondition, it)) { + isNonZeroComparisions.push_back(ir::Neg::make(iteratorToCondition.at(it))); + } + } + + // Construct case body + IndexStmt zeroedStmt = zero(stmt, getExhaustedAccesses(point, lattice)); + Stmt body = lowerForallBody(coordinate, zeroedStmt, {}, + inserters, appenders, MergeLattice({point}), reducedAccesses); + if (isNonZeroComparisions.empty()) { + Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, + appenders, MergeLattice({point}), reducedAccesses); + result.push_back(body); + break; + } + cases.push_back({taco::ir::conjunction(isNonZeroComparisions), body}); + } + + vector inputs = combine(lattice.iterators(), lattice.locators()); + inputs = getModeIterators(inputs); + + if(!lattice.exact() && util::any(inserters, [](Iterator it){return it.isFull();}) && hasNoForAlls(stmt) + && any(inputs, [](Iterator it){return it.isFull();})) { + // Currently, if the lattice is not exact, the output is full and any of the inputs are full, we initialize + // the result tensor + vector stmts; + for(auto& it : inserters) { + if(it.isFull()) { + Access access = iterators.modeAccess(it).getAccess(); + IndexStmt initStmt = Assignment(access, Literal::zero(access.getDataType())); + Stmt initialization = lowerForallBody(coordinate, initStmt, {}, inserters, + appenders, MergeLattice({}), reducedAccesses); + stmts.push_back(initialization); + } + } + Stmt backgroundInit = Block::make(stmts); + cases.push_back({Expr((bool) true), backgroundInit}); + result.push_back(Case::make(cases, true)); + } else { + result.push_back(Case::make(cases, lattice.exact())); + } + return result; + } + +/// Lowers a merge lattice to cases assuming there are no more loops to be emitted in stmt. + Stmt LowererImplImperative::lowerMergeCasesWithExplicitZeroChecks(ir::Expr coordinate, IndexVar coordinateVar, IndexStmt stmt, + MergeLattice lattice, const std::set& reducedAccesses) { + + vector result; + if (lattice.points().size() == 1 && lattice.iterators().size() == 1 + || (lattice.exact() && + isa(stmt) && returnsTrue(stmt.as().getRhs()))) { + // Just one iterator so no conditional + vector appenders; + vector inserters; + tie(appenders, inserters) = splitAppenderAndInserters(lattice.results()); + taco_iassert(!lattice.points()[0].isOmitter()); + Stmt body = lowerForallBody(coordinate, stmt, {}, inserters, + appenders, lattice, reducedAccesses); + result.push_back(body); + } else if (!lattice.points().empty()) { + map iteratorToConditionMap; + + vector preamble = constructInnerLoopCasePreamble(coordinate, coordinateVar, lattice, iteratorToConditionMap); + util::append(result, preamble); + vector cases = lowerCasesFromMap(iteratorToConditionMap, coordinate, stmt, lattice, reducedAccesses); + util::append(result, cases); + } + + return Block::make(result); + } + + Stmt LowererImplImperative::lowerForallBody(Expr coordinate, IndexStmt stmt, + vector locators, + vector inserters, + vector appenders, + MergeLattice caseLattice, + const set& reducedAccesses) { + + // Inserter positions + Stmt declInserterPosVars = declLocatePosVars(inserters); + + // Locate positions + Stmt declLocatorPosVars = declLocatePosVars(locators); + + if (captureNextLocatePos) { + capturedLocatePos = Block::make(declInserterPosVars, declLocatorPosVars); + captureNextLocatePos = false; + } + + if (caseLattice.anyModeIteratorIsLeaf() && caseLattice.points().size() > 1) { + + // Code of loop body statement + // Explicit zero checks needed + std::vector stmts; + + // Need to emit checks based on case lattice + vector modeIterators = getModeIterators(combine(caseLattice.iterators(), caseLattice.locators())); + std::map caseMap; + for(auto it : modeIterators) { + if(it.isLeaf()) { + // Only emit explicit 0 checks for leaf iterators since these are the only iterators can can access tensor + // values array + Access itAccess = iterators.modeAccess(it).getAccess(); + Expr accessCase = constructCheckForAccessZero(itAccess); + caseMap.insert({it, accessCase}); + } + } + + // This will lower the body for each case to actually compute. Therefore, we don't need to resize assembly arrays + std::vector loweredCases = lowerCasesFromMap(caseMap, coordinate, stmt, caseLattice, reducedAccesses); + + append(stmts, loweredCases); + Stmt body = Block::make(stmts); + + return Block::make(declInserterPosVars, declLocatorPosVars, body); + } + + Stmt initVals = resizeAndInitValues(appenders, reducedAccesses); + + // Code of loop body statement + Stmt body = lower(stmt); + + // Code to append coordinates + Stmt appendCoords = appendCoordinate(appenders, coordinate); + + // TODO: Emit code to insert coordinates + + return Block::make(initVals, + declInserterPosVars, + declLocatorPosVars, + body, + appendCoords); + } + + Expr LowererImplImperative::getTemporarySize(Where where) { + TensorVar temporary = where.getTemporary(); + int temporaryOrder = temporary.getType().getShape().getOrder(); + + Access temporaryAccess = getResultAccesses(where.getProducer()).first[0]; + std::vector indexVars = temporaryAccess.getIndexVars(); + + if(util::all(indexVars, [&](const IndexVar& var) { return provGraph.isUnderived(var);})) { + // All index vars underived then use tensor properties to get tensor size + taco_iassert(util::contains(dimensions, indexVars[0])) << "Missing " << indexVars[0]; + ir::Expr size = dimensions.at(indexVars[0]); + vector temporarySizeVector = {size}; + + for(size_t i = 1; i < indexVars.size(); ++i) { + taco_iassert(util::contains(dimensions, indexVars[i])) << "Missing " << indexVars[i]; + auto dimGP = dimensions.at(indexVars[i]); + size = ir::Mul::make(size, dimGP); + temporarySizeVector.push_back(dimGP); + } + temporarySizeMap[temporary] = temporarySizeVector; + return size; + } + + vector sizeVector; + Expr finalSize; + for (int i = 0; i < temporaryOrder; i++) { + Dimension temporarySize = temporary.getType().getShape().getDimension(i); + Expr size; + if (temporarySize.isFixed()) { + size = ir::Literal::make(temporarySize.getSize()); + + } else if (temporarySize.isIndexVarSized()) { + IndexVar var = temporarySize.getIndexVarSize(); + vector bounds = provGraph.deriveIterBounds(var, definedIndexVarsOrdered, underivedBounds, + indexVarToExprMap, iterators); + size = ir::Sub::make(bounds[1], bounds[0]); + } + sizeVector.push_back(size); + if (i == 0) + finalSize = size; + else + finalSize = ir::Mul::make(finalSize, size); + } + temporarySizeMap[temporary] = sizeVector; + return finalSize; + + taco_ierror; // TODO + return Expr(); + } + + +//vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { vector decl; return decl;} + + vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where where, bool parallel) { + // if parallel == true, need to initialize dense accelerator arrays as size*numThreads + // and rename all dense accelerator arrays to name + '_all' + + TensorVar temporary = where.getTemporary(); + + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + std::string bitGuardSuffix; + if (parallel) + bitGuardSuffix = "_already_set_all"; + else + bitGuardSuffix = "_already_set"; + const std::string bitGuardName = temporary.getName() + bitGuardSuffix; + + Expr bitGuardSize = getTemporarySize(where); + Expr maxThreads = ir::Call::make("omp_get_max_threads", {}, bitGuardSize.type()); + if (parallel) + bitGuardSize = ir::Mul::make(bitGuardSize, maxThreads); + + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + std::string indexListSuffix; + if (parallel) + indexListSuffix = "_index_list_all"; + else + indexListSuffix = "_index_list"; + + const std::string indexListName = temporary.getName() + indexListSuffix; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + // no decl for shared memory + Stmt alreadySetDecl = Stmt(); + Stmt indexListDecl = Stmt(); + Stmt freeTemps = Block::make(Free::make(indexListArr), Free::make(alreadySetArr)); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { + alreadySetDecl = VarDecl::make(alreadySetArr, ir::Literal::make(0)); + indexListDecl = VarDecl::make(indexListArr, ir::Literal::make(0)); + } + + if (parallel) { + whereToIndexListAll[where] = indexListArr; + whereToBitGuardAll[where] = alreadySetArr; + } else { + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + + Stmt allocateIndexList = Allocate::make(indexListArr, bitGuardSize); + if(should_use_CUDA_codegen()) { + Stmt allocateAlreadySet = Allocate::make(alreadySetArr, bitGuardSize); + Expr p = Var::make("p" + temporary.getName(), Int()); + Stmt guardZeroInit = Store::make(alreadySetArr, p, ir::Literal::zero(bitGuardType)); + + Stmt zeroInitLoop = For::make(p, 0, bitGuardSize, 1, guardZeroInit, LoopKind::Serial); + Stmt inits = Block::make(alreadySetDecl, indexListDecl, allocateAlreadySet, allocateIndexList, zeroInitLoop); + return {inits, freeTemps}; + } else { + Expr sizeOfElt = Sizeof::make(bitGuardType); + Expr callocAlreadySet = ir::Call::make("calloc", {bitGuardSize, sizeOfElt}, Int()); + Stmt allocateAlreadySet = VarDecl::make(alreadySetArr, callocAlreadySet); + Stmt inits = Block::make(indexListDecl, allocateIndexList, allocateAlreadySet); + return {inits, freeTemps}; + } + + } -} -*/ // Returns true if the following conditions are met: // 1) The temporary is a dense vector @@ -2222,1804 +2222,1804 @@ vector LowererImplImperative::codeToInitializeDenseAcceleratorArrays(Where // the sort. CUB support is built into CUDA 11 but not prior versions of // CUDA so in that case, we'd probably need to include the CUB headers in // the generated code. -std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { return std::make_pair(true, true);} -/* -std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { - // TODO: TEMPORARY -- Needs to be removed - if(should_use_CUDA_codegen()) { - return std::make_pair(false, false); - } - - TensorVar temporary = where.getTemporary(); - // (1) Temporary is dense vector - if(!isDense(temporary.getFormat()) || temporary.getOrder() != 1) { - return std::make_pair(false, false); - } - - // (2) Multiple operands in inputs (need lattice to reason about iteration) - const auto inputAccesses = getArgumentAccesses(where.getConsumer()); - if(inputAccesses.size() > 1 || inputAccesses.empty()) { - return std::make_pair(false, false); - } - - // No or multiple results? - const auto resultAccesses = getResultAccesses(where.getConsumer()).first; - if(resultAccesses.size() > 1 || resultAccesses.empty()) { - return std::make_pair(false, false); - } - - // No check for size of tempVar since we enforced the temporary is a vector - // and if there is only one RHS value, it must (should?) be the temporary - std::vector tempVar = inputAccesses[0].getIndexVars(); - - // Get index vars in result. - std::vector resultVars = resultAccesses[0].getIndexVars(); - auto it = std::find_if(resultVars.begin(), resultVars.end(), - [&](const auto& resultVar) { - return resultVar == tempVar[0] || - provGraph.isDerivedFrom(tempVar[0], resultVar); - }); - - if (it == resultVars.end()) { - return std::make_pair(true, false); - } - - int index = (int)(it - resultVars.begin()); - TensorVar resultTensor = resultAccesses[0].getTensorVar(); - int modeIndex = resultTensor.getFormat().getModeOrdering()[index]; - ModeFormat varFmt = resultTensor.getFormat().getModeFormats()[modeIndex]; - // (3) Level of result is sparse - if(varFmt.isFull()) { - return std::make_pair(false, false); - } - - // Only need to sort the workspace if the result needs to be ordered - return std::make_pair(true, varFmt.isOrdered()); -} -*/ +//std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { return std::make_pair(true, true);} + + std::pair LowererImplImperative::canAccelerateDenseTemp(Where where) { + // TODO: TEMPORARY -- Needs to be removed + if(should_use_CUDA_codegen()) { + return std::make_pair(false, false); + } + + TensorVar temporary = where.getTemporary(); + // (1) Temporary is dense vector + if(!isDense(temporary.getFormat()) || temporary.getOrder() != 1) { + return std::make_pair(false, false); + } + + // (2) Multiple operands in inputs (need lattice to reason about iteration) + const auto inputAccesses = getArgumentAccesses(where.getConsumer()); + if(inputAccesses.size() > 1 || inputAccesses.empty()) { + return std::make_pair(false, false); + } + + // No or multiple results? + const auto resultAccesses = getResultAccesses(where.getConsumer()).first; + if(resultAccesses.size() > 1 || resultAccesses.empty()) { + return std::make_pair(false, false); + } + + // No check for size of tempVar since we enforced the temporary is a vector + // and if there is only one RHS value, it must (should?) be the temporary + std::vector tempVar = inputAccesses[0].getIndexVars(); + + // Get index vars in result. + std::vector resultVars = resultAccesses[0].getIndexVars(); + auto it = std::find_if(resultVars.begin(), resultVars.end(), + [&](const auto& resultVar) { + return resultVar == tempVar[0] || + provGraph.isDerivedFrom(tempVar[0], resultVar); + }); + + if (it == resultVars.end()) { + return std::make_pair(true, false); + } + + int index = (int)(it - resultVars.begin()); + TensorVar resultTensor = resultAccesses[0].getTensorVar(); + int modeIndex = resultTensor.getFormat().getModeOrdering()[index]; + ModeFormat varFmt = resultTensor.getFormat().getModeFormats()[modeIndex]; + // (3) Level of result is sparse + if(varFmt.isFull()) { + return std::make_pair(false, false); + } + + // Only need to sort the workspace if the result needs to be ordered + return std::make_pair(true, varFmt.isOrdered()); + } + // Code to initialize the local temporary workspace from the shared workspace // in codeToInitializeTemporaryParallel for a SINGLE parallel unit // (e.g.) the local workspace that each thread uses -vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decls; return decls; } -/* -vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { - TensorVar temporary = where.getTemporary(); - vector decls; - - Expr tempSize = getTemporarySize(where); - Expr threadNum = ir::Call::make("omp_get_thread_num", {}, tempSize.type()); - tempSize = ir::Mul::make(tempSize, threadNum); - - bool accelerateDense = canAccelerateDenseTemp(where).first; - - Expr values; - if (util::contains(needCompute, temporary) && - needComputeValues(where, temporary)) { - // Declare local temporary workspace array - values = ir::Var::make(temporary.getName(), - temporary.getType().getDataType(), - true, false); - Expr values_all = this->temporaryArrays[this->whereToTemporaryVar[where]].values; - Expr tempRhs = ir::Add::make(values_all, tempSize); - Stmt tempDecl = ir::VarDecl::make(values, tempRhs); - decls.push_back(tempDecl); - } - /// Make a struct object that lowerAssignment and lowerAccess can read - /// temporary value arrays from. - TemporaryArrays arrays; - arrays.values = values; - this->temporaryArrays.insert({temporary, arrays}); - - if (accelerateDense) { - // Declare local index list array - // TODO: TACO should probably keep state on if it can use int32 or if it should switch to - // using int64 for indices. This assumption is made in other places of taco. - const Datatype indexListType = taco::Int32; - const std::string indexListName = temporary.getName() + "_index_list"; - const Expr indexListArr = ir::Var::make(indexListName, - indexListType, - true, false); +//vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decls; return decls; } + + vector LowererImplImperative::codeToInitializeLocalTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + vector decls; + + Expr tempSize = getTemporarySize(where); + Expr threadNum = ir::Call::make("omp_get_thread_num", {}, tempSize.type()); + tempSize = ir::Mul::make(tempSize, threadNum); + + bool accelerateDense = canAccelerateDenseTemp(where).first; + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + // Declare local temporary workspace array + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr values_all = this->temporaryArrays[this->whereToTemporaryVar[where]].values; + Expr tempRhs = ir::Add::make(values_all, tempSize); + Stmt tempDecl = ir::VarDecl::make(values, tempRhs); + decls.push_back(tempDecl); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + + if (accelerateDense) { + // Declare local index list array + // TODO: TACO should probably keep state on if it can use int32 or if it should switch to + // using int64 for indices. This assumption is made in other places of taco. + const Datatype indexListType = taco::Int32; + const std::string indexListName = temporary.getName() + "_index_list"; + const Expr indexListArr = ir::Var::make(indexListName, + indexListType, + true, false); + + Expr indexList_all = this->whereToIndexListAll[where]; + Expr indexListRhs = ir::Add::make(indexList_all, tempSize); + Stmt indexListDecl = ir::VarDecl::make(indexListArr, indexListRhs); + decls.push_back(indexListDecl); + + // Declare local indexList size variable + const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); + + // Declare local already set array (bit guard) + // TODO: emit as uint64 and manually emit bit pack code + const Datatype bitGuardType = taco::Bool; + const std::string bitGuardName = temporary.getName() + "_already_set"; + const Expr alreadySetArr = ir::Var::make(bitGuardName, + bitGuardType, + true, false); + Expr bitGuard_all = this->whereToBitGuardAll[where]; + Expr bitGuardRhs = ir::Add::make(bitGuard_all, tempSize); + Stmt bitGuardDecl = ir::VarDecl::make(alreadySetArr, bitGuardRhs); + decls.push_back(bitGuardDecl); + + tempToIndexList[temporary] = indexListArr; + tempToIndexListSize[temporary] = indexListSizeExpr; + tempToBitGuard[temporary] = alreadySetArr; + } + return decls; + } - Expr indexList_all = this->whereToIndexListAll[where]; - Expr indexListRhs = ir::Add::make(indexList_all, tempSize); - Stmt indexListDecl = ir::VarDecl::make(indexListArr, indexListRhs); - decls.push_back(indexListDecl); - - // Declare local indexList size variable - const Expr indexListSizeExpr = ir::Var::make(indexListName + "_size", taco::Int32, false, false); - - // Declare local already set array (bit guard) - // TODO: emit as uint64 and manually emit bit pack code - const Datatype bitGuardType = taco::Bool; - const std::string bitGuardName = temporary.getName() + "_already_set"; - const Expr alreadySetArr = ir::Var::make(bitGuardName, - bitGuardType, - true, false); - Expr bitGuard_all = this->whereToBitGuardAll[where]; - Expr bitGuardRhs = ir::Add::make(bitGuard_all, tempSize); - Stmt bitGuardDecl = ir::VarDecl::make(alreadySetArr, bitGuardRhs); - decls.push_back(bitGuardDecl); - - tempToIndexList[temporary] = indexListArr; - tempToIndexListSize[temporary] = indexListSizeExpr; - tempToBitGuard[temporary] = alreadySetArr; - } - return decls; -} -*/ // Code to initialize a temporary workspace that is SHARED across ALL parallel units. // New temporaries are denoted by temporary.getName() + '_all' // Currently only supports CPUThreads -vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decl; return decl;} -/* -vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { - TensorVar temporary = where.getTemporary(); - // For the parallel case, need to hoist up a workspace shared by all threads - TensorVar temporaryAll = TensorVar(temporary.getName() + "_all", temporary.getType(), temporary.getFormat()); - this->whereToTemporaryVar[where] = temporaryAll; - - bool accelerateDense = canAccelerateDenseTemp(where).first; - - Stmt freeTemporary = Stmt(); - Stmt initializeTemporary = Stmt(); - - // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays - // to construct the result indices - if(accelerateDense) { - vector initAndFree = codeToInitializeDenseAcceleratorArrays(where, true); - initializeTemporary = initAndFree[0]; - freeTemporary = initAndFree[1]; - } - - Expr values; - if (util::contains(needCompute, temporary) && - needComputeValues(where, temporary)) { - values = ir::Var::make(temporaryAll.getName(), - temporaryAll.getType().getDataType(), - true, false); - Expr size = getTemporarySize(where); - Expr sizeAll = ir::Mul::make(size, ir::Call::make("omp_get_max_threads", {}, size.type())); - - // no decl needed for shared memory - Stmt decl = Stmt(); - if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { - decl = VarDecl::make(values, ir::Literal::make(0)); - } - Stmt allocate = Allocate::make(values, sizeAll); - - freeTemporary = Block::make(freeTemporary, Free::make(values)); - initializeTemporary = Block::make(decl, initializeTemporary, allocate); - } - /// Make a struct object that lowerAssignment and lowerAccess can read - /// temporary value arrays from. - TemporaryArrays arrays; - arrays.values = values; - this->temporaryArrays.insert({temporaryAll, arrays}); - - return {initializeTemporary, freeTemporary}; -} -*/ -vector LowererImplImperative::codeToInitializeTemporary(Where where) {vector decl; return decl;} -/* -vector LowererImplImperative::codeToInitializeTemporary(Where where) { - TensorVar temporary = where.getTemporary(); - - const bool accelerateDense = canAccelerateDenseTemp(where).first; - - Stmt freeTemporary = Stmt(); - Stmt initializeTemporary = Stmt(); - if (isScalar(temporary.getType())) { - initializeTemporary = defineScalarVariable(temporary, true); - Expr tempSet = ir::Var::make(temporary.getName() + "_set", Datatype::Bool); - Stmt initTempSet = VarDecl::make(tempSet, false); - initializeTemporary = Block::make(initializeTemporary, initTempSet); - tempToBitGuard[temporary] = tempSet; - } else { - // TODO: Need to support keeping track of initialized elements for - // temporaries that don't have sparse accelerator - taco_iassert(!util::contains(guardedTemps, temporary) || accelerateDense); - - // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays - // to construct the result indices - if(accelerateDense) { - vector initAndFree = codeToInitializeDenseAcceleratorArrays(where); - initializeTemporary = initAndFree[0]; - freeTemporary = initAndFree[1]; - } - - Expr values; - if (util::contains(needCompute, temporary) && - needComputeValues(where, temporary)) { - values = ir::Var::make(temporary.getName(), - temporary.getType().getDataType(), true, false); - - Expr size = getTemporarySize(where); - - // no decl needed for shared memory - Stmt decl = Stmt(); - if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { - decl = VarDecl::make(values, ir::Literal::make(0)); - } - Stmt allocate = Allocate::make(values, size); - - freeTemporary = Block::make(freeTemporary, Free::make(values)); - initializeTemporary = Block::make(decl, initializeTemporary, allocate); - } - - /// Make a struct object that lowerAssignment and lowerAccess can read - /// temporary value arrays from. - TemporaryArrays arrays; - arrays.values = values; - this->temporaryArrays.insert({temporary, arrays}); - } - return {initializeTemporary, freeTemporary}; -} -*/ -Stmt LowererImplImperative::lowerWhere(Where where) { return Stmt(); } -/* -Stmt LowererImplImperative::lowerWhere(Where where) { - TensorVar temporary = where.getTemporary(); - bool accelerateDenseWorkSpace, sortAccelerator; - std::tie(accelerateDenseWorkSpace, sortAccelerator) = - canAccelerateDenseTemp(where); - - // Declare and initialize the where statement's temporary - vector temporaryValuesInitFree = {Stmt(), Stmt()}; - bool temporaryHoisted = false; - for (auto it = temporaryInitialization.begin(); it != temporaryInitialization.end(); ++it) { - if (it->second == where && it->first.getParallelUnit() == - ParallelUnit::NotParallel && !isScalar(temporary.getType())) { - temporaryHoisted = true; - } else if (it->second == where && it->first.getParallelUnit() == - ParallelUnit::CPUThread && !isScalar(temporary.getType())) { - temporaryHoisted = true; - auto decls = codeToInitializeLocalTemporaryParallel(where, it->first.getParallelUnit()); - - temporaryValuesInitFree[0] = ir::Block::make(decls); - } - } - - if (!temporaryHoisted) { - temporaryValuesInitFree = codeToInitializeTemporary(where); - } - - Stmt initializeTemporary = temporaryValuesInitFree[0]; - Stmt freeTemporary = temporaryValuesInitFree[1]; - - match(where.getConsumer(), - std::function([&](const AssignmentNode* op) { - if (op->lhs.getTensorVar().getOrder() > 0) { - whereTempsToResult[where.getTemporary()] = (const AccessNode *) op->lhs.ptr; - } - }) - ); - - Stmt consumer = lower(where.getConsumer()); - if (accelerateDenseWorkSpace && sortAccelerator) { - // We need to sort the indices array - Expr listOfIndices = tempToIndexList.at(temporary); - Expr listOfIndicesSize = tempToIndexListSize.at(temporary); - Expr sizeOfElt = ir::Sizeof::make(listOfIndices.type()); - Stmt sortCall = ir::Sort::make({listOfIndices, listOfIndicesSize, sizeOfElt}); - consumer = Block::make(sortCall, consumer); - } - - // Now that temporary allocations are hoisted, we always need to emit an initialization loop before entering the - // producer but only if there is no dense acceleration - if (util::contains(needCompute, temporary) && !isScalar(temporary.getType()) && !accelerateDenseWorkSpace) { - // TODO: We only actually need to do this if: - // 1) We use the temporary multiple times - // 2) The PRODUCER RHS is sparse(not full). (Guarantees that old values are overwritten before consuming) - - Expr p = Var::make("p" + temporary.getName(), Int()); - Expr values = ir::Var::make(temporary.getName(), - temporary.getType().getDataType(), - true, false); - Expr size = getTemporarySize(where); - Stmt zeroInit = Store::make(values, p, ir::Literal::zero(temporary.getType().getDataType())); - Stmt loopInit = For::make(p, 0, size, 1, zeroInit, LoopKind::Serial); - initializeTemporary = Block::make(initializeTemporary, loopInit); - } - - whereConsumers.push_back(consumer); - whereTemps.push_back(where.getTemporary()); - captureNextLocatePos = true; - - // don't apply atomics to producer TODO: mark specific assignments as atomic - bool restoreAtomicDepth = false; - if (markAssignsAtomicDepth > 0) { - markAssignsAtomicDepth--; - restoreAtomicDepth = true; - } - - Stmt producer = lower(where.getProducer()); - if (accelerateDenseWorkSpace) { - const Expr indexListSizeExpr = tempToIndexListSize.at(temporary); - const Stmt indexListSizeDecl = VarDecl::make(indexListSizeExpr, ir::Literal::make(0)); - initializeTemporary = Block::make(indexListSizeDecl, initializeTemporary); - } - - if (restoreAtomicDepth) { - markAssignsAtomicDepth++; - } - - whereConsumers.pop_back(); - whereTemps.pop_back(); - whereTempsToResult.erase(where.getTemporary()); - return Block::make(initializeTemporary, producer, markAssignsAtomicDepth > 0 ? capturedLocatePos : ir::Stmt(), consumer, freeTemporary); -} -*/ +//vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { vector decl; return decl;} -Stmt LowererImplImperative::lowerSequence(Sequence sequence) { - Stmt definition = lower(sequence.getDefinition()); - Stmt mutation = lower(sequence.getMutation()); - return Block::make(definition, mutation); -} + vector LowererImplImperative::codeToInitializeTemporaryParallel(Where where, ParallelUnit parallelUnit) { + TensorVar temporary = where.getTemporary(); + // For the parallel case, need to hoist up a workspace shared by all threads + TensorVar temporaryAll = TensorVar(temporary.getName() + "_all", temporary.getType(), temporary.getFormat()); + this->whereToTemporaryVar[where] = temporaryAll; + bool accelerateDense = canAccelerateDenseTemp(where).first; -Stmt LowererImplImperative::lowerAssemble(Assemble assemble) { - Stmt queries, freeQueryResults; - if (generateAssembleCode() && assemble.getQueries().defined()) { - std::vector allocStmts, freeStmts; - const auto queryAccesses = getResultAccesses(assemble.getQueries()).first; - for (const auto& queryAccess : queryAccesses) { - const auto queryResult = queryAccess.getTensorVar(); - Expr values = ir::Var::make(queryResult.getName(), - queryResult.getType().getDataType(), - true, false); - - TemporaryArrays arrays; - arrays.values = values; - this->temporaryArrays.insert({queryResult, arrays}); - - // Compute size of query result - const auto indexVars = queryAccess.getIndexVars(); - taco_iassert(util::all(indexVars, - [&](const auto& var) { return provGraph.isUnderived(var); })); - Expr size = 1; - for (const auto& indexVar : indexVars) { - size = ir::Mul::make(size, getDimension(indexVar)); - } - - const bool zeroInit = isNonFullyInitialized(getTensorVar(queryResult)) || - util::contains(getResultAccesses(assemble.getQueries()).second, - queryAccess); - if (zeroInit) { - Expr sizeOfElt = Sizeof::make(queryResult.getType().getDataType()); - Expr callocValues = ir::Call::make("calloc", {size, sizeOfElt}, - queryResult.getType().getDataType()); - Stmt allocResult = VarDecl::make(values, callocValues); - allocStmts.push_back(allocResult); - } else { - Stmt declResult = VarDecl::make(values, 0); - allocStmts.push_back(declResult); - - Stmt allocResult = Allocate::make(values, size); - allocStmts.push_back(allocResult); - } - - Stmt freeResult = Free::make(values); - freeStmts.push_back(freeResult); - } - Stmt allocResults = Block::make(allocStmts); - freeQueryResults = Block::make(freeStmts); - - queries = lower(assemble.getQueries()); - queries = Block::blanks(allocResults, queries); - } - - vector resultAccesses; - set reducedAccesses; - std::tie(resultAccesses, reducedAccesses) = - getResultAccesses(assemble.getCompute()); - const auto& queryResults = assemble.getAttrQueryResults(); - - std::vector initAssembleStmts; - for (const auto& resultAccess : resultAccesses) { - Expr prevSize = 1; - std::vector coords; - const auto resultIterators = getIterators(resultAccess); - const auto resultTensor = resultAccess.getTensorVar(); - const auto resultTensorVar = getTensorVar(resultTensor); - const auto resultModeOrdering = resultTensor.getFormat().getModeOrdering(); - for (const auto& resultIterator : resultIterators) { - if (generateAssembleCode()) { - const size_t resultLevel = resultIterator.getMode().getLevel() - 1; - const auto queryResultVars = queryResults.at(resultTensor)[resultLevel]; - std::vector queryResults; - for (const auto& queryResultVar : queryResultVars) { - queryResults.emplace_back(getTensorVar(queryResultVar), - getValuesArray(queryResultVar)); - } - - if (resultIterator.hasSeqInsertEdge()) { - Stmt initEdges = resultIterator.getSeqInitEdges(prevSize, - queryResults); - initAssembleStmts.push_back(initEdges); - - Stmt insertEdgeLoop = resultIterator.getSeqInsertEdge( - resultIterator.getParent().getPosVar(), coords, queryResults); - auto locateCoords = coords; - for (auto iter = resultIterator.getParent(); !iter.isRoot(); - iter = iter.getParent()) { - if (iter.hasLocate()) { - Expr dim = GetProperty::make(resultTensorVar, - TensorProperty::Dimension, - resultModeOrdering[iter.getMode().getLevel() - 1]); - Expr pos = iter.getPosVar(); - Stmt initPos = VarDecl::make(pos, iter.locate(locateCoords)[0]); - insertEdgeLoop = For::make(coords.back(), 0, dim, 1, - Block::make(initPos, insertEdgeLoop)); - } else { - taco_not_supported_yet; - } - locateCoords.pop_back(); - } - initAssembleStmts.push_back(insertEdgeLoop); - } - - Stmt initCoords = resultIterator.getInitCoords(prevSize, queryResults); - initAssembleStmts.push_back(initCoords); - } - - Stmt initYieldPos = resultIterator.getInitYieldPos(prevSize); - initAssembleStmts.push_back(initYieldPos); - - prevSize = resultIterator.getAssembledSize(prevSize); - coords.push_back(getCoordinateVar(resultIterator)); - } - - Expr valuesArr = getValuesArray(resultTensor); - const bool zeroInit = isNonFullyInitialized(resultTensorVar) || - util::contains(reducedAccesses, resultAccess); - if (generateAssembleCode()) { - if (zeroInit && generateComputeCode()) { - const auto type = resultTensor.getType().getDataType(); - Expr sizeOfElt = Sizeof::make(type); - Expr callocValues = ir::Call::make("calloc", {prevSize, sizeOfElt}, - type); - Stmt allocResult = Assign::make(valuesArr, callocValues); - initAssembleStmts.push_back(allocResult); - } else { - Stmt initValues = Allocate::make(valuesArr, prevSize); - initAssembleStmts.push_back(initValues); - } - } else if (zeroInit) { - const auto type = resultTensor.getType().getDataType(); - initAssembleStmts.push_back(initValues(resultTensorVar, ir::Literal::zero(type), 0, prevSize)); - } - } - Stmt initAssemble = Block::make(initAssembleStmts); - - if (assemble.getQueries().defined()) { - // If assembly requires precomputing statistics about result, then - // allocation of memory might depend on these statistics being precise - // (e.g., compressed modes cannot be allocated with uninitialized padding). - // Since attribute queries are computed without accidental zeros being - // filtered out, assume that accidental nonzeros must also be explicitly - // inserted during assembly. - guardedTemps = util::toSet(getTemporaries(assemble.getCompute())); - } - Stmt compute = lower(assemble.getCompute()); - - std::vector finalizeAssembleStmts; - for (const auto& resultAccess : resultAccesses) { - Expr prevSize = 1; - const auto resultIterators = getIterators(resultAccess); - for (const auto& resultIterator : resultIterators) { - Stmt finalizeYieldPos = resultIterator.getFinalizeYieldPos(prevSize); - finalizeAssembleStmts.push_back(finalizeYieldPos); - - prevSize = resultIterator.getAssembledSize(prevSize); - } - } - Stmt finalizeAssemble = Block::make(finalizeAssembleStmts); - - return Block::blanks(queries, - initAssemble, - compute, - finalizeAssemble, - freeQueryResults); -} + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where, true); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } -Stmt LowererImplImperative::lowerMulti(Multi multi) { - Stmt stmt1 = lower(multi.getStmt1()); - Stmt stmt2 = lower(multi.getStmt2()); - return Block::make(stmt1, stmt2); -} + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporaryAll.getName(), + temporaryAll.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Expr sizeAll = ir::Mul::make(size, ir::Call::make("omp_get_max_threads", {}, size.type())); + + // no decl needed for shared memory + Stmt decl = Stmt(); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { + decl = VarDecl::make(values, ir::Literal::make(0)); + } + Stmt allocate = Allocate::make(values, sizeAll); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporaryAll, arrays}); + + return {initializeTemporary, freeTemporary}; + } + +//vector LowererImplImperative::codeToInitializeTemporary(Where where) {vector decl; return decl;} + + vector LowererImplImperative::codeToInitializeTemporary(Where where) { + TensorVar temporary = where.getTemporary(); + + const bool accelerateDense = canAccelerateDenseTemp(where).first; + + Stmt freeTemporary = Stmt(); + Stmt initializeTemporary = Stmt(); + if (isScalar(temporary.getType())) { + initializeTemporary = defineScalarVariable(temporary, true); + Expr tempSet = ir::Var::make(temporary.getName() + "_set", Datatype::Bool); + Stmt initTempSet = VarDecl::make(tempSet, false); + initializeTemporary = Block::make(initializeTemporary, initTempSet); + tempToBitGuard[temporary] = tempSet; + } else { + // TODO: Need to support keeping track of initialized elements for + // temporaries that don't have sparse accelerator + taco_iassert(!util::contains(guardedTemps, temporary) || accelerateDense); + + // When emitting code to accelerate dense workspaces with sparse iteration, we need the following arrays + // to construct the result indices + if(accelerateDense) { + vector initAndFree = codeToInitializeDenseAcceleratorArrays(where); + initializeTemporary = initAndFree[0]; + freeTemporary = initAndFree[1]; + } + + Expr values; + if (util::contains(needCompute, temporary) && + needComputeValues(where, temporary)) { + values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), true, false); + + Expr size = getTemporarySize(where); + + // no decl needed for shared memory + Stmt decl = Stmt(); + if ((isa(where.getProducer()) && inParallelLoopDepth == 0) || !should_use_CUDA_codegen()) { + decl = VarDecl::make(values, ir::Literal::make(0)); + } + Stmt allocate = Allocate::make(values, size); + + freeTemporary = Block::make(freeTemporary, Free::make(values)); + initializeTemporary = Block::make(decl, initializeTemporary, allocate); + } + + /// Make a struct object that lowerAssignment and lowerAccess can read + /// temporary value arrays from. + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({temporary, arrays}); + } + return {initializeTemporary, freeTemporary}; + } + +//Stmt LowererImplImperative::lowerWhere(Where where) { return Stmt(); } + + Stmt LowererImplImperative::lowerWhere(Where where) { + TensorVar temporary = where.getTemporary(); + bool accelerateDenseWorkSpace, sortAccelerator; + std::tie(accelerateDenseWorkSpace, sortAccelerator) = + canAccelerateDenseTemp(where); + + // Declare and initialize the where statement's temporary + vector temporaryValuesInitFree = {Stmt(), Stmt()}; + bool temporaryHoisted = false; + for (auto it = temporaryInitialization.begin(); it != temporaryInitialization.end(); ++it) { + if (it->second == where && it->first.getParallelUnit() == + ParallelUnit::NotParallel && !isScalar(temporary.getType())) { + temporaryHoisted = true; + } else if (it->second == where && it->first.getParallelUnit() == + ParallelUnit::CPUThread && !isScalar(temporary.getType())) { + temporaryHoisted = true; + auto decls = codeToInitializeLocalTemporaryParallel(where, it->first.getParallelUnit()); + + temporaryValuesInitFree[0] = ir::Block::make(decls); + } + } + + if (!temporaryHoisted) { + temporaryValuesInitFree = codeToInitializeTemporary(where); + } + + Stmt initializeTemporary = temporaryValuesInitFree[0]; + Stmt freeTemporary = temporaryValuesInitFree[1]; + + match(where.getConsumer(), + std::function([&](const AssignmentNode* op) { + if (op->lhs.getTensorVar().getOrder() > 0) { + whereTempsToResult[where.getTemporary()] = (const AccessNode *) op->lhs.ptr; + } + }) + ); + + Stmt consumer = lower(where.getConsumer()); + if (accelerateDenseWorkSpace && sortAccelerator) { + // We need to sort the indices array + Expr listOfIndices = tempToIndexList.at(temporary); + Expr listOfIndicesSize = tempToIndexListSize.at(temporary); + Expr sizeOfElt = ir::Sizeof::make(listOfIndices.type()); + Stmt sortCall = ir::Sort::make({listOfIndices, listOfIndicesSize, sizeOfElt}); + consumer = Block::make(sortCall, consumer); + } + + // Now that temporary allocations are hoisted, we always need to emit an initialization loop before entering the + // producer but only if there is no dense acceleration + if (util::contains(needCompute, temporary) && !isScalar(temporary.getType()) && !accelerateDenseWorkSpace) { + // TODO: We only actually need to do this if: + // 1) We use the temporary multiple times + // 2) The PRODUCER RHS is sparse(not full). (Guarantees that old values are overwritten before consuming) + + Expr p = Var::make("p" + temporary.getName(), Int()); + Expr values = ir::Var::make(temporary.getName(), + temporary.getType().getDataType(), + true, false); + Expr size = getTemporarySize(where); + Stmt zeroInit = Store::make(values, p, ir::Literal::zero(temporary.getType().getDataType())); + Stmt loopInit = For::make(p, 0, size, 1, zeroInit, LoopKind::Serial); + initializeTemporary = Block::make(initializeTemporary, loopInit); + } + + whereConsumers.push_back(consumer); + whereTemps.push_back(where.getTemporary()); + captureNextLocatePos = true; + + // don't apply atomics to producer TODO: mark specific assignments as atomic + bool restoreAtomicDepth = false; + if (markAssignsAtomicDepth > 0) { + markAssignsAtomicDepth--; + restoreAtomicDepth = true; + } + + Stmt producer = lower(where.getProducer()); + if (accelerateDenseWorkSpace) { + const Expr indexListSizeExpr = tempToIndexListSize.at(temporary); + const Stmt indexListSizeDecl = VarDecl::make(indexListSizeExpr, ir::Literal::make(0)); + initializeTemporary = Block::make(indexListSizeDecl, initializeTemporary); + } + + if (restoreAtomicDepth) { + markAssignsAtomicDepth++; + } + + whereConsumers.pop_back(); + whereTemps.pop_back(); + whereTempsToResult.erase(where.getTemporary()); + return Block::make(initializeTemporary, producer, markAssignsAtomicDepth > 0 ? capturedLocatePos : ir::Stmt(), consumer, freeTemporary); + } + + + Stmt LowererImplImperative::lowerSequence(Sequence sequence) { + Stmt definition = lower(sequence.getDefinition()); + Stmt mutation = lower(sequence.getMutation()); + return Block::make(definition, mutation); + } + + + Stmt LowererImplImperative::lowerAssemble(Assemble assemble) { + Stmt queries, freeQueryResults; + if (generateAssembleCode() && assemble.getQueries().defined()) { + std::vector allocStmts, freeStmts; + const auto queryAccesses = getResultAccesses(assemble.getQueries()).first; + for (const auto& queryAccess : queryAccesses) { + const auto queryResult = queryAccess.getTensorVar(); + Expr values = ir::Var::make(queryResult.getName(), + queryResult.getType().getDataType(), + true, false); + + TemporaryArrays arrays; + arrays.values = values; + this->temporaryArrays.insert({queryResult, arrays}); + + // Compute size of query result + const auto indexVars = queryAccess.getIndexVars(); + taco_iassert(util::all(indexVars, + [&](const auto& var) { return provGraph.isUnderived(var); })); + Expr size = 1; + for (const auto& indexVar : indexVars) { + size = ir::Mul::make(size, getDimension(indexVar)); + } + + const bool zeroInit = isNonFullyInitialized(getTensorVar(queryResult)) || + util::contains(getResultAccesses(assemble.getQueries()).second, + queryAccess); + if (zeroInit) { + Expr sizeOfElt = Sizeof::make(queryResult.getType().getDataType()); + Expr callocValues = ir::Call::make("calloc", {size, sizeOfElt}, + queryResult.getType().getDataType()); + Stmt allocResult = VarDecl::make(values, callocValues); + allocStmts.push_back(allocResult); + } else { + Stmt declResult = VarDecl::make(values, 0); + allocStmts.push_back(declResult); + + Stmt allocResult = Allocate::make(values, size); + allocStmts.push_back(allocResult); + } + + Stmt freeResult = Free::make(values); + freeStmts.push_back(freeResult); + } + Stmt allocResults = Block::make(allocStmts); + freeQueryResults = Block::make(freeStmts); + + queries = lower(assemble.getQueries()); + queries = Block::blanks(allocResults, queries); + } + + vector resultAccesses; + set reducedAccesses; + std::tie(resultAccesses, reducedAccesses) = + getResultAccesses(assemble.getCompute()); + const auto& queryResults = assemble.getAttrQueryResults(); + + std::vector initAssembleStmts; + for (const auto& resultAccess : resultAccesses) { + Expr prevSize = 1; + std::vector coords; + const auto resultIterators = getIterators(resultAccess); + const auto resultTensor = resultAccess.getTensorVar(); + const auto resultTensorVar = getTensorVar(resultTensor); + const auto resultModeOrdering = resultTensor.getFormat().getModeOrdering(); + for (const auto& resultIterator : resultIterators) { + if (generateAssembleCode()) { + const size_t resultLevel = resultIterator.getMode().getLevel() - 1; + const auto queryResultVars = queryResults.at(resultTensor)[resultLevel]; + std::vector queryResults; + for (const auto& queryResultVar : queryResultVars) { + queryResults.emplace_back(getTensorVar(queryResultVar), + getValuesArray(queryResultVar)); + } + + if (resultIterator.hasSeqInsertEdge()) { + Stmt initEdges = resultIterator.getSeqInitEdges(prevSize, + queryResults); + initAssembleStmts.push_back(initEdges); + + Stmt insertEdgeLoop = resultIterator.getSeqInsertEdge( + resultIterator.getParent().getPosVar(), coords, queryResults); + auto locateCoords = coords; + for (auto iter = resultIterator.getParent(); !iter.isRoot(); + iter = iter.getParent()) { + if (iter.hasLocate()) { + Expr dim = GetProperty::make(resultTensorVar, + TensorProperty::Dimension, + resultModeOrdering[iter.getMode().getLevel() - 1]); + Expr pos = iter.getPosVar(); + Stmt initPos = VarDecl::make(pos, iter.locate(locateCoords)[0]); + insertEdgeLoop = For::make(coords.back(), 0, dim, 1, + Block::make(initPos, insertEdgeLoop)); + } else { + taco_not_supported_yet; + } + locateCoords.pop_back(); + } + initAssembleStmts.push_back(insertEdgeLoop); + } + + Stmt initCoords = resultIterator.getInitCoords(prevSize, queryResults); + initAssembleStmts.push_back(initCoords); + } + + Stmt initYieldPos = resultIterator.getInitYieldPos(prevSize); + initAssembleStmts.push_back(initYieldPos); + + prevSize = resultIterator.getAssembledSize(prevSize); + coords.push_back(getCoordinateVar(resultIterator)); + } + + Expr valuesArr = getValuesArray(resultTensor); + const bool zeroInit = isNonFullyInitialized(resultTensorVar) || + util::contains(reducedAccesses, resultAccess); + if (generateAssembleCode()) { + if (zeroInit && generateComputeCode()) { + const auto type = resultTensor.getType().getDataType(); + Expr sizeOfElt = Sizeof::make(type); + Expr callocValues = ir::Call::make("calloc", {prevSize, sizeOfElt}, + type); + Stmt allocResult = Assign::make(valuesArr, callocValues); + initAssembleStmts.push_back(allocResult); + } else { + Stmt initValues = Allocate::make(valuesArr, prevSize); + initAssembleStmts.push_back(initValues); + } + } else if (zeroInit) { + const auto type = resultTensor.getType().getDataType(); + initAssembleStmts.push_back(initValues(resultTensorVar, ir::Literal::zero(type), 0, prevSize)); + } + } + Stmt initAssemble = Block::make(initAssembleStmts); + + if (assemble.getQueries().defined()) { + // If assembly requires precomputing statistics about result, then + // allocation of memory might depend on these statistics being precise + // (e.g., compressed modes cannot be allocated with uninitialized padding). + // Since attribute queries are computed without accidental zeros being + // filtered out, assume that accidental nonzeros must also be explicitly + // inserted during assembly. + guardedTemps = util::toSet(getTemporaries(assemble.getCompute())); + } + Stmt compute = lower(assemble.getCompute()); + + std::vector finalizeAssembleStmts; + for (const auto& resultAccess : resultAccesses) { + Expr prevSize = 1; + const auto resultIterators = getIterators(resultAccess); + for (const auto& resultIterator : resultIterators) { + Stmt finalizeYieldPos = resultIterator.getFinalizeYieldPos(prevSize); + finalizeAssembleStmts.push_back(finalizeYieldPos); + + prevSize = resultIterator.getAssembledSize(prevSize); + } + } + Stmt finalizeAssemble = Block::make(finalizeAssembleStmts); + + return Block::blanks(queries, + initAssemble, + compute, + finalizeAssemble, + freeQueryResults); + } + + + Stmt LowererImplImperative::lowerMulti(Multi multi) { + Stmt stmt1 = lower(multi.getStmt1()); + Stmt stmt2 = lower(multi.getStmt2()); + return Block::make(stmt1, stmt2); + } + + Stmt LowererImplImperative::lowerSuchThat(SuchThat suchThat) { + Stmt stmt = lower(suchThat.getStmt()); + return Block::make(stmt); + } + + + Expr LowererImplImperative::lowerAccess(Access access) { + if (access.isAccessingStructure()) { + return true; + } + + TensorVar var = access.getTensorVar(); + + if (isScalar(var.getType())) { + return getTensorVar(var); + } + + if (!getIterators(access).back().isUnique()) { + return getReducedValueVar(access); + } + + if (var.getType().getDataType() == Bool && + getIterators(access).back().isZeroless()) { + return true; + } + + const auto vals = getValuesArray(var); + if (!vals.defined()) { + return true; + } + + return Load::make(vals, generateValueLocExpr(access)); + } + + Expr LowererImplImperative::lowerIndexVar(IndexVar var) { + taco_iassert(util::contains(indexVarToExprMap, var)); + taco_iassert(provGraph.isRecoverable(var, definedIndexVars)); + return indexVarToExprMap.at(var); + } + + Expr LowererImplImperative::lowerLiteral(Literal literal) { + switch (literal.getDataType().getKind()) { + case Datatype::Bool: + return ir::Literal::make(literal.getVal()); + case Datatype::UInt8: + return ir::Literal::make((unsigned long long)literal.getVal()); + case Datatype::UInt16: + return ir::Literal::make((unsigned long long)literal.getVal()); + case Datatype::UInt32: + return ir::Literal::make((unsigned long long)literal.getVal()); + case Datatype::UInt64: + return ir::Literal::make((unsigned long long)literal.getVal()); + case Datatype::UInt128: + taco_not_supported_yet; + break; + case Datatype::Int8: + return ir::Literal::make((int)literal.getVal()); + case Datatype::Int16: + return ir::Literal::make((int)literal.getVal()); + case Datatype::Int32: + return ir::Literal::make((int)literal.getVal()); + case Datatype::Int64: + return ir::Literal::make((long long)literal.getVal()); + case Datatype::Int128: + taco_not_supported_yet; + break; + case Datatype::Float32: + return ir::Literal::make(literal.getVal()); + case Datatype::Float64: + return ir::Literal::make(literal.getVal()); + case Datatype::Complex64: + return ir::Literal::make(literal.getVal>()); + case Datatype::Complex128: + return ir::Literal::make(literal.getVal>()); + case Datatype::Undefined: + taco_unreachable; + break; + } + return ir::Expr(); + } -Stmt LowererImplImperative::lowerSuchThat(SuchThat suchThat) { - Stmt stmt = lower(suchThat.getStmt()); - return Block::make(stmt); -} + Expr LowererImplImperative::lowerNeg(Neg neg) { + return ir::Neg::make(lower(neg.getA())); + } -Expr LowererImplImperative::lowerAccess(Access access) { - if (access.isAccessingStructure()) { - return true; - } - TensorVar var = access.getTensorVar(); + Expr LowererImplImperative::lowerAdd(Add add) { + Expr a = lower(add.getA()); + Expr b = lower(add.getB()); + return (add.getDataType().getKind() == Datatype::Bool) + ? ir::Or::make(a, b) : ir::Add::make(a, b); + } - if (isScalar(var.getType())) { - return getTensorVar(var); - } - if (!getIterators(access).back().isUnique()) { - return getReducedValueVar(access); - } + Expr LowererImplImperative::lowerSub(Sub sub) { + return ir::Sub::make(lower(sub.getA()), lower(sub.getB())); + } - if (var.getType().getDataType() == Bool && - getIterators(access).back().isZeroless()) { - return true; - } - const auto vals = getValuesArray(var); - if (!vals.defined()) { - return true; - } + Expr LowererImplImperative::lowerMul(Mul mul) { + Expr a = lower(mul.getA()); + Expr b = lower(mul.getB()); + return (mul.getDataType().getKind() == Datatype::Bool) + ? ir::And::make(a, b) : ir::Mul::make(a, b); + } - return Load::make(vals, generateValueLocExpr(access)); -} -Expr LowererImplImperative::lowerIndexVar(IndexVar var) { - taco_iassert(util::contains(indexVarToExprMap, var)); - taco_iassert(provGraph.isRecoverable(var, definedIndexVars)); - return indexVarToExprMap.at(var); -} + Expr LowererImplImperative::lowerDiv(Div div) { + return ir::Div::make(lower(div.getA()), lower(div.getB())); + } -Expr LowererImplImperative::lowerLiteral(Literal literal) { - switch (literal.getDataType().getKind()) { - case Datatype::Bool: - return ir::Literal::make(literal.getVal()); - case Datatype::UInt8: - return ir::Literal::make((unsigned long long)literal.getVal()); - case Datatype::UInt16: - return ir::Literal::make((unsigned long long)literal.getVal()); - case Datatype::UInt32: - return ir::Literal::make((unsigned long long)literal.getVal()); - case Datatype::UInt64: - return ir::Literal::make((unsigned long long)literal.getVal()); - case Datatype::UInt128: - taco_not_supported_yet; - break; - case Datatype::Int8: - return ir::Literal::make((int)literal.getVal()); - case Datatype::Int16: - return ir::Literal::make((int)literal.getVal()); - case Datatype::Int32: - return ir::Literal::make((int)literal.getVal()); - case Datatype::Int64: - return ir::Literal::make((long long)literal.getVal()); - case Datatype::Int128: - taco_not_supported_yet; - break; - case Datatype::Float32: - return ir::Literal::make(literal.getVal()); - case Datatype::Float64: - return ir::Literal::make(literal.getVal()); - case Datatype::Complex64: - return ir::Literal::make(literal.getVal>()); - case Datatype::Complex128: - return ir::Literal::make(literal.getVal>()); - case Datatype::Undefined: - taco_unreachable; - break; - } - return ir::Expr(); -} + Expr LowererImplImperative::lowerSqrt(Sqrt sqrt) { + return ir::Sqrt::make(lower(sqrt.getA())); + } -Expr LowererImplImperative::lowerNeg(Neg neg) { - return ir::Neg::make(lower(neg.getA())); -} + Expr LowererImplImperative::lowerCast(Cast cast) { + return ir::Cast::make(lower(cast.getA()), cast.getDataType()); + } -Expr LowererImplImperative::lowerAdd(Add add) { - Expr a = lower(add.getA()); - Expr b = lower(add.getB()); - return (add.getDataType().getKind() == Datatype::Bool) - ? ir::Or::make(a, b) : ir::Add::make(a, b); -} + Expr LowererImplImperative::lowerCallIntrinsic(CallIntrinsic call) { + std::vector args; + for (auto& arg : call.getArgs()) { + args.push_back(lower(arg)); + } + return call.getFunc().lower(args); + } -Expr LowererImplImperative::lowerSub(Sub sub) { - return ir::Sub::make(lower(sub.getA()), lower(sub.getB())); -} + Expr LowererImplImperative::lowerTensorOp(Call op) { + auto definedArgs = op.getDefinedArgs(); + std::vector args; + if(util::contains(op.getDefs(), definedArgs)) { + auto lowerFunc = op.getDefs().at(definedArgs); + for (auto& argIdx : definedArgs) { + args.push_back(lower(op.getArgs()[argIdx])); + } + return lowerFunc(args); + } -Expr LowererImplImperative::lowerMul(Mul mul) { - Expr a = lower(mul.getA()); - Expr b = lower(mul.getB()); - return (mul.getDataType().getKind() == Datatype::Bool) - ? ir::And::make(a, b) : ir::Mul::make(a, b); -} + for(const auto& arg : op.getArgs()) { + args.push_back(lower(arg)); + } + return op.getFunc()(args); + } -Expr LowererImplImperative::lowerDiv(Div div) { - return ir::Div::make(lower(div.getA()), lower(div.getB())); -} + Stmt LowererImplImperative::lower(IndexStmt stmt) { + return visitor->lower(stmt); + } -Expr LowererImplImperative::lowerSqrt(Sqrt sqrt) { - return ir::Sqrt::make(lower(sqrt.getA())); -} + Expr LowererImplImperative::lower(IndexExpr expr) { + return visitor->lower(expr); + } -Expr LowererImplImperative::lowerCast(Cast cast) { - return ir::Cast::make(lower(cast.getA()), cast.getDataType()); -} + bool LowererImplImperative::generateAssembleCode() const { + return this->assemble; + } -Expr LowererImplImperative::lowerCallIntrinsic(CallIntrinsic call) { - std::vector args; - for (auto& arg : call.getArgs()) { - args.push_back(lower(arg)); - } - return call.getFunc().lower(args); -} + bool LowererImplImperative::generateComputeCode() const { + return this->compute; + } -Expr LowererImplImperative::lowerTensorOp(Call op) { - auto definedArgs = op.getDefinedArgs(); - std::vector args; + Stmt LowererImplImperative::emitEarlyExit(Expr reductionExpr, std::vector& properties) { + if (loopOrderAllowsShortCircuit && findProperty(properties).defined()) { + Literal annh = findProperty(properties).annihilator(); + Expr isAnnihilator = ir::Eq::make(reductionExpr, lower(annh)); + return IfThenElse::make(isAnnihilator, Block::make(Break::make())); + } + return Stmt(); + } - if(util::contains(op.getDefs(), definedArgs)) { - auto lowerFunc = op.getDefs().at(definedArgs); - for (auto& argIdx : definedArgs) { - args.push_back(lower(op.getArgs()[argIdx])); + Expr LowererImplImperative::getTensorVar(TensorVar tensorVar) const { + taco_iassert(util::contains(this->tensorVars, tensorVar)) << tensorVar; + return this->tensorVars.at(tensorVar); } - return lowerFunc(args); - } - for(const auto& arg : op.getArgs()) { - args.push_back(lower(arg)); - } - return op.getFunc()(args); -} + Expr LowererImplImperative::getCapacityVar(Expr tensor) const { + taco_iassert(util::contains(this->capacityVars, tensor)) << tensor; + return this->capacityVars.at(tensor); + } -Stmt LowererImplImperative::lower(IndexStmt stmt) { - return visitor->lower(stmt); -} + ir::Expr LowererImplImperative::getValuesArray(TensorVar var) const + { + return (util::contains(temporaryArrays, var)) + ? temporaryArrays.at(var).values + : GetProperty::make(getTensorVar(var), TensorProperty::Values); + } -Expr LowererImplImperative::lower(IndexExpr expr) { - return visitor->lower(expr); -} + Expr LowererImplImperative::getDimension(IndexVar indexVar) const { + taco_iassert(util::contains(this->dimensions, indexVar)) << indexVar; + return this->dimensions.at(indexVar); + } -bool LowererImplImperative::generateAssembleCode() const { - return this->assemble; -} + std::vector LowererImplImperative::getIterators(Access access) const { + vector result; + TensorVar tensor = access.getTensorVar(); + for (int i = 0; i < tensor.getOrder(); i++) { + int mode = tensor.getFormat().getModeOrdering()[i]; + result.push_back(iterators.levelIterator(ModeAccess(access, mode+1))); + } + return result; + } -bool LowererImplImperative::generateComputeCode() const { - return this->compute; -} -Stmt LowererImplImperative::emitEarlyExit(Expr reductionExpr, std::vector& properties) { - if (loopOrderAllowsShortCircuit && findProperty(properties).defined()) { - Literal annh = findProperty(properties).annihilator(); - Expr isAnnihilator = ir::Eq::make(reductionExpr, lower(annh)); - return IfThenElse::make(isAnnihilator, Block::make(Break::make())); - } - return Stmt(); -} + set LowererImplImperative::getExhaustedAccesses(MergePoint point, + MergeLattice lattice) const + { + set exhaustedAccesses; + for (auto& iterator : lattice.exhausted(point)) { + exhaustedAccesses.insert(iterators.modeAccess(iterator).getAccess()); + } + return exhaustedAccesses; + } -Expr LowererImplImperative::getTensorVar(TensorVar tensorVar) const { - taco_iassert(util::contains(this->tensorVars, tensorVar)) << tensorVar; - return this->tensorVars.at(tensorVar); -} + Expr LowererImplImperative::getReducedValueVar(Access access) const { + return this->reducedValueVars.at(access); + } -Expr LowererImplImperative::getCapacityVar(Expr tensor) const { - taco_iassert(util::contains(this->capacityVars, tensor)) << tensor; - return this->capacityVars.at(tensor); -} + Expr LowererImplImperative::getCoordinateVar(IndexVar indexVar) const { + return this->iterators.modeIterator(indexVar).getCoordVar(); + } -ir::Expr LowererImplImperative::getValuesArray(TensorVar var) const -{ - return (util::contains(temporaryArrays, var)) - ? temporaryArrays.at(var).values - : GetProperty::make(getTensorVar(var), TensorProperty::Values); -} + Expr LowererImplImperative::getCoordinateVar(Iterator iterator) const { + if (iterator.isDimensionIterator()) { + return iterator.getCoordVar(); + } + return this->getCoordinateVar(iterator.getIndexVar()); + } -Expr LowererImplImperative::getDimension(IndexVar indexVar) const { - taco_iassert(util::contains(this->dimensions, indexVar)) << indexVar; - return this->dimensions.at(indexVar); -} + vector LowererImplImperative::coordinates(Iterator iterator) const { + taco_iassert(iterator.defined()); -std::vector LowererImplImperative::getIterators(Access access) const { - vector result; - TensorVar tensor = access.getTensorVar(); - for (int i = 0; i < tensor.getOrder(); i++) { - int mode = tensor.getFormat().getModeOrdering()[i]; - result.push_back(iterators.levelIterator(ModeAccess(access, mode+1))); - } - return result; -} + vector coords; + do { + coords.push_back(getCoordinateVar(iterator)); + iterator = iterator.getParent(); + } while (!iterator.isRoot()); + auto reverse = util::reverse(coords); + return vector(reverse.begin(), reverse.end()); + } + vector LowererImplImperative::coordinates(vector iterators) + { + taco_iassert(all(iterators, [](Iterator iter){ return iter.defined(); })); + vector result; + for (auto& iterator : iterators) { + result.push_back(iterator.getCoordVar()); + } + return result; + } -set LowererImplImperative::getExhaustedAccesses(MergePoint point, - MergeLattice lattice) const -{ - set exhaustedAccesses; - for (auto& iterator : lattice.exhausted(point)) { - exhaustedAccesses.insert(iterators.modeAccess(iterator).getAccess()); - } - return exhaustedAccesses; -} + Stmt LowererImplImperative::initResultArrays(vector writes, + set reducedAccesses) { + std::vector result; + for (auto& write : writes) { + if (write.getTensorVar().getOrder() == 0 || + isAssembledByUngroupedInsertion(write.getTensorVar())) { + continue; + } -Expr LowererImplImperative::getReducedValueVar(Access access) const { - return this->reducedValueVars.at(access); -} + std::vector initArrays; + + const auto iterators = getIterators(write); + taco_iassert(!iterators.empty()); + + Expr tensor = getTensorVar(write.getTensorVar()); + Expr fill = GetProperty::make(tensor, TensorProperty::FillValue); + Expr valuesArr = GetProperty::make(tensor, TensorProperty::Values); + bool clearValuesAllocation = false; + + Expr parentSize = 1; + if (generateAssembleCode()) { + for (const auto& iterator : iterators) { + Expr size; + Stmt init; + // Initialize data structures for storing levels + if (iterator.hasAppend()) { + size = 0; + init = iterator.getAppendInitLevel(parentSize, size); + } else if (iterator.hasInsert()) { + size = simplify(ir::Mul::make(parentSize, iterator.getWidth())); + init = iterator.getInsertInitLevel(parentSize, size); + } else { + taco_ierror << "Write iterator supports neither append nor insert"; + } + initArrays.push_back(init); + + // Declare position variable of append modes that are not above a + // branchless mode (if mode below is branchless, then can share same + // position variable) + if (iterator.hasAppend() && (iterator.isLeaf() || + !iterator.getChild().isBranchless())) { + initArrays.push_back(VarDecl::make(iterator.getPosVar(), 0)); + } + + parentSize = size; + // Writes into a windowed iterator require the allocation to be cleared. + clearValuesAllocation |= (iterator.isWindowed() || iterator.hasIndexSet()); + } + // Pre-allocate memory for the value array if computing while assembling + if (generateComputeCode()) { + taco_iassert(!iterators.empty()); -Expr LowererImplImperative::getCoordinateVar(IndexVar indexVar) const { - return this->iterators.modeIterator(indexVar).getCoordVar(); -} + Expr capacityVar = getCapacityVar(tensor); + Expr allocSize = isValue(parentSize, 0) + ? DEFAULT_ALLOC_SIZE : parentSize; + initArrays.push_back(VarDecl::make(capacityVar, allocSize)); + initArrays.push_back(Allocate::make(valuesArr, capacityVar, false /* is_realloc */, Expr() /* old_elements */, + clearValuesAllocation)); + } + taco_iassert(!initArrays.empty()); + result.push_back(Block::make(initArrays)); + } + else if (generateComputeCode()) { + Iterator lastAppendIterator; + // Compute size of values array + for (auto& iterator : iterators) { + if (iterator.hasAppend()) { + lastAppendIterator = iterator; + parentSize = iterator.getSize(parentSize); + } else if (iterator.hasInsert()) { + parentSize = ir::Mul::make(parentSize, iterator.getWidth()); + } else { + taco_ierror << "Write iterator supports neither append nor insert"; + } + parentSize = simplify(parentSize); + } -Expr LowererImplImperative::getCoordinateVar(Iterator iterator) const { - if (iterator.isDimensionIterator()) { - return iterator.getCoordVar(); - } - return this->getCoordinateVar(iterator.getIndexVar()); -} + // Declare position variable for the last append level + if (lastAppendIterator.defined()) { + result.push_back(VarDecl::make(lastAppendIterator.getPosVar(), 0)); + } + } + if (generateComputeCode() && iterators.back().hasInsert() && + !isValue(parentSize, 0) && (isNonFullyInitialized(tensor) || + util::contains(reducedAccesses, write))) { + // Zero-initialize values array if size statically known and might not + // assign to every element in values array during compute + // TODO: Right now for scheduled code we check if any iterator is not full and then emit + // a zero-initialization loop. We only actually need a zero-initialization loop if the combined + // iteration of all the iterators is not full. We can check this by seeing if we can recover a + // full iterator from our set of iterators. + Expr size = generateAssembleCode() ? getCapacityVar(tensor) : parentSize; + result.push_back(initValues(tensor, fill, 0, size)); + } + } + return result.empty() ? Stmt() : Block::blanks(result); + } -vector LowererImplImperative::coordinates(Iterator iterator) const { - taco_iassert(iterator.defined()); - vector coords; - do { - coords.push_back(getCoordinateVar(iterator)); - iterator = iterator.getParent(); - } while (!iterator.isRoot()); - auto reverse = util::reverse(coords); - return vector(reverse.begin(), reverse.end()); -} + ir::Stmt LowererImplImperative::finalizeResultArrays(std::vector writes) { + if (!generateAssembleCode()) { + return Stmt(); + } -vector LowererImplImperative::coordinates(vector iterators) -{ - taco_iassert(all(iterators, [](Iterator iter){ return iter.defined(); })); - vector result; - for (auto& iterator : iterators) { - result.push_back(iterator.getCoordVar()); - } - return result; -} + bool clearValuesAllocation = false; + std::vector result; + for (auto& write : writes) { + if (write.getTensorVar().getOrder() == 0 || + isAssembledByUngroupedInsertion(write.getTensorVar())) { + continue; + } + const auto iterators = getIterators(write); + taco_iassert(!iterators.empty()); + + Expr parentSize = 1; + for (const auto& iterator : iterators) { + Expr size; + Stmt finalize; + // Post-process data structures for storing levels + if (iterator.hasAppend()) { + size = iterator.getPosVar(); + finalize = iterator.getAppendFinalizeLevel(parentSize, size); + } else if (iterator.hasInsert()) { + size = simplify(ir::Mul::make(parentSize, iterator.getWidth())); + finalize = iterator.getInsertFinalizeLevel(parentSize, size); + } else { + taco_ierror << "Write iterator supports neither append nor insert"; + } + result.push_back(finalize); + parentSize = size; + // Writes into a windowed iterator require the allocation to be cleared. + clearValuesAllocation |= (iterator.isWindowed() || iterator.hasIndexSet()); + } -Stmt LowererImplImperative::initResultArrays(vector writes, - set reducedAccesses) { - std::vector result; - for (auto& write : writes) { - if (write.getTensorVar().getOrder() == 0 || - isAssembledByUngroupedInsertion(write.getTensorVar())) { - continue; - } - - std::vector initArrays; - - const auto iterators = getIterators(write); - taco_iassert(!iterators.empty()); - - Expr tensor = getTensorVar(write.getTensorVar()); - Expr fill = GetProperty::make(tensor, TensorProperty::FillValue); - Expr valuesArr = GetProperty::make(tensor, TensorProperty::Values); - bool clearValuesAllocation = false; - - Expr parentSize = 1; - if (generateAssembleCode()) { - for (const auto& iterator : iterators) { - Expr size; - Stmt init; - // Initialize data structures for storing levels - if (iterator.hasAppend()) { - size = 0; - init = iterator.getAppendInitLevel(parentSize, size); - } else if (iterator.hasInsert()) { - size = simplify(ir::Mul::make(parentSize, iterator.getWidth())); - init = iterator.getInsertInitLevel(parentSize, size); - } else { - taco_ierror << "Write iterator supports neither append nor insert"; + if (!generateComputeCode()) { + // Allocate memory for values array after assembly if not also computing + Expr tensor = getTensorVar(write.getTensorVar()); + Expr valuesArr = GetProperty::make(tensor, TensorProperty::Values); + result.push_back(Allocate::make(valuesArr, parentSize, false /* is_realloc */, Expr() /* old_elements */, + clearValuesAllocation)); + } } - initArrays.push_back(init); - - // Declare position variable of append modes that are not above a - // branchless mode (if mode below is branchless, then can share same - // position variable) - if (iterator.hasAppend() && (iterator.isLeaf() || - !iterator.getChild().isBranchless())) { - initArrays.push_back(VarDecl::make(iterator.getPosVar(), 0)); + return result.empty() ? Stmt() : Block::blanks(result); + } + + Stmt LowererImplImperative::defineScalarVariable(TensorVar var, bool zero) { + Datatype type = var.getType().getDataType(); + Expr varValueIR = Var::make(var.getName() + "_val", type, false, false); + Expr init = (zero) ? ir::Literal::zero(type) + : Load::make(GetProperty::make(tensorVars.at(var), + TensorProperty::Values)); + tensorVars.find(var)->second = varValueIR; + return VarDecl::make(varValueIR, init); + } + + static + vector getIteratorsFrom(IndexVar var, + const vector& iterators) { + vector result; + bool found = false; + for (Iterator iterator : iterators) { + if (var == iterator.getIndexVar()) found = true; + if (found) { + result.push_back(iterator); + } } - - parentSize = size; - // Writes into a windowed iterator require the allocation to be cleared. - clearValuesAllocation |= (iterator.isWindowed() || iterator.hasIndexSet()); - } - - // Pre-allocate memory for the value array if computing while assembling - if (generateComputeCode()) { - taco_iassert(!iterators.empty()); - - Expr capacityVar = getCapacityVar(tensor); - Expr allocSize = isValue(parentSize, 0) - ? DEFAULT_ALLOC_SIZE : parentSize; - initArrays.push_back(VarDecl::make(capacityVar, allocSize)); - initArrays.push_back(Allocate::make(valuesArr, capacityVar, false /* is_realloc */, Expr() /* old_elements */, - clearValuesAllocation)); - } - - taco_iassert(!initArrays.empty()); - result.push_back(Block::make(initArrays)); - } - else if (generateComputeCode()) { - Iterator lastAppendIterator; - // Compute size of values array - for (auto& iterator : iterators) { - if (iterator.hasAppend()) { - lastAppendIterator = iterator; - parentSize = iterator.getSize(parentSize); - } else if (iterator.hasInsert()) { - parentSize = ir::Mul::make(parentSize, iterator.getWidth()); - } else { - taco_ierror << "Write iterator supports neither append nor insert"; - } - parentSize = simplify(parentSize); - } - - // Declare position variable for the last append level - if (lastAppendIterator.defined()) { - result.push_back(VarDecl::make(lastAppendIterator.getPosVar(), 0)); - } - } - - if (generateComputeCode() && iterators.back().hasInsert() && - !isValue(parentSize, 0) && (isNonFullyInitialized(tensor) || - util::contains(reducedAccesses, write))) { - // Zero-initialize values array if size statically known and might not - // assign to every element in values array during compute - // TODO: Right now for scheduled code we check if any iterator is not full and then emit - // a zero-initialization loop. We only actually need a zero-initialization loop if the combined - // iteration of all the iterators is not full. We can check this by seeing if we can recover a - // full iterator from our set of iterators. - Expr size = generateAssembleCode() ? getCapacityVar(tensor) : parentSize; - result.push_back(initValues(tensor, fill, 0, size)); - } - } - return result.empty() ? Stmt() : Block::blanks(result); -} + return result; + } -ir::Stmt LowererImplImperative::finalizeResultArrays(std::vector writes) { - if (!generateAssembleCode()) { - return Stmt(); - } - - bool clearValuesAllocation = false; - std::vector result; - for (auto& write : writes) { - if (write.getTensorVar().getOrder() == 0 || - isAssembledByUngroupedInsertion(write.getTensorVar())) { - continue; - } - - const auto iterators = getIterators(write); - taco_iassert(!iterators.empty()); - - Expr parentSize = 1; - for (const auto& iterator : iterators) { - Expr size; - Stmt finalize; - // Post-process data structures for storing levels - if (iterator.hasAppend()) { - size = iterator.getPosVar(); - finalize = iterator.getAppendFinalizeLevel(parentSize, size); - } else if (iterator.hasInsert()) { - size = simplify(ir::Mul::make(parentSize, iterator.getWidth())); - finalize = iterator.getInsertFinalizeLevel(parentSize, size); - } else { - taco_ierror << "Write iterator supports neither append nor insert"; - } - result.push_back(finalize); - parentSize = size; - // Writes into a windowed iterator require the allocation to be cleared. - clearValuesAllocation |= (iterator.isWindowed() || iterator.hasIndexSet()); - } - - if (!generateComputeCode()) { - // Allocate memory for values array after assembly if not also computing - Expr tensor = getTensorVar(write.getTensorVar()); - Expr valuesArr = GetProperty::make(tensor, TensorProperty::Values); - result.push_back(Allocate::make(valuesArr, parentSize, false /* is_realloc */, Expr() /* old_elements */, - clearValuesAllocation)); - } - } - return result.empty() ? Stmt() : Block::blanks(result); -} + Stmt LowererImplImperative::initResultArrays(IndexVar var, vector writes, + set reducedAccesses) { + if (!generateAssembleCode()) { + return Stmt(); + } -Stmt LowererImplImperative::defineScalarVariable(TensorVar var, bool zero) { - Datatype type = var.getType().getDataType(); - Expr varValueIR = Var::make(var.getName() + "_val", type, false, false); - Expr init = (zero) ? ir::Literal::zero(type) - : Load::make(GetProperty::make(tensorVars.at(var), - TensorProperty::Values)); - tensorVars.find(var)->second = varValueIR; - return VarDecl::make(varValueIR, init); -} + vector result; + for (auto& write : writes) { + Expr tensor = getTensorVar(write.getTensorVar()); + Expr fill = GetProperty::make(tensor, TensorProperty::FillValue); + Expr values = GetProperty::make(tensor, TensorProperty::Values); -static -vector getIteratorsFrom(IndexVar var, - const vector& iterators) { - vector result; - bool found = false; - for (Iterator iterator : iterators) { - if (var == iterator.getIndexVar()) found = true; - if (found) { - result.push_back(iterator); - } - } - return result; -} + vector iterators = getIteratorsFrom(var, getIterators(write)); + if (iterators.empty()) { + continue; + } -Stmt LowererImplImperative::initResultArrays(IndexVar var, vector writes, - set reducedAccesses) { - if (!generateAssembleCode()) { - return Stmt(); - } + Iterator resultIterator = iterators.front(); - vector result; - for (auto& write : writes) { - Expr tensor = getTensorVar(write.getTensorVar()); - Expr fill = GetProperty::make(tensor, TensorProperty::FillValue); - Expr values = GetProperty::make(tensor, TensorProperty::Values); + // Initialize begin var + if (resultIterator.hasAppend() && !resultIterator.isBranchless()) { + Expr begin = resultIterator.getBeginVar(); + Iterator posIter = resultIterator; + while (!posIter.isLeaf() && posIter.getChild().isBranchless()) { + posIter = posIter.getChild(); + } + result.push_back(VarDecl::make(begin, posIter.getPosVar())); + } - vector iterators = getIteratorsFrom(var, getIterators(write)); + const bool isTopLevel = (iterators.size() == write.getIndexVars().size()); + if (resultIterator.getParent().hasAppend() || isTopLevel) { + Expr resultParentPos = resultIterator.getParent().getPosVar(); + Expr resultParentPosNext = simplify(ir::Add::make(resultParentPos, 1)); + Expr initBegin = resultParentPos; + Expr initEnd = resultParentPosNext; + Expr stride = 1; + + Iterator initIterator; + for (Iterator iterator : iterators) { + if (!iterator.hasInsert()) { + initIterator = iterator; + break; + } + + stride = simplify(ir::Mul::make(stride, iterator.getWidth())); + initBegin = simplify(ir::Mul::make(resultParentPos, stride)); + initEnd = simplify(ir::Mul::make(resultParentPosNext, stride)); + + // Initialize data structures for storing insert mode + result.push_back(iterator.getInsertInitCoords(initBegin, initEnd)); + } - if (iterators.empty()) { - continue; + if (initIterator.defined()) { + // Initialize data structures for storing edges of next append mode + taco_iassert(initIterator.hasAppend()); + result.push_back(initIterator.getAppendInitEdges(initBegin, initEnd)); + } else if (generateComputeCode() && !isTopLevel) { + if (isa(stride)) { + Expr strideVar = Var::make(util::toString(tensor) + "_stride", Int()); + result.push_back(VarDecl::make(strideVar, stride)); + stride = strideVar; + } + + // Resize values array if not large enough + Expr capacityVar = getCapacityVar(tensor); + Expr size = simplify(ir::Mul::make(resultParentPosNext, stride)); + result.push_back(atLeastDoubleSizeIfFull(values, capacityVar, size)); + + if (isNonFullyInitialized(tensor) || + util::contains(reducedAccesses, write)) { + // Zero-initialize values array if might not assign to every element + // in values array during compute + result.push_back(initValues(tensor, fill, resultParentPos, stride)); + } + } + } + } + return result.empty() ? Stmt() : Block::make(result); } - Iterator resultIterator = iterators.front(); - // Initialize begin var - if (resultIterator.hasAppend() && !resultIterator.isBranchless()) { - Expr begin = resultIterator.getBeginVar(); - Iterator posIter = resultIterator; - while (!posIter.isLeaf() && posIter.getChild().isBranchless()) { - posIter = posIter.getChild(); - } - result.push_back(VarDecl::make(begin, posIter.getPosVar())); - } + Stmt LowererImplImperative::resizeAndInitValues(const std::vector& appenders, + const std::set& reducedAccesses) { + if (!generateComputeCode()) { + return Stmt(); + } - const bool isTopLevel = (iterators.size() == write.getIndexVars().size()); - if (resultIterator.getParent().hasAppend() || isTopLevel) { - Expr resultParentPos = resultIterator.getParent().getPosVar(); - Expr resultParentPosNext = simplify(ir::Add::make(resultParentPos, 1)); - Expr initBegin = resultParentPos; - Expr initEnd = resultParentPosNext; - Expr stride = 1; + std::function getTensor = [&](Access access) { + return getTensorVar(access.getTensorVar()); + }; + const auto reducedTensors = util::map(reducedAccesses, getTensor); - Iterator initIterator; - for (Iterator iterator : iterators) { - if (!iterator.hasInsert()) { - initIterator = iterator; - break; - } + std::vector result; - stride = simplify(ir::Mul::make(stride, iterator.getWidth())); - initBegin = simplify(ir::Mul::make(resultParentPos, stride)); - initEnd = simplify(ir::Mul::make(resultParentPosNext, stride)); + for (auto& appender : appenders) { + if (!appender.isLeaf()) { + continue; + } - // Initialize data structures for storing insert mode - result.push_back(iterator.getInsertInitCoords(initBegin, initEnd)); - } + Expr tensor = appender.getTensor(); + Expr values = GetProperty::make(tensor, TensorProperty::Values); + Expr capacity = getCapacityVar(appender.getTensor()); + Expr pos = appender.getIteratorVar(); - if (initIterator.defined()) { - // Initialize data structures for storing edges of next append mode - taco_iassert(initIterator.hasAppend()); - result.push_back(initIterator.getAppendInitEdges(initBegin, initEnd)); - } else if (generateComputeCode() && !isTopLevel) { - if (isa(stride)) { - Expr strideVar = Var::make(util::toString(tensor) + "_stride", Int()); - result.push_back(VarDecl::make(strideVar, stride)); - stride = strideVar; - } + if (generateAssembleCode()) { + result.push_back(doubleSizeIfFull(values, capacity, pos)); + } - // Resize values array if not large enough - Expr capacityVar = getCapacityVar(tensor); - Expr size = simplify(ir::Mul::make(resultParentPosNext, stride)); - result.push_back(atLeastDoubleSizeIfFull(values, capacityVar, size)); + if (util::contains(reducedTensors, tensor)) { + Expr zero = ir::Literal::zero(tensor.type()); + result.push_back(Store::make(values, pos, zero)); + } + } - if (isNonFullyInitialized(tensor) || - util::contains(reducedAccesses, write)) { - // Zero-initialize values array if might not assign to every element - // in values array during compute - result.push_back(initValues(tensor, fill, resultParentPos, stride)); + return result.empty() ? Stmt() : Block::make(result); + } + +//Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { return Stmt(); } + + Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { + Expr lower = simplify(ir::Mul::make(begin, size)); + Expr upper = simplify(ir::Mul::make(ir::Add::make(begin, 1), size)); + Expr p = Var::make("p" + util::toString(tensor), Int()); + Expr values = GetProperty::make(tensor, TensorProperty::Values); + Stmt zeroInit = Store::make(values, p, initVal); + LoopKind parallel = (isa(size) && + to(size)->getIntValue() < (1 << 10)) + ? LoopKind::Serial : LoopKind::Static_Chunked; + if (should_use_CUDA_codegen() && util::contains(parallelUnitSizes, ParallelUnit::GPUBlock)) { + return ir::VarDecl::make(ir::Var::make("status", Int()), + ir::Call::make("cudaMemset", {values, ir::Literal::make(0, Int()), + ir::Mul::make(ir::Sub::make(upper, lower), + ir::Literal::make(values.type().getNumBytes()))}, Int())); } - } + return For::make(p, lower, upper, 1, zeroInit, parallel); } - } - return result.empty() ? Stmt() : Block::make(result); -} + Stmt LowererImplImperative::declLocatePosVars(vector locators) { + vector result; + for (Iterator& locator : locators) { + accessibleIterators.insert(locator); -Stmt LowererImplImperative::resizeAndInitValues(const std::vector& appenders, - const std::set& reducedAccesses) { - if (!generateComputeCode()) { - return Stmt(); - } + bool doLocate = true; + for (Iterator ancestorIterator = locator.getParent(); + !ancestorIterator.isRoot() && ancestorIterator.hasLocate(); + ancestorIterator = ancestorIterator.getParent()) { + if (!accessibleIterators.contains(ancestorIterator)) { + doLocate = false; + } + } + + if (doLocate) { + Iterator locateIterator = locator; + if (locateIterator.hasPosIter()) { + taco_iassert(!provGraph.isUnderived(locateIterator.getIndexVar())); + continue; // these will be recovered with separate procedure + } + do { + auto coords = coordinates(locateIterator); + // If this dimension iterator operates over a window, then it needs + // to be projected up to the window's iteration space. + if (locateIterator.isWindowed()) { + auto expr = coords[coords.size() - 1]; + coords[coords.size() - 1] = this->projectCanonicalSpaceToWindowedPosition(locateIterator, expr); + } else if (locateIterator.hasIndexSet()) { + // If this dimension iterator operates over an index set, follow the + // indirection by using the locator access the index set's crd array. + // The resulting value is where we should locate into the actual tensor. + auto expr = coords[coords.size() - 1]; + auto indexSetIterator = locateIterator.getIndexSetIterator(); + auto coordArray = indexSetIterator.posAccess(expr, coordinates(indexSetIterator)).getResults()[0]; + coords[coords.size() - 1] = coordArray; + } + ModeFunction locate = locateIterator.locate(coords); + taco_iassert(isValue(locate.getResults()[1], true)); + Stmt declarePosVar = VarDecl::make(locateIterator.getPosVar(), + locate.getResults()[0]); + result.push_back(declarePosVar); + + if (locateIterator.isLeaf()) { + break; + } + locateIterator = locateIterator.getChild(); + } while (locateIterator.hasLocate() && + accessibleIterators.contains(locateIterator)); + } + } + return result.empty() ? Stmt() : Block::make(result); + } + + + Stmt LowererImplImperative::reduceDuplicateCoordinates(Expr coordinate, + vector iterators, + bool alwaysReduce) { + vector result; + for (Iterator& iterator : iterators) { + taco_iassert(!iterator.isUnique() && iterator.hasPosIter()); + + Access access = this->iterators.modeAccess(iterator).getAccess(); + Expr iterVar = iterator.getIteratorVar(); + Expr segendVar = iterator.getSegendVar(); + Expr reducedVal = iterator.isLeaf() ? getReducedValueVar(access) : Expr(); + Expr tensorVar = getTensorVar(access.getTensorVar()); + Expr tensorVals = GetProperty::make(tensorVar, TensorProperty::Values); + + // Initialize variable storing reduced component value. + if (reducedVal.defined()) { + Expr reducedValInit = alwaysReduce + ? Load::make(tensorVals, iterVar) + : ir::Literal::zero(reducedVal.type()); + result.push_back(VarDecl::make(reducedVal, reducedValInit)); + } - std::function getTensor = [&](Access access) { - return getTensorVar(access.getTensorVar()); - }; - const auto reducedTensors = util::map(reducedAccesses, getTensor); + if (iterator.isLeaf()) { + // If iterator is over bottommost coordinate hierarchy level and will + // always advance (i.e., not merging with another iterator), then we don't + // need a separate segend variable. + segendVar = iterVar; + if (alwaysReduce) { + result.push_back(compoundAssign(segendVar, 1)); + } + } else { + Expr segendInit = alwaysReduce ? ir::Add::make(iterVar, 1) : iterVar; + result.push_back(VarDecl::make(segendVar, segendInit)); + } - std::vector result; + vector dedupStmts; + if (reducedVal.defined()) { + Expr partialVal = Load::make(tensorVals, segendVar); + dedupStmts.push_back(compoundAssign(reducedVal, partialVal)); + } + dedupStmts.push_back(compoundAssign(segendVar, 1)); + Stmt dedupBody = Block::make(dedupStmts); + + ModeFunction posAccess = iterator.posAccess(segendVar, + coordinates(iterator)); + // TODO: Support access functions that perform additional computations + // and/or might access invalid positions. + taco_iassert(!posAccess.compute().defined()); + taco_iassert(to(posAccess.getResults()[1])->getBoolValue()); + Expr nextCoord = posAccess.getResults()[0]; + Expr withinBounds = Lt::make(segendVar, iterator.getEndVar()); + Expr isDuplicate = Eq::make(posAccess.getResults()[0], coordinate); + result.push_back(While::make(And::make(withinBounds, isDuplicate), + Block::make(dedupStmts))); + } + return result.empty() ? Stmt() : Block::make(result); + } + + Stmt LowererImplImperative::codeToInitializeIteratorVar(Iterator iterator, vector iterators, vector rangers, vector mergers, Expr coordinate, IndexVar coordinateVar) { + vector result; + taco_iassert(iterator.hasPosIter() || iterator.hasCoordIter() || + iterator.isDimensionIterator()); + + Expr iterVar = iterator.getIteratorVar(); + Expr endVar = iterator.getEndVar(); + if (iterator.hasPosIter()) { + Expr parentPos = iterator.getParent().getPosVar(); + if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { + // E.g. a compressed mode without duplicates + ModeFunction bounds = iterator.posBounds(parentPos); + result.push_back(bounds.compute()); + // if has a coordinate ranger then need to binary search + if (any(rangers, + [](Iterator it){ return it.isDimensionIterator(); })) { + + Expr binarySearchTarget = provGraph.deriveCoordBounds(definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators)[coordinateVar][0]; + if (binarySearchTarget != underivedBounds[coordinateVar][0]) { + // If we have a window, then we need to project up the binary search target + // into the window rather than the beginning of the level. + if (iterator.isWindowed()) { + binarySearchTarget = this->projectCanonicalSpaceToWindowedPosition(iterator, binarySearchTarget); + } + result.push_back(VarDecl::make(iterator.getBeginVar(), binarySearchTarget)); + + vector binarySearchArgs = { + iterator.getMode().getModePack().getArray(1), // array + bounds[0], // arrayStart + bounds[1], // arrayEnd + iterator.getBeginVar() // target + }; + result.push_back( + VarDecl::make(iterVar, ir::Call::make("taco_binarySearchAfter", binarySearchArgs, iterVar.type()))); + } + else { + result.push_back(VarDecl::make(iterVar, bounds[0])); + } + } + else { + auto bound = bounds[0]; + // If we have a window on this iterator, then search for the start of + // the window rather than starting at the beginning of the level. + if (iterator.isWindowed()) { + bound = this->searchForStartOfWindowPosition(iterator, bounds[0], bounds[1]); + } + result.push_back(VarDecl::make(iterVar, bound)); + } - for (auto& appender : appenders) { - if (!appender.isLeaf()) { - continue; + result.push_back(VarDecl::make(endVar, bounds[1])); + } else { + taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); + taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); + + // E.g. a compressed mode with duplicates. Apply iterator chaining + Expr parentSegend = iterator.getParent().getSegendVar(); + ModeFunction startBounds = iterator.posBounds(parentPos); + ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); + result.push_back(startBounds.compute()); + result.push_back(VarDecl::make(iterVar, startBounds[0])); + result.push_back(endBounds.compute()); + result.push_back(VarDecl::make(endVar, endBounds[1])); + } + } + else if (iterator.hasCoordIter()) { + // E.g. a hasmap mode + vector coords = coordinates(iterator); + coords.erase(coords.begin()); + ModeFunction bounds = iterator.coordBounds(coords); + result.push_back(bounds.compute()); + result.push_back(VarDecl::make(iterVar, bounds[0])); + result.push_back(VarDecl::make(endVar, bounds[1])); + } + else if (iterator.isDimensionIterator()) { + // A dimension + // If a merger then initialize to 0 + // If not then get first coord value like doing normal merge + + // If derived then need to recoverchild from this coord value + bool isMerger = find(mergers.begin(), mergers.end(), iterator) != mergers.end(); + if (isMerger) { + Expr coord = coordinates(vector({iterator}))[0]; + result.push_back(VarDecl::make(coord, 0)); + } + else { + result.push_back(codeToLoadCoordinatesFromPosIterators(iterators, true)); + + Stmt stmt = resolveCoordinate(mergers, coordinate, true); + taco_iassert(stmt != Stmt()); + result.push_back(stmt); + result.push_back(codeToRecoverDerivedIndexVar(coordinateVar, iterator.getIndexVar(), true)); + + // emit bound for ranger too + vector startBounds; + vector endBounds; + for (Iterator merger : mergers) { + ModeFunction coordBounds = merger.coordBounds(merger.getParent().getPosVar()); + startBounds.push_back(coordBounds[0]); + endBounds.push_back(coordBounds[1]); + } + //TODO: maybe needed after split reorder? underivedBounds[coordinateVar] = {ir::Max::make(startBounds), ir::Min::make(endBounds)}; + Stmt end_decl = VarDecl::make(iterator.getEndVar(), provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators)[1]); + result.push_back(end_decl); + } + } + return result.empty() ? Stmt() : Block::make(result); } - Expr tensor = appender.getTensor(); - Expr values = GetProperty::make(tensor, TensorProperty::Values); - Expr capacity = getCapacityVar(appender.getTensor()); - Expr pos = appender.getIteratorVar(); + Stmt LowererImplImperative::codeToInitializeIteratorVars(vector iterators, vector rangers, vector mergers, Expr coordinate, IndexVar coordinateVar) { + vector results; + // initialize mergers first (can't depend on initializing rangers) + for (Iterator iterator : mergers) { + results.push_back(codeToInitializeIteratorVar(iterator, iterators, rangers, mergers, coordinate, coordinateVar)); + } - if (generateAssembleCode()) { - result.push_back(doubleSizeIfFull(values, capacity, pos)); + for (Iterator iterator : rangers) { + if (find(mergers.begin(), mergers.end(), iterator) == mergers.end()) { + results.push_back(codeToInitializeIteratorVar(iterator, iterators, rangers, mergers, coordinate, coordinateVar)); + } + } + return results.empty() ? Stmt() : Block::make(results); } - if (util::contains(reducedTensors, tensor)) { - Expr zero = ir::Literal::zero(tensor.type()); - result.push_back(Store::make(values, pos, zero)); + Stmt LowererImplImperative::codeToRecoverDerivedIndexVar(IndexVar underived, IndexVar indexVar, bool emitVarDecl) { + if(underived != indexVar) { + // iterator indexVar must be derived from coordinateVar + std::vector underivedAncestors = provGraph.getUnderivedAncestors(indexVar); + taco_iassert(find(underivedAncestors.begin(), underivedAncestors.end(), underived) != underivedAncestors.end()); + + vector recoverySteps; + for (const IndexVar& varToRecover : provGraph.derivationPath(underived, indexVar)) { + if(varToRecover == underived) continue; + recoverySteps.push_back(provGraph.recoverChild(varToRecover, indexVarToExprMap, emitVarDecl, iterators)); + } + return Block::make(recoverySteps); + } + return Stmt(); } - } - return result.empty() ? Stmt() : Block::make(result); -} + Stmt LowererImplImperative::codeToIncIteratorVars(Expr coordinate, IndexVar coordinateVar, vector iterators, vector mergers) { + if (iterators.size() == 1) { + Expr ivar = iterators[0].getIteratorVar(); -Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { return Stmt(); } -/* -Stmt LowererImplImperative::initValues(Expr tensor, Expr initVal, Expr begin, Expr size) { - Expr lower = simplify(ir::Mul::make(begin, size)); - Expr upper = simplify(ir::Mul::make(ir::Add::make(begin, 1), size)); - Expr p = Var::make("p" + util::toString(tensor), Int()); - Expr values = GetProperty::make(tensor, TensorProperty::Values); - Stmt zeroInit = Store::make(values, p, initVal); - LoopKind parallel = (isa(size) && - to(size)->getIntValue() < (1 << 10)) - ? LoopKind::Serial : LoopKind::Static_Chunked; - if (should_use_CUDA_codegen() && util::contains(parallelUnitSizes, ParallelUnit::GPUBlock)) { - return ir::VarDecl::make(ir::Var::make("status", Int()), - ir::Call::make("cudaMemset", {values, ir::Literal::make(0, Int()), - ir::Mul::make(ir::Sub::make(upper, lower), - ir::Literal::make(values.type().getNumBytes()))}, Int())); - } - return For::make(p, lower, upper, 1, zeroInit, parallel); -} -*/ -Stmt LowererImplImperative::declLocatePosVars(vector locators) { - vector result; - for (Iterator& locator : locators) { - accessibleIterators.insert(locator); - - bool doLocate = true; - for (Iterator ancestorIterator = locator.getParent(); - !ancestorIterator.isRoot() && ancestorIterator.hasLocate(); - ancestorIterator = ancestorIterator.getParent()) { - if (!accessibleIterators.contains(ancestorIterator)) { - doLocate = false; - } - } - - if (doLocate) { - Iterator locateIterator = locator; - if (locateIterator.hasPosIter()) { - taco_iassert(!provGraph.isUnderived(locateIterator.getIndexVar())); - continue; // these will be recovered with separate procedure - } - do { - auto coords = coordinates(locateIterator); - // If this dimension iterator operates over a window, then it needs - // to be projected up to the window's iteration space. - if (locateIterator.isWindowed()) { - auto expr = coords[coords.size() - 1]; - coords[coords.size() - 1] = this->projectCanonicalSpaceToWindowedPosition(locateIterator, expr); - } else if (locateIterator.hasIndexSet()) { - // If this dimension iterator operates over an index set, follow the - // indirection by using the locator access the index set's crd array. - // The resulting value is where we should locate into the actual tensor. - auto expr = coords[coords.size() - 1]; - auto indexSetIterator = locateIterator.getIndexSetIterator(); - auto coordArray = indexSetIterator.posAccess(expr, coordinates(indexSetIterator)).getResults()[0]; - coords[coords.size() - 1] = coordArray; - } - ModeFunction locate = locateIterator.locate(coords); - taco_iassert(isValue(locate.getResults()[1], true)); - Stmt declarePosVar = VarDecl::make(locateIterator.getPosVar(), - locate.getResults()[0]); - result.push_back(declarePosVar); - - if (locateIterator.isLeaf()) { - break; - } - locateIterator = locateIterator.getChild(); - } while (locateIterator.hasLocate() && - accessibleIterators.contains(locateIterator)); - } - } - return result.empty() ? Stmt() : Block::make(result); -} + if (iterators[0].isUnique()) { + return compoundAssign(ivar, 1); + } + // If iterator is over bottommost coordinate hierarchy level with + // duplicates and iterator will always advance (i.e., not merging with + // another iterator), then deduplication loop will take care of + // incrementing iterator variable. + return iterators[0].isLeaf() + ? Stmt() + : Assign::make(ivar, iterators[0].getSegendVar()); + } -Stmt LowererImplImperative::reduceDuplicateCoordinates(Expr coordinate, - vector iterators, - bool alwaysReduce) { - vector result; - for (Iterator& iterator : iterators) { - taco_iassert(!iterator.isUnique() && iterator.hasPosIter()); - - Access access = this->iterators.modeAccess(iterator).getAccess(); - Expr iterVar = iterator.getIteratorVar(); - Expr segendVar = iterator.getSegendVar(); - Expr reducedVal = iterator.isLeaf() ? getReducedValueVar(access) : Expr(); - Expr tensorVar = getTensorVar(access.getTensorVar()); - Expr tensorVals = GetProperty::make(tensorVar, TensorProperty::Values); - - // Initialize variable storing reduced component value. - if (reducedVal.defined()) { - Expr reducedValInit = alwaysReduce - ? Load::make(tensorVals, iterVar) - : ir::Literal::zero(reducedVal.type()); - result.push_back(VarDecl::make(reducedVal, reducedValInit)); - } - - if (iterator.isLeaf()) { - // If iterator is over bottommost coordinate hierarchy level and will - // always advance (i.e., not merging with another iterator), then we don't - // need a separate segend variable. - segendVar = iterVar; - if (alwaysReduce) { - result.push_back(compoundAssign(segendVar, 1)); - } - } else { - Expr segendInit = alwaysReduce ? ir::Add::make(iterVar, 1) : iterVar; - result.push_back(VarDecl::make(segendVar, segendInit)); - } - - vector dedupStmts; - if (reducedVal.defined()) { - Expr partialVal = Load::make(tensorVals, segendVar); - dedupStmts.push_back(compoundAssign(reducedVal, partialVal)); - } - dedupStmts.push_back(compoundAssign(segendVar, 1)); - Stmt dedupBody = Block::make(dedupStmts); - - ModeFunction posAccess = iterator.posAccess(segendVar, - coordinates(iterator)); - // TODO: Support access functions that perform additional computations - // and/or might access invalid positions. - taco_iassert(!posAccess.compute().defined()); - taco_iassert(to(posAccess.getResults()[1])->getBoolValue()); - Expr nextCoord = posAccess.getResults()[0]; - Expr withinBounds = Lt::make(segendVar, iterator.getEndVar()); - Expr isDuplicate = Eq::make(posAccess.getResults()[0], coordinate); - result.push_back(While::make(And::make(withinBounds, isDuplicate), - Block::make(dedupStmts))); - } - return result.empty() ? Stmt() : Block::make(result); -} + vector result; + + // We emit the level iterators before the mode iterator because the coordinate + // of the mode iterator is used to conditionally advance the level iterators. + + auto levelIterators = + filter(iterators, [](Iterator it){return !it.isDimensionIterator();}); + for (auto& iterator : levelIterators) { + Expr ivar = iterator.getIteratorVar(); + if (iterator.isUnique()) { + Expr increment = iterator.isFull() + ? 1 + : ir::Cast::make(Eq::make(iterator.getCoordVar(), + coordinate), + ivar.type()); + result.push_back(compoundAssign(ivar, increment)); + } else if (!iterator.isLeaf()) { + result.push_back(Assign::make(ivar, iterator.getSegendVar())); + } + } -Stmt LowererImplImperative::codeToInitializeIteratorVar(Iterator iterator, vector iterators, vector rangers, vector mergers, Expr coordinate, IndexVar coordinateVar) { - vector result; - taco_iassert(iterator.hasPosIter() || iterator.hasCoordIter() || - iterator.isDimensionIterator()); - - Expr iterVar = iterator.getIteratorVar(); - Expr endVar = iterator.getEndVar(); - if (iterator.hasPosIter()) { - Expr parentPos = iterator.getParent().getPosVar(); - if (iterator.getParent().isRoot() || iterator.getParent().isUnique()) { - // E.g. a compressed mode without duplicates - ModeFunction bounds = iterator.posBounds(parentPos); - result.push_back(bounds.compute()); - // if has a coordinate ranger then need to binary search - if (any(rangers, - [](Iterator it){ return it.isDimensionIterator(); })) { - - Expr binarySearchTarget = provGraph.deriveCoordBounds(definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators)[coordinateVar][0]; - if (binarySearchTarget != underivedBounds[coordinateVar][0]) { - // If we have a window, then we need to project up the binary search target - // into the window rather than the beginning of the level. - if (iterator.isWindowed()) { - binarySearchTarget = this->projectCanonicalSpaceToWindowedPosition(iterator, binarySearchTarget); - } - result.push_back(VarDecl::make(iterator.getBeginVar(), binarySearchTarget)); - - vector binarySearchArgs = { - iterator.getMode().getModePack().getArray(1), // array - bounds[0], // arrayStart - bounds[1], // arrayEnd - iterator.getBeginVar() // target - }; - result.push_back( - VarDecl::make(iterVar, ir::Call::make("taco_binarySearchAfter", binarySearchArgs, iterVar.type()))); + auto modeIterators = + filter(iterators, [](Iterator it){return it.isDimensionIterator();}); + for (auto& iterator : modeIterators) { + bool isMerger = find(mergers.begin(), mergers.end(), iterator) != mergers.end(); + if (isMerger) { + Expr ivar = iterator.getIteratorVar(); + result.push_back(compoundAssign(ivar, 1)); + } + else { + result.push_back(codeToLoadCoordinatesFromPosIterators(iterators, false)); + Stmt stmt = resolveCoordinate(mergers, coordinate, false); + taco_iassert(stmt != Stmt()); + result.push_back(stmt); + result.push_back(codeToRecoverDerivedIndexVar(coordinateVar, iterator.getIndexVar(), false)); + } } - else { - result.push_back(VarDecl::make(iterVar, bounds[0])); - } - } - else { - auto bound = bounds[0]; - // If we have a window on this iterator, then search for the start of - // the window rather than starting at the beginning of the level. - if (iterator.isWindowed()) { - bound = this->searchForStartOfWindowPosition(iterator, bounds[0], bounds[1]); - } - result.push_back(VarDecl::make(iterVar, bound)); - } - - result.push_back(VarDecl::make(endVar, bounds[1])); - } else { - taco_iassert(iterator.isOrdered() && iterator.getParent().isOrdered()); - taco_iassert(iterator.isCompact() && iterator.getParent().isCompact()); - - // E.g. a compressed mode with duplicates. Apply iterator chaining - Expr parentSegend = iterator.getParent().getSegendVar(); - ModeFunction startBounds = iterator.posBounds(parentPos); - ModeFunction endBounds = iterator.posBounds(ir::Sub::make(parentSegend, 1)); - result.push_back(startBounds.compute()); - result.push_back(VarDecl::make(iterVar, startBounds[0])); - result.push_back(endBounds.compute()); - result.push_back(VarDecl::make(endVar, endBounds[1])); - } - } - else if (iterator.hasCoordIter()) { - // E.g. a hasmap mode - vector coords = coordinates(iterator); - coords.erase(coords.begin()); - ModeFunction bounds = iterator.coordBounds(coords); - result.push_back(bounds.compute()); - result.push_back(VarDecl::make(iterVar, bounds[0])); - result.push_back(VarDecl::make(endVar, bounds[1])); - } - else if (iterator.isDimensionIterator()) { - // A dimension - // If a merger then initialize to 0 - // If not then get first coord value like doing normal merge - - // If derived then need to recoverchild from this coord value - bool isMerger = find(mergers.begin(), mergers.end(), iterator) != mergers.end(); - if (isMerger) { - Expr coord = coordinates(vector({iterator}))[0]; - result.push_back(VarDecl::make(coord, 0)); - } - else { - result.push_back(codeToLoadCoordinatesFromPosIterators(iterators, true)); - - Stmt stmt = resolveCoordinate(mergers, coordinate, true); - taco_iassert(stmt != Stmt()); - result.push_back(stmt); - result.push_back(codeToRecoverDerivedIndexVar(coordinateVar, iterator.getIndexVar(), true)); - - // emit bound for ranger too - vector startBounds; - vector endBounds; - for (Iterator merger : mergers) { - ModeFunction coordBounds = merger.coordBounds(merger.getParent().getPosVar()); - startBounds.push_back(coordBounds[0]); - endBounds.push_back(coordBounds[1]); - } - //TODO: maybe needed after split reorder? underivedBounds[coordinateVar] = {ir::Max::make(startBounds), ir::Min::make(endBounds)}; - Stmt end_decl = VarDecl::make(iterator.getEndVar(), provGraph.deriveIterBounds(iterator.getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators)[1]); - result.push_back(end_decl); - } - } - return result.empty() ? Stmt() : Block::make(result); -} -Stmt LowererImplImperative::codeToInitializeIteratorVars(vector iterators, vector rangers, vector mergers, Expr coordinate, IndexVar coordinateVar) { - vector results; - // initialize mergers first (can't depend on initializing rangers) - for (Iterator iterator : mergers) { - results.push_back(codeToInitializeIteratorVar(iterator, iterators, rangers, mergers, coordinate, coordinateVar)); - } - - for (Iterator iterator : rangers) { - if (find(mergers.begin(), mergers.end(), iterator) == mergers.end()) { - results.push_back(codeToInitializeIteratorVar(iterator, iterators, rangers, mergers, coordinate, coordinateVar)); - } - } - return results.empty() ? Stmt() : Block::make(results); -} + return Block::make(result); + } + + Stmt LowererImplImperative::codeToLoadCoordinatesFromPosIterators(vector iterators, bool declVars) { + // Load coordinates from position iterators + Stmt loadPosIterCoordinates; + if (iterators.size() > 1) { + vector loadPosIterCoordinateStmts; + auto posIters = filter(iterators, [](Iterator it){return it.hasPosIter();}); + for (auto& posIter : posIters) { + taco_tassert(posIter.hasPosIter()); + ModeFunction posAccess = posIter.posAccess(posIter.getPosVar(), + coordinates(posIter)); + loadPosIterCoordinateStmts.push_back(posAccess.compute()); + auto access = posAccess[0]; + // If this iterator is windowed, then it needs to be projected down to + // recover the coordinate variable. + // TODO (rohany): Would be cleaner to have this logic be moved into the + // ModeFunction, rather than having to check in some places? + if (posIter.isWindowed()) { + + // If the iterator is strided, then we have to skip over coordinates + // that don't match the stride. To do that, we insert a guard on the + // access. We first extract the access into a temp to avoid emitting + // a duplicate load on the _crd array. + if (posIter.isStrided()) { + loadPosIterCoordinateStmts.push_back(VarDecl::make(posIter.getWindowVar(), access)); + access = posIter.getWindowVar(); + // Since we're locating into a compressed array (not iterating over it), + // we need to advance the outer loop if the current coordinate is not + // along the desired stride. So, we pass true to the incrementPosVar + // argument of strideBoundsGuard. + loadPosIterCoordinateStmts.push_back(this->strideBoundsGuard(posIter, access, true /* incrementPosVar */)); + } + + access = this->projectWindowedPositionToCanonicalSpace(posIter, access); + } + if (declVars) { + loadPosIterCoordinateStmts.push_back(VarDecl::make(posIter.getCoordVar(), access)); + } + else { + loadPosIterCoordinateStmts.push_back(Assign::make(posIter.getCoordVar(), access)); + } + if (posIter.isWindowed()) { + loadPosIterCoordinateStmts.push_back(this->upperBoundGuardForWindowPosition(posIter, posIter.getCoordVar())); + } + } + loadPosIterCoordinates = Block::make(loadPosIterCoordinateStmts); + } + return loadPosIterCoordinates; + } -Stmt LowererImplImperative::codeToRecoverDerivedIndexVar(IndexVar underived, IndexVar indexVar, bool emitVarDecl) { - if(underived != indexVar) { - // iterator indexVar must be derived from coordinateVar - std::vector underivedAncestors = provGraph.getUnderivedAncestors(indexVar); - taco_iassert(find(underivedAncestors.begin(), underivedAncestors.end(), underived) != underivedAncestors.end()); - vector recoverySteps; - for (const IndexVar& varToRecover : provGraph.derivationPath(underived, indexVar)) { - if(varToRecover == underived) continue; - recoverySteps.push_back(provGraph.recoverChild(varToRecover, indexVarToExprMap, emitVarDecl, iterators)); + static + bool isLastAppender(Iterator iter) { + taco_iassert(iter.hasAppend()); + while (!iter.isLeaf()) { + iter = iter.getChild(); + if (iter.hasAppend()) { + return false; + } + } + return true; } - return Block::make(recoverySteps); - } - return Stmt(); -} - -Stmt LowererImplImperative::codeToIncIteratorVars(Expr coordinate, IndexVar coordinateVar, vector iterators, vector mergers) { - if (iterators.size() == 1) { - Expr ivar = iterators[0].getIteratorVar(); - - if (iterators[0].isUnique()) { - return compoundAssign(ivar, 1); - } - - // If iterator is over bottommost coordinate hierarchy level with - // duplicates and iterator will always advance (i.e., not merging with - // another iterator), then deduplication loop will take care of - // incrementing iterator variable. - return iterators[0].isLeaf() - ? Stmt() - : Assign::make(ivar, iterators[0].getSegendVar()); - } - - vector result; - - // We emit the level iterators before the mode iterator because the coordinate - // of the mode iterator is used to conditionally advance the level iterators. - - auto levelIterators = - filter(iterators, [](Iterator it){return !it.isDimensionIterator();}); - for (auto& iterator : levelIterators) { - Expr ivar = iterator.getIteratorVar(); - if (iterator.isUnique()) { - Expr increment = iterator.isFull() - ? 1 - : ir::Cast::make(Eq::make(iterator.getCoordVar(), - coordinate), - ivar.type()); - result.push_back(compoundAssign(ivar, increment)); - } else if (!iterator.isLeaf()) { - result.push_back(Assign::make(ivar, iterator.getSegendVar())); - } - } - - auto modeIterators = - filter(iterators, [](Iterator it){return it.isDimensionIterator();}); - for (auto& iterator : modeIterators) { - bool isMerger = find(mergers.begin(), mergers.end(), iterator) != mergers.end(); - if (isMerger) { - Expr ivar = iterator.getIteratorVar(); - result.push_back(compoundAssign(ivar, 1)); - } - else { - result.push_back(codeToLoadCoordinatesFromPosIterators(iterators, false)); - Stmt stmt = resolveCoordinate(mergers, coordinate, false); - taco_iassert(stmt != Stmt()); - result.push_back(stmt); - result.push_back(codeToRecoverDerivedIndexVar(coordinateVar, iterator.getIndexVar(), false)); - } - } - - return Block::make(result); -} -Stmt LowererImplImperative::codeToLoadCoordinatesFromPosIterators(vector iterators, bool declVars) { - // Load coordinates from position iterators - Stmt loadPosIterCoordinates; - if (iterators.size() > 1) { - vector loadPosIterCoordinateStmts; - auto posIters = filter(iterators, [](Iterator it){return it.hasPosIter();}); - for (auto& posIter : posIters) { - taco_tassert(posIter.hasPosIter()); - ModeFunction posAccess = posIter.posAccess(posIter.getPosVar(), - coordinates(posIter)); - loadPosIterCoordinateStmts.push_back(posAccess.compute()); - auto access = posAccess[0]; - // If this iterator is windowed, then it needs to be projected down to - // recover the coordinate variable. - // TODO (rohany): Would be cleaner to have this logic be moved into the - // ModeFunction, rather than having to check in some places? - if (posIter.isWindowed()) { - - // If the iterator is strided, then we have to skip over coordinates - // that don't match the stride. To do that, we insert a guard on the - // access. We first extract the access into a temp to avoid emitting - // a duplicate load on the _crd array. - if (posIter.isStrided()) { - loadPosIterCoordinateStmts.push_back(VarDecl::make(posIter.getWindowVar(), access)); - access = posIter.getWindowVar(); - // Since we're locating into a compressed array (not iterating over it), - // we need to advance the outer loop if the current coordinate is not - // along the desired stride. So, we pass true to the incrementPosVar - // argument of strideBoundsGuard. - loadPosIterCoordinateStmts.push_back(this->strideBoundsGuard(posIter, access, true /* incrementPosVar */)); - } - - access = this->projectWindowedPositionToCanonicalSpace(posIter, access); - } - if (declVars) { - loadPosIterCoordinateStmts.push_back(VarDecl::make(posIter.getCoordVar(), access)); - } - else { - loadPosIterCoordinateStmts.push_back(Assign::make(posIter.getCoordVar(), access)); - } - if (posIter.isWindowed()) { - loadPosIterCoordinateStmts.push_back(this->upperBoundGuardForWindowPosition(posIter, posIter.getCoordVar())); - } - } - loadPosIterCoordinates = Block::make(loadPosIterCoordinateStmts); - } - return loadPosIterCoordinates; -} + Stmt LowererImplImperative::appendCoordinate(vector appenders, Expr coord) { + vector result; + for (auto& appender : appenders) { + Expr pos = appender.getPosVar(); + Iterator appenderChild = appender.getChild(); -static -bool isLastAppender(Iterator iter) { - taco_iassert(iter.hasAppend()); - while (!iter.isLeaf()) { - iter = iter.getChild(); - if (iter.hasAppend()) { - return false; - } - } - return true; -} + if (appenderChild.defined() && appenderChild.isBranchless()) { + // Already emitted assembly code for current level when handling + // branchless child level, so don't emit code again. + continue; + } + vector appendStmts; + + if (generateAssembleCode()) { + appendStmts.push_back(appender.getAppendCoord(pos, coord)); + while (!appender.isRoot() && appender.isBranchless()) { + // Need to append result coordinate to parent level as well if child + // level is branchless (so child coordinates will have unique parents). + appender = appender.getParent(); + if (!appender.isRoot()) { + taco_iassert(appender.hasAppend()) << "Parent level of branchless, " + << "append-capable level must also be append-capable"; + taco_iassert(!appender.isUnique()) << "Need to be able to insert " + << "duplicate coordinates to level, but level is declared unique"; + + Expr coord = getCoordinateVar(appender); + appendStmts.push_back(appender.getAppendCoord(pos, coord)); + } + } + } -Stmt LowererImplImperative::appendCoordinate(vector appenders, Expr coord) { - vector result; - for (auto& appender : appenders) { - Expr pos = appender.getPosVar(); - Iterator appenderChild = appender.getChild(); + if (generateAssembleCode() || isLastAppender(appender)) { + appendStmts.push_back(compoundAssign(pos, 1)); - if (appenderChild.defined() && appenderChild.isBranchless()) { - // Already emitted assembly code for current level when handling - // branchless child level, so don't emit code again. - continue; + Stmt appendCode = Block::make(appendStmts); + if (appenderChild.defined() && appenderChild.hasAppend()) { + // Emit guard to avoid appending empty slices to result. + // TODO: Users should be able to configure whether to append zeroes. + Expr shouldAppend = Lt::make(appenderChild.getBeginVar(), + appenderChild.getPosVar()); + appendCode = IfThenElse::make(shouldAppend, appendCode); + } + result.push_back(appendCode); + } + } + return result.empty() ? Stmt() : Block::make(result); } - vector appendStmts; - if (generateAssembleCode()) { - appendStmts.push_back(appender.getAppendCoord(pos, coord)); - while (!appender.isRoot() && appender.isBranchless()) { - // Need to append result coordinate to parent level as well if child - // level is branchless (so child coordinates will have unique parents). - appender = appender.getParent(); - if (!appender.isRoot()) { - taco_iassert(appender.hasAppend()) << "Parent level of branchless, " - << "append-capable level must also be append-capable"; - taco_iassert(!appender.isUnique()) << "Need to be able to insert " - << "duplicate coordinates to level, but level is declared unique"; + Stmt LowererImplImperative::generateAppendPositions(vector appenders) { + vector result; + if (generateAssembleCode()) { + for (Iterator appender : appenders) { + if (appender.isBranchless() || + isAssembledByUngroupedInsertion(appender.getTensor())) { + continue; + } - Expr coord = getCoordinateVar(appender); - appendStmts.push_back(appender.getAppendCoord(pos, coord)); + Expr pos = [](Iterator appender) { + // Get the position variable associated with the appender. If a mode + // is above a branchless mode, then the two modes can share the same + // position variable. + while (!appender.isLeaf() && appender.getChild().isBranchless()) { + appender = appender.getChild(); + } + return appender.getPosVar(); + }(appender); + Expr beginPos = appender.getBeginVar(); + Expr parentPos = appender.getParent().getPosVar(); + result.push_back(appender.getAppendEdges(parentPos, beginPos, pos)); + } } - } + return result.empty() ? Stmt() : Block::make(result); } - if (generateAssembleCode() || isLastAppender(appender)) { - appendStmts.push_back(compoundAssign(pos, 1)); - Stmt appendCode = Block::make(appendStmts); - if (appenderChild.defined() && appenderChild.hasAppend()) { - // Emit guard to avoid appending empty slices to result. - // TODO: Users should be able to configure whether to append zeroes. - Expr shouldAppend = Lt::make(appenderChild.getBeginVar(), - appenderChild.getPosVar()); - appendCode = IfThenElse::make(shouldAppend, appendCode); - } - result.push_back(appendCode); - } - } - return result.empty() ? Stmt() : Block::make(result); -} + Expr LowererImplImperative::generateValueLocExpr(Access access) const { + if (isScalar(access.getTensorVar().getType())) { + return ir::Literal::make(0); + } + Iterator it = getIterators(access).back(); + // to make indexing temporary arrays with index var work correctly + if (!provGraph.isUnderived(it.getIndexVar()) && !access.getIndexVars().empty() && + util::contains(indexVarToExprMap, access.getIndexVars().front()) && + !it.hasPosIter() && access.getIndexVars().front() == it.getIndexVar()) { + return indexVarToExprMap.at(access.getIndexVars().front()); + } -Stmt LowererImplImperative::generateAppendPositions(vector appenders) { - vector result; - if (generateAssembleCode()) { - for (Iterator appender : appenders) { - if (appender.isBranchless() || - isAssembledByUngroupedInsertion(appender.getTensor())) { - continue; - } - - Expr pos = [](Iterator appender) { - // Get the position variable associated with the appender. If a mode - // is above a branchless mode, then the two modes can share the same - // position variable. - while (!appender.isLeaf() && appender.getChild().isBranchless()) { - appender = appender.getChild(); - } - return appender.getPosVar(); - }(appender); - Expr beginPos = appender.getBeginVar(); - Expr parentPos = appender.getParent().getPosVar(); - result.push_back(appender.getAppendEdges(parentPos, beginPos, pos)); - } - } - return result.empty() ? Stmt() : Block::make(result); -} + return it.getPosVar(); + } -Expr LowererImplImperative::generateValueLocExpr(Access access) const { - if (isScalar(access.getTensorVar().getType())) { - return ir::Literal::make(0); - } - Iterator it = getIterators(access).back(); + Expr LowererImplImperative::checkThatNoneAreExhausted(std::vector iterators) + { + taco_iassert(!iterators.empty()); + if (iterators.size() == 1 && iterators[0].isFull()) { + std::vector bounds = provGraph.deriveIterBounds(iterators[0].getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators); + Expr guards = Lt::make(iterators[0].getIteratorVar(), bounds[1]); + if (bounds[0] != ir::Literal::make(0)) { + guards = And::make(guards, Gte::make(iterators[0].getIteratorVar(), bounds[0])); + } + return guards; + } - // to make indexing temporary arrays with index var work correctly - if (!provGraph.isUnderived(it.getIndexVar()) && !access.getIndexVars().empty() && - util::contains(indexVarToExprMap, access.getIndexVars().front()) && - !it.hasPosIter() && access.getIndexVars().front() == it.getIndexVar()) { - return indexVarToExprMap.at(access.getIndexVars().front()); - } + vector result; + for (const auto& iterator : iterators) { + taco_iassert(!iterator.isFull()) << iterator + << " - full iterators do not need to partake in merge loop bounds"; + Expr iterUnexhausted = Lt::make(iterator.getIteratorVar(), + iterator.getEndVar()); + result.push_back(iterUnexhausted); + } - return it.getPosVar(); -} + return (!result.empty()) + ? taco::ir::conjunction(result) + : Lt::make(iterators[0].getIteratorVar(), iterators[0].getEndVar()); + } -Expr LowererImplImperative::checkThatNoneAreExhausted(std::vector iterators) -{ - taco_iassert(!iterators.empty()); - if (iterators.size() == 1 && iterators[0].isFull()) { - std::vector bounds = provGraph.deriveIterBounds(iterators[0].getIndexVar(), definedIndexVarsOrdered, underivedBounds, indexVarToExprMap, this->iterators); - Expr guards = Lt::make(iterators[0].getIteratorVar(), bounds[1]); - if (bounds[0] != ir::Literal::make(0)) { - guards = And::make(guards, Gte::make(iterators[0].getIteratorVar(), bounds[0])); - } - return guards; - } - - vector result; - for (const auto& iterator : iterators) { - taco_iassert(!iterator.isFull()) << iterator - << " - full iterators do not need to partake in merge loop bounds"; - Expr iterUnexhausted = Lt::make(iterator.getIteratorVar(), - iterator.getEndVar()); - result.push_back(iterUnexhausted); - } - - return (!result.empty()) - ? taco::ir::conjunction(result) - : Lt::make(iterators[0].getIteratorVar(), iterators[0].getEndVar()); -} + Expr LowererImplImperative::generateAssembleGuard(IndexExpr expr) { + class GenerateGuard : public IndexExprVisitorStrict { + public: + GenerateGuard(const std::set& guardedTemps, + const std::map& tempToGuard) + : guardedTemps(guardedTemps), tempToGuard(tempToGuard) {} + Expr lower(IndexExpr expr) { + this->expr = Expr(); + IndexExprVisitorStrict::visit(expr); + return this->expr; + } -Expr LowererImplImperative::generateAssembleGuard(IndexExpr expr) { - class GenerateGuard : public IndexExprVisitorStrict { - public: - GenerateGuard(const std::set& guardedTemps, - const std::map& tempToGuard) - : guardedTemps(guardedTemps), tempToGuard(tempToGuard) {} + private: + Expr expr; + const std::set& guardedTemps; + const std::map& tempToGuard; - Expr lower(IndexExpr expr) { - this->expr = Expr(); - IndexExprVisitorStrict::visit(expr); - return this->expr; - } + using IndexExprVisitorStrict::visit; - private: - Expr expr; - const std::set& guardedTemps; - const std::map& tempToGuard; + void visit(const AccessNode* node) { + expr = (util::contains(guardedTemps, node->tensorVar) && + node->tensorVar.getOrder() == 0) + ? tempToGuard.at(node->tensorVar) : true; + } - using IndexExprVisitorStrict::visit; + void visit(const LiteralNode* node) { + expr = true; + } - void visit(const AccessNode* node) { - expr = (util::contains(guardedTemps, node->tensorVar) && - node->tensorVar.getOrder() == 0) - ? tempToGuard.at(node->tensorVar) : true; - } + void visit(const NegNode* node) { + expr = lower(node->a); + } - void visit(const LiteralNode* node) { - expr = true; - } + void visit(const AddNode* node) { + expr = Or::make(lower(node->a), lower(node->b)); + } - void visit(const NegNode* node) { - expr = lower(node->a); - } + void visit(const SubNode* node) { + expr = Or::make(lower(node->a), lower(node->b)); + } - void visit(const AddNode* node) { - expr = Or::make(lower(node->a), lower(node->b)); - } + void visit(const MulNode* node) { + expr = And::make(lower(node->a), lower(node->b)); + } - void visit(const SubNode* node) { - expr = Or::make(lower(node->a), lower(node->b)); - } + void visit(const DivNode* node) { + expr = And::make(lower(node->a), lower(node->b)); + } - void visit(const MulNode* node) { - expr = And::make(lower(node->a), lower(node->b)); - } + void visit(const SqrtNode* node) { + expr = lower(node->a); + } - void visit(const DivNode* node) { - expr = And::make(lower(node->a), lower(node->b)); - } + void visit(const CastNode* node) { + expr = lower(node->a); + } - void visit(const SqrtNode* node) { - expr = lower(node->a); - } + void visit(const CallIntrinsicNode* node) { + Expr ret = false; + for (const auto& arg : node->args) { + ret = Or::make(ret, lower(arg)); + } + expr = ret; + } - void visit(const CastNode* node) { - expr = lower(node->a); - } + void visit(const ReductionNode* node) { + taco_ierror + << "Reduction nodes not supported in concrete index notation"; + } - void visit(const CallIntrinsicNode* node) { - Expr ret = false; - for (const auto& arg : node->args) { - ret = Or::make(ret, lower(arg)); - } - expr = ret; - } + void visit(const CallNode* node) { + Expr ret = false; + for (const auto& arg : node->args) { + ret = Or::make(ret, lower(arg)); + } + expr = ret; + } - void visit(const ReductionNode* node) { - taco_ierror - << "Reduction nodes not supported in concrete index notation"; - } + void visit(const IndexVarNode* node) { + expr = true; + } + }; - void visit(const CallNode* node) { - Expr ret = false; - for (const auto& arg : node->args) { - ret = Or::make(ret, lower(arg)); - } - expr = ret; + return ir::simplify(GenerateGuard(guardedTemps, tempToBitGuard).lower(expr)); } - void visit(const IndexVarNode* node) { - expr = true; - } - }; - return ir::simplify(GenerateGuard(guardedTemps, tempToBitGuard).lower(expr)); -} + bool LowererImplImperative::isAssembledByUngroupedInsertion(TensorVar result) { + return util::contains(assembledByUngroupedInsert, result); + } -bool LowererImplImperative::isAssembledByUngroupedInsertion(TensorVar result) { - return util::contains(assembledByUngroupedInsert, result); -} + bool LowererImplImperative::isAssembledByUngroupedInsertion(Expr result) { + for (const auto& tensor : assembledByUngroupedInsert) { + if (getTensorVar(tensor) == result) { + return true; + } + } + return false; + } -bool LowererImplImperative::isAssembledByUngroupedInsertion(Expr result) { - for (const auto& tensor : assembledByUngroupedInsert) { - if (getTensorVar(tensor) == result) { - return true; + bool LowererImplImperative::isNonFullyInitialized(Expr result) { + return util::contains(nonFullyInitializedResults, result); } - } - return false; -} -bool LowererImplImperative::isNonFullyInitialized(Expr result) { - return util::contains(nonFullyInitializedResults, result); -} + bool LowererImplImperative::hasStores(Stmt stmt) { + if (!stmt.defined()) { + return false; + } + struct FindStores : IRVisitor { + bool hasStore; + const std::map& tensorVars; + const std::map& tempToBitGuard; -bool LowererImplImperative::hasStores(Stmt stmt) { - if (!stmt.defined()) { - return false; - } + using IRVisitor::visit; - struct FindStores : IRVisitor { - bool hasStore; - const std::map& tensorVars; - const std::map& tempToBitGuard; + FindStores(const std::map& tensorVars, + const std::map& tempToBitGuard) + : tensorVars(tensorVars), tempToBitGuard(tempToBitGuard) {} - using IRVisitor::visit; + void visit(const Store* stmt) { + hasStore = true; + } - FindStores(const std::map& tensorVars, - const std::map& tempToBitGuard) - : tensorVars(tensorVars), tempToBitGuard(tempToBitGuard) {} + void visit(const Assign* stmt) { + for (const auto& tensorVar : tensorVars) { + if (stmt->lhs == tensorVar.second) { + hasStore = true; + break; + } + } + if (hasStore) { + return; + } + for (const auto& bitGuard : tempToBitGuard) { + if (stmt->lhs == bitGuard.second) { + hasStore = true; + break; + } + } + } - void visit(const Store* stmt) { - hasStore = true; + bool hasStores(Stmt stmt) { + hasStore = false; + stmt.accept(this); + return hasStore; + } + }; + return FindStores(tensorVars, tempToBitGuard).hasStores(stmt); } - void visit(const Assign* stmt) { - for (const auto& tensorVar : tensorVars) { - if (stmt->lhs == tensorVar.second) { - hasStore = true; - break; - } - } - if (hasStore) { - return; - } - for (const auto& bitGuard : tempToBitGuard) { - if (stmt->lhs == bitGuard.second) { - hasStore = true; - break; - } - } - } - bool hasStores(Stmt stmt) { - hasStore = false; - stmt.accept(this); - return hasStore; + Expr LowererImplImperative::searchForStartOfWindowPosition(Iterator iterator, ir::Expr start, ir::Expr end) { + taco_iassert(iterator.isWindowed()); + vector args = { + // Search over the `crd` array of the level, + iterator.getMode().getModePack().getArray(1), + // between the start and end position, + start, end, + // for the beginning of the window. + iterator.getWindowLowerBound(), + }; + return ir::Call::make("taco_binarySearchAfter", args, Datatype::UInt64); } - }; - return FindStores(tensorVars, tempToBitGuard).hasStores(stmt); -} - - -Expr LowererImplImperative::searchForStartOfWindowPosition(Iterator iterator, ir::Expr start, ir::Expr end) { - taco_iassert(iterator.isWindowed()); - vector args = { - // Search over the `crd` array of the level, - iterator.getMode().getModePack().getArray(1), - // between the start and end position, - start, end, - // for the beginning of the window. - iterator.getWindowLowerBound(), - }; - return ir::Call::make("taco_binarySearchAfter", args, Datatype::UInt64); -} -Expr LowererImplImperative::searchForEndOfWindowPosition(Iterator iterator, ir::Expr start, ir::Expr end) { - taco_iassert(iterator.isWindowed()); - vector args = { - // Search over the `crd` array of the level, - iterator.getMode().getModePack().getArray(1), - // between the start and end position, - start, end, - // for the end of the window. - iterator.getWindowUpperBound(), - }; - return ir::Call::make("taco_binarySearchAfter", args, Datatype::UInt64); -} + Expr LowererImplImperative::searchForEndOfWindowPosition(Iterator iterator, ir::Expr start, ir::Expr end) { + taco_iassert(iterator.isWindowed()); + vector args = { + // Search over the `crd` array of the level, + iterator.getMode().getModePack().getArray(1), + // between the start and end position, + start, end, + // for the end of the window. + iterator.getWindowUpperBound(), + }; + return ir::Call::make("taco_binarySearchAfter", args, Datatype::UInt64); + } -Stmt LowererImplImperative::upperBoundGuardForWindowPosition(Iterator iterator, ir::Expr access) { - taco_iassert(iterator.isWindowed()); - return ir::IfThenElse::make( - ir::Gte::make(access, ir::Div::make(ir::Sub::make(iterator.getWindowUpperBound(), iterator.getWindowLowerBound()), iterator.getStride())), - ir::Break::make() - ); -} + Stmt LowererImplImperative::upperBoundGuardForWindowPosition(Iterator iterator, ir::Expr access) { + taco_iassert(iterator.isWindowed()); + return ir::IfThenElse::make( + ir::Gte::make(access, ir::Div::make(ir::Sub::make(iterator.getWindowUpperBound(), iterator.getWindowLowerBound()), iterator.getStride())), + ir::Break::make() + ); + } -Stmt LowererImplImperative::strideBoundsGuard(Iterator iterator, ir::Expr access, bool incrementPosVar) { - Stmt cont = ir::Continue::make(); - // If requested to increment the iterator's position variable, add the increment - // before the continue statement. - if (incrementPosVar) { - cont = ir::Block::make({ - ir::Assign::make(iterator.getPosVar(), - ir::Add::make(iterator.getPosVar(), ir::Literal::make(1))), - cont - }); - } - // The guard makes sure that the coordinate being accessed is along the stride. - return ir::IfThenElse::make( - ir::Neq::make(ir::Rem::make(ir::Sub::make(access, iterator.getWindowLowerBound()), iterator.getStride()), ir::Literal::make(0)), - cont - ); -} + Stmt LowererImplImperative::strideBoundsGuard(Iterator iterator, ir::Expr access, bool incrementPosVar) { + Stmt cont = ir::Continue::make(); + // If requested to increment the iterator's position variable, add the increment + // before the continue statement. + if (incrementPosVar) { + cont = ir::Block::make({ + ir::Assign::make(iterator.getPosVar(), + ir::Add::make(iterator.getPosVar(), ir::Literal::make(1))), + cont + }); + } + // The guard makes sure that the coordinate being accessed is along the stride. + return ir::IfThenElse::make( + ir::Neq::make(ir::Rem::make(ir::Sub::make(access, iterator.getWindowLowerBound()), iterator.getStride()), ir::Literal::make(0)), + cont + ); + } -Expr LowererImplImperative::projectWindowedPositionToCanonicalSpace(Iterator iterator, ir::Expr expr) { - return ir::Div::make(ir::Sub::make(expr, iterator.getWindowLowerBound()), iterator.getStride()); -} + Expr LowererImplImperative::projectWindowedPositionToCanonicalSpace(Iterator iterator, ir::Expr expr) { + return ir::Div::make(ir::Sub::make(expr, iterator.getWindowLowerBound()), iterator.getStride()); + } -Expr LowererImplImperative::projectCanonicalSpaceToWindowedPosition(Iterator iterator, ir::Expr expr) { - return ir::Add::make(ir::Mul::make(expr, iterator.getStride()), iterator.getWindowLowerBound()); -} + Expr LowererImplImperative::projectCanonicalSpaceToWindowedPosition(Iterator iterator, ir::Expr expr) { + return ir::Add::make(ir::Mul::make(expr, iterator.getStride()), iterator.getWindowLowerBound()); + } } From d7240672ff6592f48f6b434506dd8d7dca8418b7 Mon Sep 17 00:00:00 2001 From: zhang677 Date: Fri, 1 Apr 2022 21:42:33 +0800 Subject: [PATCH 12/12] Add WS Ir print --- test/tests-workspaces.cpp | 1153 +++++++++++++++++++------------------ 1 file changed, 589 insertions(+), 564 deletions(-) diff --git a/test/tests-workspaces.cpp b/test/tests-workspaces.cpp index 80fd5f3f5..b23bb7089 100644 --- a/test/tests-workspaces.cpp +++ b/test/tests-workspaces.cpp @@ -7,121 +7,145 @@ #include "taco/index_notation/index_notation.h" #include "codegen/codegen.h" #include "taco/lower/lower.h" - +#include "fstream" using namespace taco; -TEST(workspaces, tile_vecElemMul_NoTail) { - - Tensor A("A", {16}, Format{Dense}); - Tensor B("B", {16}, Format{Dense}); - Tensor C("C", {16}, Format{Dense}); - - for (int i = 0; i < 16; i++) { - A.insert({i}, (double) i); - B.insert({i}, (double) i); - } - - A.pack(); - B.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr precomputedExpr = B(i) * C(i); - A(i) = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); - stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) - .split(i_bounded, i0, i1, 4) - .precompute(precomputedExpr, i1, i1, precomputed); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected", {16}, Format{Dense}); - expected(i) = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, tile_vecElemMul_Tail1) { - - Tensor A("A", {16}, Format{Dense}); - Tensor B("B", {16}, Format{Dense}); - Tensor C("C", {16}, Format{Dense}); - - for (int i = 0; i < 16; i++) { - A.insert({i}, (double) i); - B.insert({i}, (double) i); - } - - A.pack(); - B.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr precomputedExpr = B(i) * C(i); - A(i) = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); - stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) - .split(i_bounded, i0, i1, 5) - .precompute(precomputedExpr, i1, i1, precomputed); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {16}, Format{Dense}); - expected(i) = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, tile_vecElemMul_Tail2) { - - Tensor A("A", {17}, Format{Dense}); - Tensor B("B", {17}, Format{Dense}); - Tensor C("C", {17}, Format{Dense}); - - for (int i = 0; i < 17; i++) { - A.insert({i}, (double) i); - B.insert({i}, (double) i); - } - - A.pack(); - B.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr precomputedExpr = B(i) * C(i); - A(i) = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); - stmt = stmt.bound(i, i_bounded, 17, BoundType::MaxExact) - .split(i_bounded, i0, i1, 4) - .precompute(precomputedExpr, i1, i1, precomputed); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {17}, Format{Dense}); - expected(i) = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); +namespace Temptest { + void _printIRtoFile(const string& filename, const IndexStmt& stmt) { + stringstream source; + string file_path = "eval_generated/"; + mkdir(file_path.c_str(), 0777); + std::shared_ptr codegen = ir::CodeGen::init_default(source, ir::CodeGen::ImplementationGen); + ir::Stmt compute = lower(stmt, "compute", false, true); + + ofstream source_file; + string file_ending=".txt"; + source_file.open(file_path + filename + file_ending); + ir::IRPrinter irp = ir::IRPrinter(source_file); + source_file< codegen = ir::CodeGen::init_default(cout, ir::CodeGen::ImplementationGen); + ir::Stmt compute = lower(stmt, "compute", false, true); + ir::IRPrinter irp = ir::IRPrinter(cout); + irp.print(compute); + } + + TEST(workspaces, tile_vecElemMul_NoTail) { + + Tensor A("A", {16}, Format{Dense}); + Tensor B("B", {16}, Format{Dense}); + Tensor C("C", {16}, Format{Dense}); + + for (int i = 0; i < 16; i++) { + A.insert({i}, (double) i); + B.insert({i}, (double) i); + } + + A.pack(); + B.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr precomputedExpr = B(i) * C(i); + A(i) = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); + stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) + .split(i_bounded, i0, i1, 4) + .precompute(precomputedExpr, i1, i1, precomputed); + + A.compile(stmt); + A.assemble(); + A.compute(); + _printToCout(stmt); + Tensor expected("expected", {16}, Format{Dense}); + expected(i) = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } + + TEST(workspaces, tile_vecElemMul_Tail1) { + + Tensor A("A", {16}, Format{Dense}); + Tensor B("B", {16}, Format{Dense}); + Tensor C("C", {16}, Format{Dense}); + + for (int i = 0; i < 16; i++) { + A.insert({i}, (double) i); + B.insert({i}, (double) i); + } + + A.pack(); + B.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr precomputedExpr = B(i) * C(i); + A(i) = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); + stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) + .split(i_bounded, i0, i1, 5) + .precompute(precomputedExpr, i1, i1, precomputed); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {16}, Format{Dense}); + expected(i) = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } + + TEST(workspaces, tile_vecElemMul_Tail2) { + + Tensor A("A", {17}, Format{Dense}); + Tensor B("B", {17}, Format{Dense}); + Tensor C("C", {17}, Format{Dense}); + + for (int i = 0; i < 17; i++) { + A.insert({i}, (double) i); + B.insert({i}, (double) i); + } + + A.pack(); + B.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr precomputedExpr = B(i) * C(i); + A(i) = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); + stmt = stmt.bound(i, i_bounded, 17, BoundType::MaxExact) + .split(i_bounded, i0, i1, 4) + .precompute(precomputedExpr, i1, i1, precomputed); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {17}, Format{Dense}); + expected(i) = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); // ir::IRPrinter irp = ir::IRPrinter(cout); // @@ -133,45 +157,45 @@ TEST(workspaces, tile_vecElemMul_Tail2) { // irp.print(compute); // cout << endl; // codegen->compile(compute, false); -} - -TEST(workspaces, tile_denseMatMul) { - - Tensor A("A", {16}, Format{Dense}); - Tensor B("B", {16}, Format{Dense}); - Tensor C("C", {16}, Format{Dense}); - - for (int i = 0; i < 16; i++) { - B.insert({i}, (double) i); - C.insert({i}, (double) i); - } - - A.pack(); - B.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr precomputedExpr = B(i) * C(i); - A(i) = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); - stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) - .split(i_bounded, i0, i1, 4); - - stmt = stmt.precompute(precomputedExpr, i1, i1, precomputed); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {16}, Format{Dense}); - expected(i) = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); + } + + TEST(workspaces, tile_denseMatMul) { + + Tensor A("A", {16}, Format{Dense}); + Tensor B("B", {16}, Format{Dense}); + Tensor C("C", {16}, Format{Dense}); + + for (int i = 0; i < 16; i++) { + B.insert({i}, (double) i); + C.insert({i}, (double) i); + } + + A.pack(); + B.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr precomputedExpr = B(i) * C(i); + A(i) = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar precomputed("precomputed", Type(Float64, {Dimension(i1)}), taco::dense); + stmt = stmt.bound(i, i_bounded, 16, BoundType::MaxExact) + .split(i_bounded, i0, i1, 4); + + stmt = stmt.precompute(precomputedExpr, i1, i1, precomputed); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {16}, Format{Dense}); + expected(i) = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); // ir::IRPrinter irp = ir::IRPrinter(cout); // @@ -183,426 +207,427 @@ TEST(workspaces, tile_denseMatMul) { // irp.print(compute); // cout << endl; // codegen->compile(compute, false); - -} - -TEST(workspaces, precompute2D_add) { - int N = 16; - Tensor A("A", {N, N}, Format{Dense, Dense}); - Tensor B("B", {N, N}, Format{Dense, Dense}); - Tensor C("C", {N, N}, Format{Dense, Dense}); - Tensor D("D", {N, N}, Format{Dense, Dense}); - - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - B.insert({i, j}, (double) i); - C.insert({i, j}, (double) j); - D.insert({i, j}, (double) i*j); + } - } - - IndexVar i("i"), j("j"); - IndexExpr precomputedExpr = B(i, j) + C(i, j); - A(i, j) = precomputedExpr + D(i, j); - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws("ws", Type(Float64, {(size_t)N, (size_t)N}), Format{Dense, Dense}); - stmt = stmt.precompute(precomputedExpr, {i, j}, {i, j}, ws); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N}, Format{Dense, Dense}); - expected(i, j) = B(i, j) + C(i, j) + D(i, j); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); - -} - -TEST(workspaces, precompute4D_add) { - int N = 16; - Tensor A("A", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor C("C", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor D("D", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - for (int k = 0; k < N; k++) { - for (int l = 0; l < N; l++) { - B.insert({i, j, k, l}, (double) i + j); - C.insert({i, j, k, l}, (double) j * k); - D.insert({i, j, k, l}, (double) k * l); + + TEST(workspaces, precompute2D_add) { + int N = 16; + Tensor A("A", {N, N}, Format{Dense, Dense}); + Tensor B("B", {N, N}, Format{Dense, Dense}); + Tensor C("C", {N, N}, Format{Dense, Dense}); + Tensor D("D", {N, N}, Format{Dense, Dense}); + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + B.insert({i, j}, (double) i); + C.insert({i, j}, (double) j); + D.insert({i, j}, (double) i * j); + } } - } + + IndexVar i("i"), j("j"); + IndexExpr precomputedExpr = B(i, j) + C(i, j); + A(i, j) = precomputedExpr + D(i, j); + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws("ws", Type(Float64, {(size_t) N, (size_t) N}), Format{Dense, Dense}); + stmt = stmt.precompute(precomputedExpr, {i, j}, {i, j}, ws); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N}, Format{Dense, Dense}); + expected(i, j) = B(i, j) + C(i, j) + D(i, j); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } - } - - IndexVar i("i"), j("j"), k("k"), l("l"); - IndexExpr precomputedExpr = B(i, j, k, l) + C(i, j, k, l); - A(i, j, k, l) = precomputedExpr + D(i, j, k, l); - - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws1("ws1", Type(Float64, {(size_t)N, (size_t)N, (size_t)N, (size_t)N}), - Format{Dense, Dense, Dense, Dense}); - TensorVar ws2("ws2", Type(Float64, {(size_t)N, (size_t)N, (size_t)N, (size_t)N}), - Format{Dense, Dense, Dense, Dense}); - stmt = stmt.precompute(precomputedExpr, {i, j, k, l}, {i, j, k, l}, ws1) - .precompute(ws1(i, j, k, l) + D(i, j, k, l), {i, j, k, l}, {i, j, k ,l}, ws2); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - expected(i, j, k, l) = B(i, j, k, l) + C(i, j, k, l) + D(i, j, k, l); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, precompute4D_multireduce) { - int N = 16; - Tensor A("A", {N, N}, Format{Dense, Dense}); - Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor C("C", {N, N, N}, Format{Dense, Dense, Dense}); - Tensor D("D", {N, N}, Format{Dense, Dense}); - - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - for (int k = 0; k < N; k++) { - for (int l = 0; l < N; l++) { - B.insert({i, j, k, l}, (double) k*l); - C.insert({i, j, k}, (double) j * k); - D.insert({i, j}, (double) i+j); + + TEST(workspaces, precompute4D_add) { + int N = 16; + Tensor A("A", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor C("C", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor D("D", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + for (int k = 0; k < N; k++) { + for (int l = 0; l < N; l++) { + B.insert({i, j, k, l}, (double) i + j); + C.insert({i, j, k, l}, (double) j * k); + D.insert({i, j, k, l}, (double) k * l); + } + } + } } - } + + IndexVar i("i"), j("j"), k("k"), l("l"); + IndexExpr precomputedExpr = B(i, j, k, l) + C(i, j, k, l); + A(i, j, k, l) = precomputedExpr + D(i, j, k, l); + + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws1("ws1", Type(Float64, {(size_t) N, (size_t) N, (size_t) N, (size_t) N}), + Format{Dense, Dense, Dense, Dense}); + TensorVar ws2("ws2", Type(Float64, {(size_t) N, (size_t) N, (size_t) N, (size_t) N}), + Format{Dense, Dense, Dense, Dense}); + stmt = stmt.precompute(precomputedExpr, {i, j, k, l}, {i, j, k, l}, ws1) + .precompute(ws1(i, j, k, l) + D(i, j, k, l), {i, j, k, l}, {i, j, k, l}, ws2); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + expected(i, j, k, l) = B(i, j, k, l) + C(i, j, k, l) + D(i, j, k, l); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); } - } - - IndexVar i("i"), j("j"), k("k"), l("l"), m("m"), n("n"); - IndexExpr precomputedExpr = B(i, j, k, l) * C(k, l, m); - A(i, j) = precomputedExpr * D(m, n); - - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws1("ws1", Type(Float64, {(size_t)N, (size_t)N, (size_t)N}), Format{Dense, Dense, Dense}); - TensorVar ws2("ws2", Type(Float64, {(size_t)N, (size_t)N}), Format{Dense, Dense}); - stmt = stmt.precompute(precomputedExpr, {i, j, m}, {i, j, m}, ws1) - .precompute(ws1(i, j, m) * D(m, n), {i, j}, {i, j}, ws2); - - A.compile(stmt.concretize()); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N}, Format{Dense, Dense}); - expected(i, j) = B(i, j, k, l) * C(k, l, m) * D(m, n); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, precompute3D_TspV) { - int N = 16; - Tensor A("A", {N, N}, Format{Dense, Dense}); - Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor c("c", {N}, Format{Sparse}); - - for (int i = 0; i < N; i++) { - c.insert({i}, (double) i); - for (int j = 0; j < N; j++) { - for (int k = 0; k < N; k++) { - for (int l = 0; l < N; l++) { - B.insert({i, j, k, l}, (double) i + j); + + TEST(workspaces, precompute4D_multireduce) { + int N = 16; + Tensor A("A", {N, N}, Format{Dense, Dense}); + Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor C("C", {N, N, N}, Format{Dense, Dense, Dense}); + Tensor D("D", {N, N}, Format{Dense, Dense}); + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + for (int k = 0; k < N; k++) { + for (int l = 0; l < N; l++) { + B.insert({i, j, k, l}, (double) k * l); + C.insert({i, j, k}, (double) j * k); + D.insert({i, j}, (double) i + j); + } + } + } } - } + + IndexVar i("i"), j("j"), k("k"), l("l"), m("m"), n("n"); + IndexExpr precomputedExpr = B(i, j, k, l) * C(k, l, m); + A(i, j) = precomputedExpr * D(m, n); + + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws1("ws1", Type(Float64, {(size_t) N, (size_t) N, (size_t) N}), Format{Dense, Dense, Dense}); + TensorVar ws2("ws2", Type(Float64, {(size_t) N, (size_t) N}), Format{Dense, Dense}); + stmt = stmt.precompute(precomputedExpr, {i, j, m}, {i, j, m}, ws1) + .precompute(ws1(i, j, m) * D(m, n), {i, j}, {i, j}, ws2); + + A.compile(stmt.concretize()); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N}, Format{Dense, Dense}); + expected(i, j) = B(i, j, k, l) * C(k, l, m) * D(m, n); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); } - } - - IndexVar i("i"), j("j"), k("k"), l("l"); - IndexExpr precomputedExpr = B(i, j, k, l) * c(l); - A(i, j) = precomputedExpr * c(k); - - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws("ws", Type(Float64, {(size_t)N, (size_t)N, (size_t)N}), Format{Dense, Dense, Dense}); - stmt = stmt.precompute(precomputedExpr, {i, j, k}, {i, j, k}, ws); - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N}, Format{Dense, Dense}); - expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); - -} - -TEST(workspaces, precompute3D_multipleWS) { - int N = 16; - Tensor A("A", {N, N}, Format{Dense, Dense}); - Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor c("c", {N}, Format{Sparse}); - - for (int i = 0; i < N; i++) { - c.insert({i}, (double) i); - for (int j = 0; j < N; j++) { - for (int k = 0; k < N; k++) { - for (int l = 0; l < N; l++) { - B.insert({i, j, k, l}, (double) i + j); + + TEST(workspaces, precompute3D_TspV) { + int N = 16; + Tensor A("A", {N, N}, Format{Dense, Dense}); + Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor c("c", {N}, Format{Sparse}); + + for (int i = 0; i < N; i++) { + c.insert({i}, (double) i); + for (int j = 0; j < N; j++) { + for (int k = 0; k < N; k++) { + for (int l = 0; l < N; l++) { + B.insert({i, j, k, l}, (double) i + j); + } + } + } } - } + + IndexVar i("i"), j("j"), k("k"), l("l"); + IndexExpr precomputedExpr = B(i, j, k, l) * c(l); + A(i, j) = precomputedExpr * c(k); + + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws("ws", Type(Float64, {(size_t) N, (size_t) N, (size_t) N}), Format{Dense, Dense, Dense}); + stmt = stmt.precompute(precomputedExpr, {i, j, k}, {i, j, k}, ws); + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N}, Format{Dense, Dense}); + expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } - } - - IndexVar i("i"), j("j"), k("k"), l("l"); - IndexExpr precomputedExpr = B(i, j, k, l) * c(l); - IndexExpr precomputedExpr2 = precomputedExpr * c(k); - A(i, j) = precomputedExpr2; - - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws("ws", Type(Float64, {(size_t)N, (size_t)N, (size_t)N}), Format{Dense, Dense, Dense}); - TensorVar t("t", Type(Float64, {(size_t) N, (size_t)N}), Format{Dense, Dense}); - stmt = stmt.precompute(precomputedExpr, {i, j, k}, {i, j, k}, ws); - - stmt = stmt.precompute(ws(i, j, k) * c(k), {i, j}, {i, j}, t); - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N}, Format{Dense, Dense}); - expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); - -} - -TEST(workspaces, precompute3D_renamedIVars_TspV) { - int N = 16; - Tensor A("A", {N, N}, Format{Dense, Dense}); - Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); - Tensor c("c", {N}, Format{Sparse}); - - for (int i = 0; i < N; i++) { - c.insert({i}, (double) i); - for (int j = 0; j < N; j++) { - for (int k = 0; k < N; k++) { - for (int l = 0; l < N; l++) { - B.insert({i, j, k, l}, (double) i + j); + + TEST(workspaces, precompute3D_multipleWS) { + int N = 16; + Tensor A("A", {N, N}, Format{Dense, Dense}); + Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor c("c", {N}, Format{Sparse}); + + for (int i = 0; i < N; i++) { + c.insert({i}, (double) i); + for (int j = 0; j < N; j++) { + for (int k = 0; k < N; k++) { + for (int l = 0; l < N; l++) { + B.insert({i, j, k, l}, (double) i + j); + } + } + } } - } + + IndexVar i("i"), j("j"), k("k"), l("l"); + IndexExpr precomputedExpr = B(i, j, k, l) * c(l); + IndexExpr precomputedExpr2 = precomputedExpr * c(k); + A(i, j) = precomputedExpr2; + + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws("ws", Type(Float64, {(size_t) N, (size_t) N, (size_t) N}), Format{Dense, Dense, Dense}); + TensorVar t("t", Type(Float64, {(size_t) N, (size_t) N}), Format{Dense, Dense}); + stmt = stmt.precompute(precomputedExpr, {i, j, k}, {i, j, k}, ws); + + stmt = stmt.precompute(ws(i, j, k) * c(k), {i, j}, {i, j}, t); + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N}, Format{Dense, Dense}); + expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + + } + + TEST(workspaces, precompute3D_renamedIVars_TspV) { + int N = 16; + Tensor A("A", {N, N}, Format{Dense, Dense}); + Tensor B("B", {N, N, N, N}, Format{Dense, Dense, Dense, Dense}); + Tensor c("c", {N}, Format{Sparse}); + + for (int i = 0; i < N; i++) { + c.insert({i}, (double) i); + for (int j = 0; j < N; j++) { + for (int k = 0; k < N; k++) { + for (int l = 0; l < N; l++) { + B.insert({i, j, k, l}, (double) i + j); + } + } + } + } + + IndexVar i("i"), j("j"), k("k"), l("l"); + IndexExpr precomputedExpr = B(i, j, k, l) * c(l); + A(i, j) = precomputedExpr * c(k); + + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar ws("ws", Type(Float64, {(size_t) N, (size_t) N, (size_t) N}), + Format{Dense, Dense, Dense}); + + IndexVar iw("iw"), jw("jw"), kw("kw"); + stmt = stmt.precompute(precomputedExpr, {i, j, k}, {iw, jw, kw}, ws); + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + Tensor expected("expected", {N, N}, Format{Dense, Dense}); + expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + + } + + TEST(workspaces, DISABLED_tile_dotProduct_1) { + // FIXME: Disabled because currently the precompute algorithm does not appropriately + // find the correct forall substmt to next the WhereNode in after i has been + // split into i0 and i1. As an example, the first precompute below is incorrect + // since it should transform + // forall(i0, forall(i1, A() += B(i) * C(i))) --> + // forall(i0, where(forall(i1, A() += ws(i1)), forall(i1, ws(i1) += B(i) * C(i)))) + // + // But currently the algorithm does + // forall(i0, forall(i1, A() += B(i) * C(i))) --> + // where(forall(i1, A() += ws(i1)), forall(i0, forall(i1, ws(i1) += B(i) * C(i)))) + + int N = 1024; + Tensor A("A"); + Tensor B("B", {N}, Format({Dense})); + Tensor C("C", {N}, Format({Dense})); + + for (int i = 0; i < N; i++) { + B.insert({i}, (double) i); + C.insert({i}, (double) i); + } + + B.pack(); + C.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr BExpr = B(i); + IndexExpr CExpr = C(i); + IndexExpr precomputedExpr = (BExpr) * (CExpr); + A() = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar B_new("B_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar C_new("C_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar precomputed("precomputed", Type(Float64, {(size_t) N}), taco::dense); + + stmt = stmt.bound(i, i_bounded, (size_t) N, BoundType::MaxExact) + .split(i_bounded, i0, i1, 32); + stmt = stmt.precompute(precomputedExpr, i1, i1, precomputed); + stmt = stmt.precompute(BExpr, i1, i1, B_new) + .precompute(CExpr, i1, i1, C_new); + + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + ir::IRPrinter irp = ir::IRPrinter(cout); + + cout << stmt << endl; + + std::shared_ptr codegen = ir::CodeGen::init_default(cout, ir::CodeGen::ImplementationGen); + ir::Stmt compute = lower(stmt, "compute", false, true); + + irp.print(compute); + cout << endl; + codegen->compile(compute, false); + + Tensor expected("expected"); + expected() = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } + + TEST(workspaces, DISABLED_tile_dotProduct_2) { + // FIXME: This is also currently disabled since split(...) scheduling commands + // only split on the FIRST INSTANCE of an indexVar (assumes only one). + // This is wrong if the indexVar is not renamed across iw_vars since an indexVar can + // then occur on BOTH the consumer and producer side and should be split across both. + + int N = 1024; + Tensor A("A"); + Tensor B("B", {N}, Format({Dense})); + Tensor C("C", {N}, Format({Dense})); + + for (int i = 0; i < N; i++) { + B.insert({i}, (double) i); + C.insert({i}, (double) i); + } + + B.pack(); + C.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr BExpr = B(i); + IndexExpr CExpr = C(i); + IndexExpr precomputedExpr = (BExpr) * (CExpr); + A() = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar B_new("B_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar C_new("C_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar precomputed("precomputed", Type(Float64, {(size_t) N}), taco::dense); + + stmt = stmt.precompute(precomputedExpr, i, i, precomputed); + + stmt = stmt.precompute(BExpr, i, i, B_new) + .precompute(CExpr, i, i, C_new); + + stmt = stmt.bound(i, i_bounded, (size_t) N, BoundType::MaxExact) + .split(i_bounded, i0, i1, 32); + + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + Tensor expected("expected"); + expected() = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); + } + + TEST(workspaces, tile_dotProduct_3) { + int N = 1024; + Tensor A("A"); + Tensor B("B", {N}, Format({Dense})); + Tensor C("C", {N}, Format({Dense})); + + for (int i = 0; i < N; i++) { + B.insert({i}, (double) i); + C.insert({i}, (double) i); + } + + B.pack(); + C.pack(); + + IndexVar i("i"); + IndexVar i_bounded("i_bounded"); + IndexVar i0("i0"), i1("i1"); + IndexExpr BExpr = B(i); + IndexExpr CExpr = C(i); + IndexExpr precomputedExpr = (BExpr) * (CExpr); + A() = precomputedExpr; + + IndexStmt stmt = A.getAssignment().concretize(); + TensorVar B_new("B_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar C_new("C_new", Type(Float64, {(size_t) N}), taco::dense); + TensorVar precomputed("precomputed", Type(Float64, {(size_t) N}), taco::dense); + + stmt = stmt.bound(i, i_bounded, (size_t) N, BoundType::MaxExact) + .split(i_bounded, i0, i1, 32); + stmt = stmt.precompute(precomputedExpr, i0, i0, precomputed); + + stmt = stmt.precompute(BExpr, i1, i1, B_new) + .precompute(CExpr, i1, i1, C_new); + + + stmt = stmt.concretize(); + + A.compile(stmt); + A.assemble(); + A.compute(); + + Tensor expected("expected"); + expected() = B(i) * C(i); + expected.compile(); + expected.assemble(); + expected.compute(); + ASSERT_TENSOR_EQ(expected, A); } - } - - IndexVar i("i"), j("j"), k("k"), l("l"); - IndexExpr precomputedExpr = B(i, j, k, l) * c(l); - A(i, j) = precomputedExpr * c(k); - - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar ws("ws", Type(Float64, {(size_t)N, (size_t)N, (size_t)N}), - Format{Dense, Dense, Dense}); - - IndexVar iw("iw"), jw("jw"), kw("kw"); - stmt = stmt.precompute(precomputedExpr, {i, j, k}, {iw, jw, kw}, ws); - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected", {N, N}, Format{Dense, Dense}); - expected(i, j) = (B(i, j, k, l) * c(l)) * c(k); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); - -} - -TEST(workspaces, DISABLED_tile_dotProduct_1) { - // FIXME: Disabled because currently the precompute algorithm does not appropriately - // find the correct forall substmt to next the WhereNode in after i has been - // split into i0 and i1. As an example, the first precompute below is incorrect - // since it should transform - // forall(i0, forall(i1, A() += B(i) * C(i))) --> - // forall(i0, where(forall(i1, A() += ws(i1)), forall(i1, ws(i1) += B(i) * C(i)))) - // - // But currently the algorithm does - // forall(i0, forall(i1, A() += B(i) * C(i))) --> - // where(forall(i1, A() += ws(i1)), forall(i0, forall(i1, ws(i1) += B(i) * C(i)))) - - int N = 1024; - Tensor A("A"); - Tensor B("B", {N}, Format({Dense})); - Tensor C("C", {N}, Format({Dense})); - - for (int i = 0; i < N; i++) { - B.insert({i}, (double) i); - C.insert({i}, (double) i); - } - - B.pack(); - C.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr BExpr = B(i); - IndexExpr CExpr = C(i); - IndexExpr precomputedExpr = (BExpr) * (CExpr); - A() = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar B_new("B_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar C_new("C_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar precomputed("precomputed", Type(Float64, {(size_t)N}), taco::dense); - - stmt = stmt.bound(i, i_bounded, (size_t)N, BoundType::MaxExact) - .split(i_bounded, i0, i1, 32); - stmt = stmt.precompute(precomputedExpr, i1, i1, precomputed); - stmt = stmt.precompute(BExpr, i1, i1, B_new) - .precompute(CExpr, i1, i1, C_new); - - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - ir::IRPrinter irp = ir::IRPrinter(cout); - - cout << stmt << endl; - - std::shared_ptr codegen = ir::CodeGen::init_default(cout, ir::CodeGen::ImplementationGen); - ir::Stmt compute = lower(stmt, "compute", false, true); - - irp.print(compute); - cout << endl; - codegen->compile(compute, false); - - Tensor expected("expected"); - expected() = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, DISABLED_tile_dotProduct_2) { - // FIXME: This is also currently disabled since split(...) scheduling commands - // only split on the FIRST INSTANCE of an indexVar (assumes only one). - // This is wrong if the indexVar is not renamed across iw_vars since an indexVar can - // then occur on BOTH the consumer and producer side and should be split across both. - - int N = 1024; - Tensor A("A"); - Tensor B("B", {N}, Format({Dense})); - Tensor C("C", {N}, Format({Dense})); - - for (int i = 0; i < N; i++) { - B.insert({i}, (double) i); - C.insert({i}, (double) i); - } - - B.pack(); - C.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr BExpr = B(i); - IndexExpr CExpr = C(i); - IndexExpr precomputedExpr = (BExpr) * (CExpr); - A() = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar B_new("B_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar C_new("C_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar precomputed("precomputed", Type(Float64, {(size_t)N}), taco::dense); - - stmt = stmt.precompute(precomputedExpr, i, i, precomputed); - - stmt = stmt.precompute(BExpr, i, i, B_new) - .precompute(CExpr, i, i, C_new); - - stmt = stmt.bound(i, i_bounded, (size_t)N, BoundType::MaxExact) - .split(i_bounded, i0, i1, 32); - - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected"); - expected() = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} - -TEST(workspaces, tile_dotProduct_3) { - int N = 1024; - Tensor A("A"); - Tensor B("B", {N}, Format({Dense})); - Tensor C("C", {N}, Format({Dense})); - - for (int i = 0; i < N; i++) { - B.insert({i}, (double) i); - C.insert({i}, (double) i); - } - - B.pack(); - C.pack(); - - IndexVar i("i"); - IndexVar i_bounded("i_bounded"); - IndexVar i0("i0"), i1("i1"); - IndexExpr BExpr = B(i); - IndexExpr CExpr = C(i); - IndexExpr precomputedExpr = (BExpr) * (CExpr); - A() = precomputedExpr; - - IndexStmt stmt = A.getAssignment().concretize(); - TensorVar B_new("B_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar C_new("C_new", Type(Float64, {(size_t)N}), taco::dense); - TensorVar precomputed("precomputed", Type(Float64, {(size_t)N}), taco::dense); - - stmt = stmt.bound(i, i_bounded, (size_t)N, BoundType::MaxExact) - .split(i_bounded, i0, i1, 32); - stmt = stmt.precompute(precomputedExpr, i0, i0, precomputed); - - stmt = stmt.precompute(BExpr, i1, i1, B_new) - .precompute(CExpr, i1, i1, C_new); - - - stmt = stmt.concretize(); - - A.compile(stmt); - A.assemble(); - A.compute(); - - Tensor expected("expected"); - expected() = B(i) * C(i); - expected.compile(); - expected.assemble(); - expected.compute(); - ASSERT_TENSOR_EQ(expected, A); -} +} \ No newline at end of file