1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 5484543d1Sopenharmony_ci * You may obtain a copy of the License at 6484543d1Sopenharmony_ci * 7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 13484543d1Sopenharmony_ci * limitations under the License. 14484543d1Sopenharmony_ci */ 15484543d1Sopenharmony_ci 16484543d1Sopenharmony_ci#include "ffrt_inner.h" 17484543d1Sopenharmony_ci#include "common.h" 18484543d1Sopenharmony_ci 19484543d1Sopenharmony_ciusing namespace ffrt; 20484543d1Sopenharmony_civoid Fib(int x, int& y) 21484543d1Sopenharmony_ci{ 22484543d1Sopenharmony_ci if (x <= 1) { 23484543d1Sopenharmony_ci y = x; 24484543d1Sopenharmony_ci } else { 25484543d1Sopenharmony_ci int y1; 26484543d1Sopenharmony_ci int y2; 27484543d1Sopenharmony_ci Fib(x - 1, y1); 28484543d1Sopenharmony_ci Fib(x - 2, y2); 29484543d1Sopenharmony_ci y = y1 + y2; 30484543d1Sopenharmony_ci } 31484543d1Sopenharmony_ci simulate_task_compute_time(COMPUTE_TIME_US); 32484543d1Sopenharmony_ci} 33484543d1Sopenharmony_ci 34484543d1Sopenharmony_civoid FibFFRTChildWait(int x, int& y) 35484543d1Sopenharmony_ci{ 36484543d1Sopenharmony_ci if (x <= 1) { 37484543d1Sopenharmony_ci y = x; 38484543d1Sopenharmony_ci } else { 39484543d1Sopenharmony_ci int y1; 40484543d1Sopenharmony_ci int y2; 41484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTChildWait(x - 1, y1); }, {}, {}); 42484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTChildWait(x - 2, y2); }, {}, {}); 43484543d1Sopenharmony_ci ffrt::wait(); 44484543d1Sopenharmony_ci y = y1 + y2; 45484543d1Sopenharmony_ci } 46484543d1Sopenharmony_ci simulate_task_compute_time(COMPUTE_TIME_US); 47484543d1Sopenharmony_ci} 48484543d1Sopenharmony_ci 49484543d1Sopenharmony_civoid FibFFRTDataWait(int x, int& y) 50484543d1Sopenharmony_ci{ 51484543d1Sopenharmony_ci if (x <= 1) { 52484543d1Sopenharmony_ci y = x; 53484543d1Sopenharmony_ci } else { 54484543d1Sopenharmony_ci int y1; 55484543d1Sopenharmony_ci int y2; 56484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTDataWait(x - 1, y1); }, {}, {&y1}); 57484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTDataWait(x - 2, y2); }, {}, {&y2}); 58484543d1Sopenharmony_ci ffrt::wait({&y1, &y2}); 59484543d1Sopenharmony_ci y = y1 + y2; 60484543d1Sopenharmony_ci } 61484543d1Sopenharmony_ci simulate_task_compute_time(COMPUTE_TIME_US); 62484543d1Sopenharmony_ci} 63484543d1Sopenharmony_ci 64484543d1Sopenharmony_civoid FibDataWait() 65484543d1Sopenharmony_ci{ 66484543d1Sopenharmony_ci PreHotFFRT(); 67484543d1Sopenharmony_ci 68484543d1Sopenharmony_ci int output; 69484543d1Sopenharmony_ci 70484543d1Sopenharmony_ci { 71484543d1Sopenharmony_ci int expect; 72484543d1Sopenharmony_ci Fib(FIB_NUM, expect); 73484543d1Sopenharmony_ci } 74484543d1Sopenharmony_ci 75484543d1Sopenharmony_ci TIME_BEGIN(t); 76484543d1Sopenharmony_ci for (uint64_t i = 0; i < REPEAT; ++i) { 77484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTDataWait(FIB_NUM, output); }, {}, {&output}); 78484543d1Sopenharmony_ci ffrt::wait({&output}); 79484543d1Sopenharmony_ci } 80484543d1Sopenharmony_ci TIME_END_INFO(t, "fib_data_wait"); 81484543d1Sopenharmony_ci} 82484543d1Sopenharmony_ci 83484543d1Sopenharmony_civoid FibFFRTNoWait(int x, int* y) 84484543d1Sopenharmony_ci{ 85484543d1Sopenharmony_ci if (x <= 1) { 86484543d1Sopenharmony_ci *y = x; 87484543d1Sopenharmony_ci } else { 88484543d1Sopenharmony_ci int *y1, *y2; 89484543d1Sopenharmony_ci y1 = reinterpret_cast<int *>(malloc(sizeof(int))); 90484543d1Sopenharmony_ci y2 = reinterpret_cast<int *>(malloc(sizeof(int))); 91484543d1Sopenharmony_ci ffrt::submit([=]() { FibFFRTNoWait(x - 1, y1); }, {}, {y1}); 92484543d1Sopenharmony_ci ffrt::submit([=]() { FibFFRTNoWait(x - 2, y2); }, {}, {y2}); 93484543d1Sopenharmony_ci ffrt::submit( 94484543d1Sopenharmony_ci [=]() { 95484543d1Sopenharmony_ci *y = *y1 + *y2; 96484543d1Sopenharmony_ci free(y1); 97484543d1Sopenharmony_ci free(y2); 98484543d1Sopenharmony_ci }, 99484543d1Sopenharmony_ci {y1, y2}, {y}); 100484543d1Sopenharmony_ci } 101484543d1Sopenharmony_ci simulate_task_compute_time(COMPUTE_TIME_US); 102484543d1Sopenharmony_ci} 103484543d1Sopenharmony_ci 104484543d1Sopenharmony_civoid FibNoWait() 105484543d1Sopenharmony_ci{ 106484543d1Sopenharmony_ci PreHotFFRT(); 107484543d1Sopenharmony_ci 108484543d1Sopenharmony_ci int output; 109484543d1Sopenharmony_ci 110484543d1Sopenharmony_ci { 111484543d1Sopenharmony_ci int expect; 112484543d1Sopenharmony_ci Fib(FIB_NUM, expect); 113484543d1Sopenharmony_ci } 114484543d1Sopenharmony_ci 115484543d1Sopenharmony_ci TIME_BEGIN(t); 116484543d1Sopenharmony_ci for (uint64_t i = 0; i < REPEAT; ++i) { 117484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTNoWait(FIB_NUM, &output); }, {}, {&output}); 118484543d1Sopenharmony_ci ffrt::wait({&output}); 119484543d1Sopenharmony_ci } 120484543d1Sopenharmony_ci TIME_END_INFO(t, "fib_no_wait"); 121484543d1Sopenharmony_ci} 122484543d1Sopenharmony_ci 123484543d1Sopenharmony_civoid FibChildWait() 124484543d1Sopenharmony_ci{ 125484543d1Sopenharmony_ci PreHotFFRT(); 126484543d1Sopenharmony_ci 127484543d1Sopenharmony_ci int output; 128484543d1Sopenharmony_ci { 129484543d1Sopenharmony_ci int expect; 130484543d1Sopenharmony_ci Fib(FIB_NUM, expect); 131484543d1Sopenharmony_ci } 132484543d1Sopenharmony_ci 133484543d1Sopenharmony_ci TIME_BEGIN(t); 134484543d1Sopenharmony_ci for (uint64_t i = 0; i < REPEAT; ++i) { 135484543d1Sopenharmony_ci ffrt::submit([&]() { FibFFRTChildWait(FIB_NUM, output); }, {}, {&output}); 136484543d1Sopenharmony_ci ffrt::wait({&output}); 137484543d1Sopenharmony_ci } 138484543d1Sopenharmony_ci TIME_END_INFO(t, "fib_child_wait"); 139484543d1Sopenharmony_ci} 140484543d1Sopenharmony_ci 141484543d1Sopenharmony_ciint main() 142484543d1Sopenharmony_ci{ 143484543d1Sopenharmony_ci GetEnvs(); 144484543d1Sopenharmony_ci FibDataWait(); 145484543d1Sopenharmony_ci FibChildWait(); 146484543d1Sopenharmony_ci FibNoWait(); 147484543d1Sopenharmony_ci}