2021-03-12 18:41:50 +08:00
|
|
|
//
|
|
|
|
// CommonExecution.cpp
|
|
|
|
// MNN
|
|
|
|
//
|
|
|
|
// Created by MNN on 2019/02/28.
|
|
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "backend/opencl/execution/image/CommonExecution.hpp"
|
|
|
|
namespace MNN {
|
|
|
|
namespace OpenCL {
|
|
|
|
|
2023-05-18 19:11:50 +08:00
|
|
|
CommonExecution::CommonExecution(Backend *backend, const MNN::Op *Op)
|
|
|
|
: Execution(backend), mOp(Op) {
|
|
|
|
mOpType = Op->type();
|
2021-03-12 18:41:50 +08:00
|
|
|
}
|
2024-04-19 11:58:21 +08:00
|
|
|
|
|
|
|
ErrorCode CommonExecution::onResize(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &outputs){
|
|
|
|
auto openCLBackend = static_cast<OpenCLBackend*>(backend());
|
|
|
|
auto runtime = openCLBackend->getOpenCLRuntime();
|
|
|
|
openCLBackend->startRecord(mRecording);
|
|
|
|
|
|
|
|
auto error = onEncode(inputs, outputs);
|
|
|
|
if(NO_ERROR != error){
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto &unit : mUnits) {
|
|
|
|
bool lws_null = true;
|
|
|
|
for (size_t i = 0; i < unit.globalWorkSize.dimensions(); ++i) {
|
|
|
|
unit.globalWorkSize.get()[i] = ROUND_UP(unit.globalWorkSize.get()[i], std::max((size_t)1, unit.localWorkSize.get()[i]));
|
|
|
|
if(unit.localWorkSize.get()[i] != 0) {
|
|
|
|
lws_null = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(lws_null){
|
|
|
|
unit.localWorkSize = cl::NullRange;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
openCLBackend->endRecord(mRecording);
|
|
|
|
return NO_ERROR;
|
|
|
|
}
|
|
|
|
|
2021-03-12 18:41:50 +08:00
|
|
|
ErrorCode CommonExecution::onExecute(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &outputs) {
|
2023-12-27 17:26:44 +08:00
|
|
|
auto openCLBackend = static_cast<OpenCLBackend*>(backend());
|
|
|
|
auto runtime = openCLBackend->getOpenCLRuntime();
|
2021-03-12 18:41:50 +08:00
|
|
|
#ifdef ENABLE_OPENCL_TIME_PROFILER
|
|
|
|
int idx = 0;
|
2023-06-16 09:42:45 +08:00
|
|
|
#else
|
2023-12-27 17:26:44 +08:00
|
|
|
if(openCLBackend->isUseRecordQueue()){
|
2024-05-11 19:17:02 +08:00
|
|
|
openCLBackend->addRecord(mRecording, mOpRecordUpdateInfo);
|
2023-06-16 09:42:45 +08:00
|
|
|
return NO_ERROR;
|
|
|
|
}
|
2021-03-12 18:41:50 +08:00
|
|
|
#endif
|
|
|
|
auto res = CL_SUCCESS;
|
|
|
|
for (auto &unit : mUnits) {
|
|
|
|
#ifdef ENABLE_OPENCL_TIME_PROFILER
|
|
|
|
cl::Event event;
|
2024-04-19 11:58:21 +08:00
|
|
|
res = runtime->commandQueue().enqueueNDRangeKernel(unit.kernel->get(),
|
|
|
|
cl::NullRange,
|
|
|
|
unit.globalWorkSize,
|
|
|
|
unit.localWorkSize,
|
|
|
|
nullptr,
|
|
|
|
&event);
|
2023-08-31 15:31:45 +08:00
|
|
|
runtime->pushEvent({EnumNameOpType(mOpType) + std::to_string(idx++), event});
|
2021-03-12 18:41:50 +08:00
|
|
|
#else
|
2024-04-19 11:58:21 +08:00
|
|
|
res = runtime->commandQueue().enqueueNDRangeKernel(unit.kernel->get(),
|
|
|
|
cl::NullRange,
|
|
|
|
unit.globalWorkSize,
|
|
|
|
unit.localWorkSize);
|
2021-03-12 18:41:50 +08:00
|
|
|
#endif
|
|
|
|
MNN_CHECK_CL_SUCCESS(res, EnumNameOpType(mOp->type()));
|
|
|
|
}
|
|
|
|
return NO_ERROR;
|
|
|
|
}
|
|
|
|
} // namespace OpenCL
|
|
|
|
}; // namespace MNN
|