Commit 431f245c authored by Robert Kimball's avatar Robert Kimball

fix codegen to not segfault if compile failed

parent 0d26f380
...@@ -193,14 +193,15 @@ std::unique_ptr<llvm::Module> execution_state::compile(const string& source, con ...@@ -193,14 +193,15 @@ std::unique_ptr<llvm::Module> execution_state::compile(const string& source, con
// Create and execute action // Create and execute action
CodeGenAction* compilerAction = new EmitCodeGenOnlyAction(); CodeGenAction* compilerAction = new EmitCodeGenOnlyAction();
if (Clang->ExecuteAction(*compilerAction) == false) std::unique_ptr<llvm::Module> rc;
if (Clang->ExecuteAction(*compilerAction) == true)
{ {
throw runtime_error("codegen compile failed"); rc = compilerAction->takeModule();
} }
buffer.release(); buffer.release();
return compilerAction->takeModule(); return rc;
} }
bool execution_state::add_module(std::unique_ptr<llvm::Module>& module) bool execution_state::add_module(std::unique_ptr<llvm::Module>& module)
......
...@@ -233,10 +233,6 @@ void Emitter::EMITTER_DECL(EmitGetTupleElement) ...@@ -233,10 +233,6 @@ void Emitter::EMITTER_DECL(EmitGetTupleElement)
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU.indent++; TU.indent++;
TU << "// call_frame->get_parameterized_tensor_view<" << type << ">(" << outputs[0].get_index()
<< ")->get_vector() =\n"
<< "// call_frame->get_parameterized_tensor_view<" << type << ">("
<< inputs[get_tuple_element->get_n()].get_index() << ")->get_vector();\n";
TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", " TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
<< inputs[get_tuple_element->get_n()].get_tensor().get_name() << ", " << inputs[get_tuple_element->get_n()].get_tensor().get_name() << ", "
<< outputs[0].get_tensor_view_layout()->get_size() * << outputs[0].get_tensor_view_layout()->get_size() *
...@@ -396,7 +392,7 @@ void Emitter::EMITTER_DECL(EmitGreater) ...@@ -396,7 +392,7 @@ void Emitter::EMITTER_DECL(EmitGreater)
<< " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name() << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name()
<< ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n"; << ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n";
TU.indent--; TU.indent--;
TU << " }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitGreaterEq) void Emitter::EMITTER_DECL(EmitGreaterEq)
...@@ -414,7 +410,7 @@ void Emitter::EMITTER_DECL(EmitGreaterEq) ...@@ -414,7 +410,7 @@ void Emitter::EMITTER_DECL(EmitGreaterEq)
<< " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name() << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name()
<< ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n"; << ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n";
TU.indent--; TU.indent--;
TU << " }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitLess) void Emitter::EMITTER_DECL(EmitLess)
...@@ -432,7 +428,7 @@ void Emitter::EMITTER_DECL(EmitLess) ...@@ -432,7 +428,7 @@ void Emitter::EMITTER_DECL(EmitLess)
<< " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name() << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name()
<< ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n"; << ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n";
TU.indent--; TU.indent--;
TU << " }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitLessEq) void Emitter::EMITTER_DECL(EmitLessEq)
...@@ -450,7 +446,7 @@ void Emitter::EMITTER_DECL(EmitLessEq) ...@@ -450,7 +446,7 @@ void Emitter::EMITTER_DECL(EmitLessEq)
<< " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name() << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[1].get_tensor().get_name()
<< ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n"; << ", " << eigen_vector_format(inputs[1]) << ")).template cast<char>();\n";
TU.indent--; TU.indent--;
TU << " }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitLog) void Emitter::EMITTER_DECL(EmitLog)
...@@ -585,29 +581,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantBool) ...@@ -585,29 +581,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantBool)
string type = element::Bool::element_type().c_type_string(); string type = element::Bool::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
{ << (value[i] ? "true" : "false") << ");\n";
TU += ", ";
}
if (value[i])
{
TU += "true";
}
else
{
TU += "false";
}
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantFloat32) void Emitter::EMITTER_DECL(EmitParameterizedConstantFloat32)
...@@ -618,20 +599,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantFloat32) ...@@ -618,20 +599,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantFloat32)
string type = element::Float32::element_type().c_type_string(); string type = element::Float32::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]) + "f";
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantInt8) void Emitter::EMITTER_DECL(EmitParameterizedConstantInt8)
...@@ -642,20 +617,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt8) ...@@ -642,20 +617,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt8)
string type = element::Int8::element_type().c_type_string(); string type = element::Int8::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantInt32) void Emitter::EMITTER_DECL(EmitParameterizedConstantInt32)
...@@ -666,20 +635,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt32) ...@@ -666,20 +635,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt32)
string type = element::Int32::element_type().c_type_string(); string type = element::Int32::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantInt64) void Emitter::EMITTER_DECL(EmitParameterizedConstantInt64)
...@@ -690,20 +653,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt64) ...@@ -690,20 +653,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantInt64)
string type = element::Int64::element_type().c_type_string(); string type = element::Int64::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt8) void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt8)
...@@ -714,20 +671,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt8) ...@@ -714,20 +671,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt8)
string type = element::UInt8::element_type().c_type_string(); string type = element::UInt8::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt32) void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt32)
...@@ -738,20 +689,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt32) ...@@ -738,20 +689,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt32)
string type = element::UInt32::element_type().c_type_string(); string type = element::UInt32::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt64) void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt64)
...@@ -762,20 +707,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt64) ...@@ -762,20 +707,14 @@ void Emitter::EMITTER_DECL(EmitParameterizedConstantUInt64)
string type = element::UInt64::element_type().c_type_string(); string type = element::UInt64::element_type().c_type_string();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
type + ">(" + to_string(outputs[0].get_index()) + ")->get_vector() = std::vector<" + type +
"::type>{";
for (size_t i = 0; i < value.size(); i++) for (size_t i = 0; i < value.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<" << type << ">("
TU += ", "; << value[i] << ");\n";
TU += to_string(value[i]);
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitBroadcast) void Emitter::EMITTER_DECL(EmitBroadcast)
...@@ -796,34 +735,27 @@ void Emitter::EMITTER_DECL(EmitBroadcast) ...@@ -796,34 +735,27 @@ void Emitter::EMITTER_DECL(EmitBroadcast)
if (broadcast->get_broadcast_axes().empty()) if (broadcast->get_broadcast_axes().empty())
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
" call_frame->get_parameterized_tensor_view<" + << inputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << outputs[0].get_tensor_view_layout()->get_size() *
")->get_vector() =\n" outputs[0].get_tensor_view_layout()->get_element_type().size()
" call_frame->get_parameterized_tensor_view<" + << ");\n";
result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + TU.indent--;
")->get_vector();\n" TU << "}\n";
" }\n";
} }
else if (arg_shape.size() == 0) else if (arg_shape.size() == 0)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << ") =\n"
");\n" << " EigenArray1d<" << result_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << ")(0, 0);\n";
");\n" TU.indent--;
" EigenArray1d<" + TU << "}\n";
result_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
result_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
")(0, 0);\n"
" }\n";
} }
else if (arg_shape.size() == 1 && result_shape.size() == 2) else if (arg_shape.size() == 1 && result_shape.size() == 2)
{ {
...@@ -832,44 +764,32 @@ void Emitter::EMITTER_DECL(EmitBroadcast) ...@@ -832,44 +764,32 @@ void Emitter::EMITTER_DECL(EmitBroadcast)
auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>(); auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenMatrix<" << result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides())
");\n" << ").colwise() =\n"
" auto out = call_frame->get_tensor_view_data<" + << " EigenVector<" << result_element_type.c_type_string() << ">("
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
");\n" << ");\n";
" EigenMatrix<" + TU.indent--;
result_element_type.c_type_string() + ">(out, " + TU << "}\n";
eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) +
").colwise() =\n"
" EigenVector<" +
result_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
");\n"
" }\n";
} }
else if (broadcast->get_broadcast_axes() == AxisSet{0}) else if (broadcast->get_broadcast_axes() == AxisSet{0})
{ {
auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>(); auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenMatrix<" << result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides())
");\n" << ").rowwise() =\n"
" auto out = call_frame->get_tensor_view_data<" + << " EigenVector<" << result_element_type.c_type_string() << ">("
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
");\n" << ").transpose();\n";
" EigenMatrix<" + TU.indent--;
result_element_type.c_type_string() + ">(out, " + TU << "}\n";
eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) +
").rowwise() =\n"
" EigenVector<" +
result_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").transpose();\n"
" }\n";
} }
else else
{ {
...@@ -899,24 +819,14 @@ void Emitter::EMITTER_DECL(EmitConvert) ...@@ -899,24 +819,14 @@ void Emitter::EMITTER_DECL(EmitConvert)
auto& result_element_type = result_tensor_type->get_element_type(); auto& result_element_type = result_tensor_type->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0]) << ") =\n"
arg_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << arg_element_type.c_type_string() << ">("
");\n" << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0]) << ")\n"
" auto out = call_frame->get_tensor_view_data<" + << " .template cast<" << result_element_type.c_type_string() << ">();\n";
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU.indent--;
");\n" TU << "}\n";
" EigenArray1d<" +
result_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
arg_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
")\n"
".template cast<typename " +
result_element_type.c_type_string() +
"::type>();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitConstant) void Emitter::EMITTER_DECL(EmitConstant)
...@@ -928,20 +838,14 @@ void Emitter::EMITTER_DECL(EmitConstant) ...@@ -928,20 +838,14 @@ void Emitter::EMITTER_DECL(EmitConstant)
auto c_value_strings = c->get_value_strings(); auto c_value_strings = c->get_value_strings();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" +
c_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) +
")->get_vector() = std::vector<" + c_element_type.c_type_string() + "::type>{";
for (size_t i = 0; i < c_value_strings.size(); i++) for (size_t i = 0; i < c_value_strings.size(); i++)
{ {
if (i) TU << outputs[0].get_tensor().get_name() << "[" << i << "] = static_cast<"
TU += ", "; << c_element_type.c_type_string() << ">(" << c_value_strings[i] << ");\n";
TU += c_value_strings[i];
} }
TU.indent--;
TU += "};\n }\n"; TU << "}\n";
} }
void Emitter::EMITTER_DECL(EmitReshape) void Emitter::EMITTER_DECL(EmitReshape)
...@@ -973,16 +877,15 @@ void Emitter::EMITTER_DECL(EmitReshape) ...@@ -973,16 +877,15 @@ void Emitter::EMITTER_DECL(EmitReshape)
// If there is no layout change or we are just going from 1^n to 1^m or a zero-size tensor, we can just copy. // If there is no layout change or we are just going from 1^n to 1^m or a zero-size tensor, we can just copy.
if (same_layout || result_shape_product < 2) if (same_layout || result_shape_product < 2)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 1\n";
TU += TU.indent++;
" {\n" TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
" call_frame->get_parameterized_tensor_view<" + << inputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(outputs.at(0).get_index()) + << outputs[0].get_tensor_view_layout()->get_size() *
")->get_vector() =\n" outputs[0].get_tensor_view_layout()->get_element_type().size()
" call_frame->get_parameterized_tensor_view<" + << ");\n";
result_element_type.c_type_string() + ">(" + to_string(inputs.at(0).get_index()) + TU.indent--;
")->get_vector();\n" TU << "}\n";
" }\n";
} }
// If there *is* a layout change in the 2D case, we transpose the input. // If there *is* a layout change in the 2D case, we transpose the input.
else if (arg_rank == 2) else if (arg_rank == 2)
...@@ -994,40 +897,31 @@ void Emitter::EMITTER_DECL(EmitReshape) ...@@ -994,40 +897,31 @@ void Emitter::EMITTER_DECL(EmitReshape)
// clang-format off // clang-format off
if (result_element_type == ngraph::element::Float32::element_type()) if (result_element_type == ngraph::element::Float32::element_type())
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 2\n";
TU += TU.indent++;
" {\n" TU << "mkl::MKL_Somatcopy('R', 'T', " << to_string(arg_shape[0]) << ",\n" <<
" auto arg0 = call_frame->get_tensor_view_data<" + result_element_type.c_type_string() + " " << to_string(arg_shape[1]) << ", 1.0f,\n" <<
">(" + to_string(inputs[0].get_index()) + ");\n" " " << inputs[0].get_tensor().get_name() << ", "
" auto out = call_frame->get_tensor_view_data<" + result_element_type.c_type_string() + << to_string(arg_shape[1]) << ",\n" <<
">(" + to_string(outputs[0].get_index()) + ");\n" " " << outputs[0].get_tensor().get_name()
" mkl::MKL_Somatcopy('R', 'T', " + to_string(arg_shape[0]) + ",\n" << ", " << to_string(arg_shape[0]) << ");\n";
" " + to_string(arg_shape[1]) + ", 1.0f,\n" TU.indent--;
" arg0, " + to_string(arg_shape[1]) + ",\n" TU << "}\n";
" out, " + to_string(arg_shape[0]) + ");\n"
" }\n";
} }
// clang-format on // clang-format on
else else
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 3\n";
TU += TU.indent++;
" {\n" TU << "EigenMatrix<" << result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) << ") =\n"
");\n" << " EigenMatrix<" << result_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").transpose();\n";
" EigenMatrix<" + TU.indent--;
result_element_type.c_type_string() + ">(out, " + TU << "}\n";
eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) +
") =\n"
" EigenMatrix<" +
result_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) +
").transpose();\n"
" }\n";
} }
} }
// Other cases (reordering of axes for tensors with rank>2) are not handled yet. // Other cases (reordering of axes for tensors with rank>2) are not handled yet.
...@@ -1130,16 +1024,23 @@ void Emitter::EMITTER_DECL(EmitReduce) ...@@ -1130,16 +1024,23 @@ void Emitter::EMITTER_DECL(EmitReduce)
// Trivial case: no reduction axes (this includes the scalar-reductee case). // Trivial case: no reduction axes (this includes the scalar-reductee case).
if (reduction_axes.empty()) if (reduction_axes.empty())
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 1\n";
TU += TU.indent++;
" {\n"
" call_frame->get_parameterized_tensor_view<" + TU << "// call_frame->get_parameterized_tensor_view<"
f_result_element_type.c_type_string() + ">(" + to_string(outputs.at(0).get_index()) + << f_result_element_type.c_type_string() << ">(" << to_string(outputs.at(0).get_index())
")->get_vector() =\n" << ")->get_vector() =\n"
" call_frame->get_parameterized_tensor_view<" + << "// call_frame->get_parameterized_tensor_view<"
f_result_element_type.c_type_string() + ">(" + to_string(inputs.at(0).get_index()) + << f_result_element_type.c_type_string() << ">(" << to_string(inputs.at(0).get_index())
")->get_vector();\n" << ")->get_vector();\n";
" }\n";
TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
<< inputs[0].get_tensor().get_name() << ", "
<< outputs[0].get_tensor_view_layout()->get_size() *
outputs[0].get_tensor_view_layout()->get_element_type().size()
<< ");\n";
TU.indent--;
TU << "}\n";
} }
// Behavior for zero-size axes bears some explanation here. XLA's reduce // Behavior for zero-size axes bears some explanation here. XLA's reduce
// operator provides an "base" element (usually, but not necessarily, // operator provides an "base" element (usually, but not necessarily,
...@@ -1171,17 +1072,15 @@ void Emitter::EMITTER_DECL(EmitReduce) ...@@ -1171,17 +1072,15 @@ void Emitter::EMITTER_DECL(EmitReduce)
{ {
if (reductee_shape.at(0) == 0 || (reductee_shape.size() == 2 && reductee_shape.at(1) == 0)) if (reductee_shape.at(0) == 0 || (reductee_shape.size() == 2 && reductee_shape.at(1) == 0))
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 2\n";
TU += TU.indent++;
" {\n" TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
" call_frame->get_parameterized_tensor_view<" + << inputs[1].get_tensor().get_name() << ", "
f_result_element_type.c_type_string() + ">(" + << outputs[0].get_tensor_view_layout()->get_size() *
to_string(outputs.at(0).get_index()) + outputs[0].get_tensor_view_layout()->get_element_type().size()
")->get_vector() =\n" << ");\n";
" call_frame->get_parameterized_tensor_view<" + TU.indent--;
f_result_element_type.c_type_string() + ">(" + to_string(inputs.at(1).get_index()) + TU << "}\n";
")->get_vector();\n"
" }\n";
} }
else else
{ {
...@@ -1189,64 +1088,44 @@ void Emitter::EMITTER_DECL(EmitReduce) ...@@ -1189,64 +1088,44 @@ void Emitter::EMITTER_DECL(EmitReduce)
std::dynamic_pointer_cast<CallFrame>(external->make_call_frame()); std::dynamic_pointer_cast<CallFrame>(external->make_call_frame());
ef->get_callees().emplace_back(cf); ef->get_callees().emplace_back(cf);
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 3\n";
TU += TU.indent++;
" {\n" string type = f_result_element_type.c_type_string();
" using ET = " + TU << "using ET = " << f_result_element_type.c_type_string() << ";\n"
f_result_element_type.c_type_string() + << "auto cf = callees.at(" << to_string(ef->get_callees().size() - 1) << ");\n"
";\n" << "auto f = [cf](" << type << " x, " << type << " y) -> " << type << " {\n"
" auto cf = callees.at(" + << " auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
to_string(ef->get_callees().size() - 1) + << " *tx = std::vector<" << type << ">({x});\n"
");\n" << " auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
" auto f = [cf](typename ET::type x, typename ET::type y) -> typename " << " *ty = std::vector<" << type << ">({y});\n"
"ET::type {\n" << " auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
" auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " (*cf)({tx, ty}, {tr});\n"
" *tx = std::vector<typename ET::type>({x});\n" << " return tr->get_vector()[0];\n"
" auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << "};\n"
" *ty = std::vector<typename ET::type>({y});\n" << "EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
" (*cf)({tx, ty}, {tr});\n" << ") =\n"
" return tr->get_vector()[0];\n" << " EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" };\n" << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
" auto arg0 = call_frame->get_tensor_view_data<" + << ").redux(f);\n";
f_result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + TU.indent--;
");\n" TU << "}\n";
" auto out = call_frame->get_tensor_view_data<" +
f_result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) +
");\n"
" EigenArray1d<" +
f_result_element_type.c_type_string() + ">(out, " +
eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
f_result_element_type.c_type_string() + ">(arg0, " +
eigen_vector_format(inputs[0]) +
").redux(f);\n"
" }\n";
} }
} }
else if (reductee_shape.size() == 2 && reduction_axes == AxisSet{1}) else if (reductee_shape.size() == 2 && reduction_axes == AxisSet{1})
{ {
if (reductee_shape.at(1) == 0) if (reductee_shape.at(1) == 0)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 4\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" auto arg1 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
f_result_element_type.c_type_string() + ">(" + to_string(inputs[1].get_index()) + << ") =\n"
");\n" << " EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[1].get_tensor().get_name() << ", " << eigen_vector_format(inputs[1])
f_result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << ")(0, 0);\n";
");\n" TU.indent--;
" EigenArray1d<" + TU << "}\n";
f_result_element_type.c_type_string() + ">(out, " +
eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
f_result_element_type.c_type_string() + ">(arg1, " +
eigen_vector_format(inputs[1]) +
")(0, 0);\n"
" }\n";
} }
else else
{ {
...@@ -1254,64 +1133,46 @@ void Emitter::EMITTER_DECL(EmitReduce) ...@@ -1254,64 +1133,46 @@ void Emitter::EMITTER_DECL(EmitReduce)
std::dynamic_pointer_cast<CallFrame>(external->make_call_frame()); std::dynamic_pointer_cast<CallFrame>(external->make_call_frame());
ef->get_callees().emplace_back(cf); ef->get_callees().emplace_back(cf);
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 5\n";
TU += TU.indent++;
" {\n" TU << "using ET = " << f_result_element_type.c_type_string() << ";\n"
" using ET = " + << " auto cf = callees.at(" << to_string(ef->get_callees().size() - 1)
f_result_element_type.c_type_string() + << ");\n"
";\n" << " auto f = [cf](typename ET::type x, typename ET::type y) -> typename "
" auto cf = callees.at(" + << "ET::type {\n"
to_string(ef->get_callees().size() - 1) + << " auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
");\n" << " *tx = std::vector<typename ET::type>({x});\n"
" auto f = [cf](typename ET::type x, typename ET::type y) -> typename " << " auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
"ET::type {\n" << " *ty = std::vector<typename ET::type>({y});\n"
" auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
" *tx = std::vector<typename ET::type>({x});\n" << " (*cf)({tx, ty}, {tr});\n"
" auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " return tr->get_vector()[0];\n"
" *ty = std::vector<typename ET::type>({y});\n" << " };\n"
" auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << "EigenVector<" << f_result_element_type.c_type_string() << ">("
" (*cf)({tx, ty}, {tr});\n" << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
" return tr->get_vector()[0];\n" << ") =\n"
" };\n" << " EigenMatrix<" << f_result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
f_result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").rowwise().redux(f);\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
f_result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenVector<" +
f_result_element_type.c_type_string() + ">(out, " +
eigen_vector_format(outputs[0]) +
") =\n"
" EigenMatrix<" +
f_result_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) +
").rowwise().redux(f);\n"
" }\n";
} }
} }
else if (reductee_shape.size() == 2 && reduction_axes == AxisSet{0}) else if (reductee_shape.size() == 2 && reduction_axes == AxisSet{0})
{ {
if (reductee_shape.at(0) == 0) if (reductee_shape.at(0) == 0)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 6\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" auto arg1 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
f_result_element_type.c_type_string() + ">(" + to_string(inputs[1].get_index()) + << ") =\n"
");\n" << " EigenArray1d<" << f_result_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[1].get_tensor().get_name() << ", " << eigen_vector_format(inputs[1])
f_result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << ")(0, 0);\n";
");\n" TU.indent--;
" EigenArray1d<" + TU << "}\n";
f_result_element_type.c_type_string() + ">(out, " +
eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
f_result_element_type.c_type_string() + ">(arg1, " +
eigen_vector_format(inputs[1]) +
")(0, 0);\n"
" }\n";
} }
else else
{ {
...@@ -1319,40 +1180,30 @@ void Emitter::EMITTER_DECL(EmitReduce) ...@@ -1319,40 +1180,30 @@ void Emitter::EMITTER_DECL(EmitReduce)
std::dynamic_pointer_cast<CallFrame>(external->make_call_frame()); std::dynamic_pointer_cast<CallFrame>(external->make_call_frame());
ef->get_callees().emplace_back(cf); ef->get_callees().emplace_back(cf);
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 7\n";
TU += TU.indent++;
" {\n" TU << " using ET = " << f_result_element_type.c_type_string() << ";\n"
" using ET = " + << " auto cf = callees.at(" << to_string(ef->get_callees().size() - 1)
f_result_element_type.c_type_string() + << ");\n"
";\n" << " auto f = [cf](typename ET::type x, typename ET::type y) -> typename "
" auto cf = callees.at(" + << "ET::type {\n"
to_string(ef->get_callees().size() - 1) + << " auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
");\n" << " *tx = std::vector<typename ET::type>({x});\n"
" auto f = [cf](typename ET::type x, typename ET::type y) -> typename " << " auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
"ET::type {\n" << " *ty = std::vector<typename ET::type>({y});\n"
" auto tx = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n"
" *tx = std::vector<typename ET::type>({x});\n" << " (*cf)({tx, ty}, {tr});\n"
" auto ty = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " return tr->get_vector()[0];\n"
" *ty = std::vector<typename ET::type>({y});\n" << " };\n"
" auto tr = ngraph::runtime::make_tensor<ET>(ngraph::Shape{});\n" << " EigenVector<" << f_result_element_type.c_type_string() << ">("
" (*cf)({tx, ty}, {tr});\n" << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
" return tr->get_vector()[0];\n" << ") =\n"
" };\n" << " EigenMatrix<" << f_result_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
f_result_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").colwise().redux(f);\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
f_result_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenVector<" +
f_result_element_type.c_type_string() + ">(out, " +
eigen_vector_format(outputs[0]) +
") =\n"
" EigenMatrix<" +
f_result_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) +
").colwise().redux(f);\n"
" }\n";
} }
} }
else else
...@@ -1368,21 +1219,13 @@ void Emitter::EMITTER_DECL(EmitSign) ...@@ -1368,21 +1219,13 @@ void Emitter::EMITTER_DECL(EmitSign)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").sign();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").sign();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitSlice) void Emitter::EMITTER_DECL(EmitSlice)
...@@ -1410,69 +1253,50 @@ void Emitter::EMITTER_DECL(EmitSlice) ...@@ -1410,69 +1253,50 @@ void Emitter::EMITTER_DECL(EmitSlice)
// Scalar slice is necessarily just a copy. // Scalar slice is necessarily just a copy.
if (arg_rank == 0) if (arg_rank == 0)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 1\n";
TU += TU.indent++;
" {\n" TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
" call_frame->get_parameterized_tensor_view<" + << inputs[0].get_tensor().get_name() << ", "
arg_element_type.c_type_string() + ">(" + to_string(outputs.at(0).get_index()) + << outputs[0].get_tensor_view_layout()->get_size() *
")->get_vector() =\n" outputs[0].get_tensor_view_layout()->get_element_type().size()
" call_frame->get_parameterized_tensor_view<" + << ");\n";
arg_element_type.c_type_string() + ">(" + to_string(inputs.at(0).get_index()) + TU.indent--;
")->get_vector();\n" TU << "}\n";
" }\n";
} }
else if (arg_rank == 1) else if (arg_rank == 1)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 2\n";
TU += TU.indent++;
" {\n" TU << "EigenVector<" << arg_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
arg_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << ") =\n"
");\n" << " EigenVector<" << arg_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
arg_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << ").segment(\n"
");\n" << " " << to_string(lower_bounds[0]) << ", "
" EigenVector<" + << to_string(upper_bounds[0] - lower_bounds[0]) << ");\n";
arg_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) + TU.indent--;
") =\n" TU << "}\n";
" EigenVector<" +
arg_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").segment(\n"
" " +
to_string(lower_bounds[0]) + ", " + to_string(upper_bounds[0] - lower_bounds[0]) +
");\n"
" }\n";
} }
else if (arg_rank == 2) else if (arg_rank == 2)
{ {
auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>(); auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>();
auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>(); auto out_layout = outputs[0].get_layout<DenseTensorViewLayout>();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << " 3\n";
TU += TU.indent++;
" {\n" TU << "EigenMatrix<" << arg_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", "
arg_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) << ") = \n"
");\n" << " EigenMatrix<" << arg_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
arg_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").block(" << to_string(lower_bounds[0]) << ", " << to_string(lower_bounds[1])
" EigenMatrix<" + << ",\n"
arg_element_type.c_type_string() + ">(out, " + << " " << to_string(upper_bounds[0] - lower_bounds[0]) << ",\n"
eigen_matrix_format(out_layout->get_shape(), out_layout->get_strides()) + << " " << to_string(upper_bounds[1] - lower_bounds[1]) << ");\n";
") = \n" TU.indent--;
" EigenMatrix<" + TU << "}\n";
arg_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) + ").block(" +
to_string(lower_bounds[0]) + ", " + to_string(lower_bounds[1]) +
",\n"
" " +
to_string(upper_bounds[0] - lower_bounds[0]) +
",\n"
" " +
to_string(upper_bounds[1] - lower_bounds[1]) +
");\n"
" }\n";
} }
// Other cases (reordering of axes for tensors with rank>2) are not handled yet. // Other cases (reordering of axes for tensors with rank>2) are not handled yet.
else else
...@@ -1502,80 +1326,61 @@ void Emitter::EMITTER_DECL(EmitSum) ...@@ -1502,80 +1326,61 @@ void Emitter::EMITTER_DECL(EmitSum)
if (reduction_axes.size() == 0) if (reduction_axes.size() == 0)
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "memcpy(" << outputs[0].get_tensor().get_name() << ", "
" call_frame->get_parameterized_tensor_view<" + << inputs[0].get_tensor().get_name() << ", "
s_element_type.c_type_string() + ">(" + to_string(outputs.at(0).get_index()) + << outputs[0].get_tensor_view_layout()->get_size() *
")->get_vector() =\n" outputs[0].get_tensor_view_layout()->get_element_type().size()
" call_frame->get_parameterized_tensor_view<" + << ");\n";
s_element_type.c_type_string() + ">(" + to_string(inputs.at(0).get_index()) + TU.indent--;
")->get_vector();\n" TU << "}\n";
" }\n";
} }
// Full reduction? Then sum to scalar. // Full reduction? Then sum to scalar.
else if ((arg_rank == 1 && reduction_axes == AxisSet{0}) || else if ((arg_rank == 1 && reduction_axes == AxisSet{0}) ||
(arg_rank == 2 && reduction_axes == AxisSet{0, 1})) (arg_rank == 2 && reduction_axes == AxisSet{0, 1}))
{ {
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << s_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
s_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << ") =\n"
");\n" << " EigenArray1d<" << s_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", " << eigen_vector_format(inputs[0])
s_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << ").sum();\n";
");\n" TU.indent--;
" EigenArray1d<" + TU << "}\n";
s_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
s_element_type.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").sum();\n"
" }\n";
} }
else if (arg_rank == 2 && reduction_axes == AxisSet{1}) else if (arg_rank == 2 && reduction_axes == AxisSet{1})
{ {
auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>(); auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenVector<" << s_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
s_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << ") =\n"
");\n" << " EigenMatrix<" << s_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
s_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").rowwise().sum();\n";
" EigenVector<" + TU.indent--;
s_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) + TU << "}\n";
") =\n"
" EigenMatrix<" +
s_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) +
").rowwise().sum();\n"
" }\n";
} }
else if (arg_rank == 2 && reduction_axes == AxisSet{0}) else if (arg_rank == 2 && reduction_axes == AxisSet{0})
{ {
auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>(); auto arg0_layout = inputs[0].get_layout<DenseTensorViewLayout>();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenVector<" << s_element_type.c_type_string() << ">("
" auto arg0 = call_frame->get_tensor_view_data<" + << outputs[0].get_tensor().get_name() << ", " << eigen_vector_format(outputs[0])
s_element_type.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << ") =\n"
");\n" << " EigenMatrix<" << s_element_type.c_type_string() << ">("
" auto out = call_frame->get_tensor_view_data<" + << inputs[0].get_tensor().get_name() << ", "
s_element_type.c_type_string() + ">(" + to_string(outputs[0].get_index()) + << eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides())
");\n" << ").colwise().sum();\n";
" EigenVector<" + TU.indent--;
s_element_type.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) + TU << "}\n";
") =\n"
" EigenMatrix<" +
s_element_type.c_type_string() + ">(arg0, " +
eigen_matrix_format(arg0_layout->get_shape(), arg0_layout->get_strides()) +
").colwise().sum();\n"
" }\n";
} }
else else
{ {
...@@ -1590,21 +1395,13 @@ void Emitter::EMITTER_DECL(EmitExp) ...@@ -1590,21 +1395,13 @@ void Emitter::EMITTER_DECL(EmitExp)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").exp();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").exp();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitSin) void Emitter::EMITTER_DECL(EmitSin)
...@@ -1614,21 +1411,13 @@ void Emitter::EMITTER_DECL(EmitSin) ...@@ -1614,21 +1411,13 @@ void Emitter::EMITTER_DECL(EmitSin)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").sin();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").sin();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitSinh) void Emitter::EMITTER_DECL(EmitSinh)
...@@ -1638,21 +1427,13 @@ void Emitter::EMITTER_DECL(EmitSinh) ...@@ -1638,21 +1427,13 @@ void Emitter::EMITTER_DECL(EmitSinh)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").sinh();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").sinh();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitCos) void Emitter::EMITTER_DECL(EmitCos)
...@@ -1662,21 +1443,13 @@ void Emitter::EMITTER_DECL(EmitCos) ...@@ -1662,21 +1443,13 @@ void Emitter::EMITTER_DECL(EmitCos)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").cos();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").cos();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitCosh) void Emitter::EMITTER_DECL(EmitCosh)
...@@ -1686,21 +1459,13 @@ void Emitter::EMITTER_DECL(EmitCosh) ...@@ -1686,21 +1459,13 @@ void Emitter::EMITTER_DECL(EmitCosh)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").cosh();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").cosh();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitTan) void Emitter::EMITTER_DECL(EmitTan)
...@@ -1710,46 +1475,30 @@ void Emitter::EMITTER_DECL(EmitTan) ...@@ -1710,46 +1475,30 @@ void Emitter::EMITTER_DECL(EmitTan)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").tan();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").tan();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitTanh) void Emitter::EMITTER_DECL(EmitTanh)
{ {
const element::Type& et =
(dynamic_pointer_cast<const TensorViewType>(n->get_arguments().at(0)->get_value_type()))
->get_element_type();
// Eigen's generic_fast_tanh_float<float> is currently miscompiled by Clang/LLVM // Eigen's generic_fast_tanh_float<float> is currently miscompiled by Clang/LLVM
// so we fall-back to std::tanh // so we fall-back to std::tanh
// TODO: Implement our own internal fast/approximate tanh if this actually gets used // TODO: Implement our own internal fast/approximate tanh if this actually gets used
// by models // by models
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "for (size_t i=0; i<" << outputs[0].get_tensor_view_layout()->get_size() << "; i++)\n";
" auto& arg0 = call_frame->get_parameterized_tensor_view<" + TU << "{\n";
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + TU << " " << outputs[0].get_tensor().get_name() << "[i] = std::tanh("
")->get_vector();\n" << inputs[0].get_tensor().get_name() << "[i]);\n";
" auto& out = call_frame->get_parameterized_tensor_view<" + TU << "}\n";
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU.indent--;
")->get_vector();\n" TU << "}\n";
" std::transform(arg0.begin(), arg0.end(), out.begin(), [](" +
et.c_type_string() + "::type x) -> " + et.c_type_string() +
"::type { return std::tanh(x); });\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitAsin) void Emitter::EMITTER_DECL(EmitAsin)
...@@ -1759,21 +1508,13 @@ void Emitter::EMITTER_DECL(EmitAsin) ...@@ -1759,21 +1508,13 @@ void Emitter::EMITTER_DECL(EmitAsin)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").asin();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").asin();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitAcos) void Emitter::EMITTER_DECL(EmitAcos)
...@@ -1783,21 +1524,13 @@ void Emitter::EMITTER_DECL(EmitAcos) ...@@ -1783,21 +1524,13 @@ void Emitter::EMITTER_DECL(EmitAcos)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").acos();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").acos();\n"
" }\n";
} }
void Emitter::EMITTER_DECL(EmitAtan) void Emitter::EMITTER_DECL(EmitAtan)
...@@ -1807,19 +1540,11 @@ void Emitter::EMITTER_DECL(EmitAtan) ...@@ -1807,19 +1540,11 @@ void Emitter::EMITTER_DECL(EmitAtan)
->get_element_type(); ->get_element_type();
TU << "{ // " << n->get_name() << "\n"; TU << "{ // " << n->get_name() << "\n";
TU += TU.indent++;
" {\n" TU << "EigenArray1d<" << et.c_type_string() << ">(" << outputs[0].get_tensor().get_name()
" auto arg0 = call_frame->get_tensor_view_data<" + << ", " << eigen_vector_format(outputs[0]) << ") =\n"
et.c_type_string() + ">(" + to_string(inputs[0].get_index()) + << " EigenArray1d<" << et.c_type_string() << ">(" << inputs[0].get_tensor().get_name()
");\n" << ", " << eigen_vector_format(inputs[0]) << ").atan();\n";
" auto out = call_frame->get_tensor_view_data<" + TU.indent--;
et.c_type_string() + ">(" + to_string(outputs[0].get_index()) + TU << "}\n";
");\n"
" EigenArray1d<" +
et.c_type_string() + ">(out, " + eigen_vector_format(outputs[0]) +
") =\n"
" EigenArray1d<" +
et.c_type_string() + ">(arg0, " + eigen_vector_format(inputs[0]) +
").atan();\n"
" }\n";
} }
...@@ -371,7 +371,10 @@ extern "C" void free_aligned_buffer(void* allocated); ...@@ -371,7 +371,10 @@ extern "C" void free_aligned_buffer(void* allocated);
#endif #endif
auto llvm_module = estate.compile(code, "__ngcpu_codegen.cpp"); auto llvm_module = estate.compile(code, "__ngcpu_codegen.cpp");
assert(llvm_module); if (llvm_module == nullptr)
{
throw runtime_error("function failed to compile");
}
estate.add_module(llvm_module); estate.add_module(llvm_module);
estate.finalize(); estate.finalize();
m_compiled_function = estate.find_function<EntryPoint_t>(function_name); m_compiled_function = estate.find_function<EntryPoint_t>(function_name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment