| 54 | } |
| 55 | |
| 56 | ClSplitterWorkload::ClSplitterWorkload(const SplitterQueueDescriptor& descriptor, |
| 57 | const WorkloadInfo& info, |
| 58 | const arm_compute::CLCompileContext&) |
| 59 | : ClBaseWorkload<SplitterQueueDescriptor>(descriptor, info) |
| 60 | { |
| 61 | // Report Profiling Details |
| 62 | ARMNN_REPORT_PROFILING_WORKLOAD_DESC("ClSplitterWorkload_Construct", |
| 63 | descriptor.m_Parameters, |
| 64 | info, |
| 65 | this->GetGuid()); |
| 66 | bool allOutputsAreSubtensors = true; |
| 67 | |
| 68 | // Check that all outputs are sub-tensors |
| 69 | for (auto output : m_Data.m_Outputs) |
| 70 | { |
| 71 | if (output && !output->GetParent()) |
| 72 | { |
| 73 | // Non sub-tensor input found so we need to execute the split function |
| 74 | allOutputsAreSubtensors = false; |
| 75 | break; |
| 76 | } |
| 77 | } |
| 78 | |
| 79 | if (allOutputsAreSubtensors) |
| 80 | { |
| 81 | // Can skip configuring the split function since it's not executed |
| 82 | return; |
| 83 | } |
| 84 | |
| 85 | arm_compute::ICLTensor& input = armnn::PolymorphicPointerDowncast<IClTensorHandle>( |
| 86 | m_Data.m_Inputs[0])->GetTensor(); |
| 87 | |
| 88 | std::vector<arm_compute::ICLTensor *> aclOutputs; |
| 89 | for (auto output : m_Data.m_Outputs) |
| 90 | { |
| 91 | arm_compute::ICLTensor& aclOutput = armnn::PolymorphicPointerDowncast<IClTensorHandle>(output)->GetTensor(); |
| 92 | aclOutputs.emplace_back(&aclOutput); |
| 93 | } |
| 94 | |
| 95 | // Create the layer function |
| 96 | |
| 97 | // Configure input and output tensors |
| 98 | std::set<unsigned int> splitAxis = ComputeSplitAxis(descriptor.m_Parameters, m_Data.m_Inputs[0]->GetShape()); |
| 99 | if (splitAxis.size() != 1) |
| 100 | { |
| 101 | throw InvalidArgumentException("Cannot derive split axis from SplitterDescriptor"); |
| 102 | } |
| 103 | |
| 104 | unsigned int aclAxis = CalcAclAxis(descriptor.m_Parameters.GetNumDimensions(), *splitAxis.begin()); |
| 105 | auto layer = std::make_unique<arm_compute::CLSplit>(); |
| 106 | { |
| 107 | ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID("ClSplitterWorkload_configure"); |
| 108 | layer->configure(&input, aclOutputs, aclAxis); |
| 109 | } |
| 110 | |
| 111 | // Prepare |
| 112 | layer->prepare(); |
| 113 |
nothing calls this directly
no test coverage detected