Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AddAwaitableTask #40770

Merged
merged 91 commits into from
Mar 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
8744ba7
add align for WorkQueue
liutiexing Sep 22, 2021
4759bc8
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
liutiexing Sep 22, 2021
6f00ace
add spinlock
liutiexing Sep 23, 2021
2d6f1cf
merge develop
liutiexing Sep 23, 2021
f5099be
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
liutiexing Sep 26, 2021
54aa332
merge develop
liutiexing Oct 12, 2021
1d1bd82
merge
liutiexing Oct 12, 2021
dfbf3e4
Merge remote-tracking branch 'upstream/develop' into develop
liutiexing Oct 12, 2021
a5392b3
Merge remote-tracking branch 'upstream/develop' into develop
liutiexing Oct 14, 2021
e206173
Add EventsWaiter
liutiexing Oct 15, 2021
0a3dcd9
Revert "Add EventsWaiter"
liutiexing Oct 15, 2021
4689bb5
Merge remote-tracking branch 'upstream/develop' into develop
liutiexing Oct 15, 2021
0cec99a
Merge remote-tracking branch 'upstream/develop' into develop
liutiexing Oct 20, 2021
481c4fa
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Oct 27, 2021
83db84e
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Oct 29, 2021
7010e0d
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Nov 16, 2021
ec2a363
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Nov 23, 2021
90a59ec
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Nov 26, 2021
1445bbe
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Nov 29, 2021
a2c74ab
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 1, 2021
1c09b4e
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 2, 2021
cb8cf7d
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 8, 2021
cf0dcd6
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 8, 2021
2f95801
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 14, 2021
14bec1b
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 15, 2021
8a5f7af
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 16, 2021
f0a5915
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 20, 2021
0fe35aa
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 21, 2021
f65eef2
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 23, 2021
b37e42d
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 28, 2021
cf5e240
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 29, 2021
b31869a
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Dec 30, 2021
fab2911
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 4, 2022
16b0903
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 6, 2022
074fea5
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 7, 2022
8f4a51c
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 8, 2022
09036ff
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 10, 2022
0e6a94f
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 13, 2022
d2293fd
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 14, 2022
b529801
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 17, 2022
ff55840
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 17, 2022
52684e7
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 21, 2022
e806789
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 22, 2022
e59a3f8
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 24, 2022
8fa5e17
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 25, 2022
5c8ffbd
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 25, 2022
e5586e9
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 26, 2022
e5731a4
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Jan 28, 2022
67cd2a6
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 10, 2022
b624967
add log for Executor
Feb 10, 2022
df6298b
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 11, 2022
1f1a720
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 11, 2022
7edaab6
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 11, 2022
f92599f
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 11, 2022
bdec640
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 11, 2022
e14255f
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 11, 2022
7c0736c
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 14, 2022
c1fe386
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 14, 2022
fc9f166
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 16, 2022
cc08dbf
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 16, 2022
91a3729
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 17, 2022
7cef89d
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 17, 2022
dd1ad2c
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 19, 2022
c5afd93
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 19, 2022
0d45241
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 21, 2022
f2718fd
Merge branch 'develop' of https://github.com/liutiexing/Paddle into d…
Feb 21, 2022
1cdc606
update the profiler
Feb 21, 2022
696f4c7
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 21, 2022
0b14de3
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 22, 2022
92e1b3d
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 22, 2022
db7a3c6
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 23, 2022
9f91993
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 23, 2022
116a1f3
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 24, 2022
88f6444
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 25, 2022
bdb927e
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 25, 2022
71e2bda
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 26, 2022
bc3edb6
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 27, 2022
3735f63
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Feb 28, 2022
9e2ffcf
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Mar 1, 2022
581de82
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Mar 2, 2022
5a3d862
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Mar 3, 2022
3f04928
Merge branch 'develop' into UpdateProfiler
Mar 11, 2022
e4e2f37
Update RecordEvent to improve performance
Mar 11, 2022
01e6716
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Mar 11, 2022
22a6a22
Merge branch 'PaddlePaddle:develop' into UpdateProfiler
liutiexing Mar 11, 2022
548d928
fix
Mar 11, 2022
9c88181
Merge branch 'PaddlePaddle:develop' into UpdateProfiler
liutiexing Mar 11, 2022
3e6a64c
Merge branch 'PaddlePaddle:develop' into develop
liutiexing Mar 16, 2022
302617f
AddAwaitableTask for WorkQueue
Mar 21, 2022
cb4e245
Merge branch 'UpdateProfiler' of https://github.com/liutiexing/Paddle…
Mar 21, 2022
77ddb42
Merge branch 'develop' into UpdateProfiler
Mar 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions paddle/fluid/framework/new_executor/workqueue/workqueue.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,42 @@
#pragma once

#include <functional>
#include <future>
#include <memory>
#include <string>
#include <type_traits>
#include <vector>
#include "paddle/fluid/platform/enforce.h"

namespace paddle {
namespace framework {

constexpr const char* kQueueEmptyEvent = "QueueEmpty";
constexpr const char* kQueueDestructEvent = "QueueDestruct";

// For std::function
// https://stackoverflow.com/questions/25421346/how-to-create-an-stdfunction-from-a-move-capturing-lambda-expression
template <typename OnlyMovable>
class FakeCopyable {
public:
explicit FakeCopyable(OnlyMovable&& obj) : obj_(std::move(obj)) {
static_assert(std::is_copy_constructible<OnlyMovable>::value == false,
"Need not to use FakeCopyable");
}

FakeCopyable(FakeCopyable&& other) : obj_(std::move(other.obj_)) {}

FakeCopyable(const FakeCopyable& other) {
PADDLE_THROW(platform::errors::Unavailable(
"Never use the copy constructor of FakeCopyable."));
}

OnlyMovable& Get() { return obj_; }

private:
OnlyMovable obj_;
};

class EventsWaiter;

struct WorkQueueOptions {
Expand Down Expand Up @@ -78,6 +104,22 @@ class WorkQueue {

virtual void AddTask(std::function<void()> fn) = 0;

// Higher cost than AddTask
template <typename F, typename... Args>
std::future<typename std::result_of<F(Args...)>::type> AddAwaitableTask(
F&& f, Args&&... args) {
using ReturnType = typename std::result_of<F(Args...)>::type;
std::function<ReturnType()> task =
std::bind(std::forward<F>(f), std::forward<Args>(args)...);
std::promise<ReturnType> prom;
std::future<ReturnType> res = prom.get_future();
AddTask([
t = std::move(task),
p = FakeCopyable<std::promise<ReturnType>>(std::move(prom))
]() mutable { p.Get().set_value(t()); });
return res;
}

// See WorkQueueOptions.track_task for details
// virtual void WaitQueueEmpty() = 0;

Expand All @@ -102,6 +144,22 @@ class WorkQueueGroup {

virtual void AddTask(size_t queue_idx, std::function<void()> fn) = 0;

// Higher cost than AddTask
template <typename F, typename... Args>
std::future<typename std::result_of<F(Args...)>::type> AddAwaitableTask(
size_t queue_idx, F&& f, Args&&... args) {
using ReturnType = typename std::result_of<F(Args...)>::type;
std::function<ReturnType()> task =
std::bind(std::forward<F>(f), std::forward<Args>(args)...);
std::promise<ReturnType> prom;
std::future<ReturnType> res = prom.get_future();
AddTask(queue_idx, [
t = std::move(task),
p = FakeCopyable<std::promise<ReturnType>>(std::move(prom))
]() mutable { p.Get().set_value(t()); });
return res;
}

// See WorkQueueOptions.track_task for details
// virtual void WaitQueueGroupEmpty() = 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ TEST(WorkQueue, TestSingleThreadedWorkQueue) {
}
finished = true;
});
auto handle = work_queue->AddAwaitableTask([]() { return 1234; });
// WaitQueueEmpty
EXPECT_EQ(finished.load(), false);
events_waiter.WaitEvent();
EXPECT_EQ(finished.load(), true);
EXPECT_EQ(counter.load(), kLoopNum);
EXPECT_EQ(handle.get(), 1234);
}

TEST(WorkQueue, TestMultiThreadedWorkQueue) {
Expand Down Expand Up @@ -146,6 +148,9 @@ TEST(WorkQueue, TestWorkQueueGroup) {
++counter;
}
});
int random_num = 123456;
auto handle =
queue_group->AddAwaitableTask(1, [random_num]() { return random_num; });
// WaitQueueGroupEmpty
events_waiter.WaitEvent();
EXPECT_EQ(counter.load(), kLoopNum * kExternalLoopNum + kLoopNum);
Expand All @@ -154,4 +159,5 @@ TEST(WorkQueue, TestWorkQueueGroup) {
events_waiter.WaitEvent();
queue_group.reset();
EXPECT_EQ(events_waiter.WaitEvent(), paddle::framework::kQueueDestructEvent);
EXPECT_EQ(handle.get(), random_num);
}