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}