1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 23:33:05 +04:00

add eltwise layer ocl implementation

Signed-off-by: Li Peng <peng.li@intel.com>
This commit is contained in:
Li Peng
2018-01-04 02:21:04 +08:00
parent 16821b877c
commit f99a135eda
3 changed files with 81 additions and 16 deletions
+52
View File
@@ -259,11 +259,63 @@ public:
}
};
#ifdef HAVE_OPENCL
bool forward_ocl(InputArrayOfArrays inputs_, OutputArrayOfArrays outputs_, OutputArrayOfArrays internals_)
{
std::vector<UMat> inputs;
std::vector<UMat> outputs;
inputs_.getUMatVector(inputs);
outputs_.getUMatVector(outputs);
switch (op)
{
case SUM:
if (coeffs.empty())
{
add(inputs[0], inputs[1], outputs[0]);
for (int i = 2; i < inputs.size(); ++i)
add(outputs[0], inputs[i], outputs[0]);
}
else
{
UMat mul0, mul1;
multiply(coeffs[0], inputs[0], mul0);
multiply(coeffs[1], inputs[1], mul1);
add(mul0, mul1, outputs[0]);
for (int i = 2; i < inputs.size(); ++i)
{
multiply(coeffs[i], inputs[i], mul0);
add(mul0, outputs[0], outputs[0]);
}
}
break;
case PROD:
multiply(inputs[0], inputs[1], outputs[0]);
for (int i = 2; i < inputs.size(); ++i)
multiply(inputs[i], outputs[0], outputs[0]);
break;
case MAX:
max(inputs[0], inputs[1], outputs[0]);
for (int i = 2; i < inputs.size(); ++i)
max(inputs[i], outputs[0], outputs[0]);
break;
default:
return false;
}
return true;
}
#endif
void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr)
{
CV_TRACE_FUNCTION();
CV_TRACE_ARG_VALUE(name, "name", name.c_str());
CV_OCL_RUN((preferableTarget == DNN_TARGET_OPENCL) &&
OCL_PERFORMANCE_CHECK(ocl::Device::getDefault().isIntel()),
forward_ocl(inputs_arr, outputs_arr, internals_arr))
Layer::forward_fallback(inputs_arr, outputs_arr, internals_arr);
}