C++11 には がないので、Microsoftライブラリからfuture.then
使い始めました。ほとんどの場合、うまく機能します。concurrency::task
PPL
ただし、現在、GPGPU を実行している状況にあるため、スケジューラで .then の継続をスケジュールするとPPL
、GPU がアイドル状態の場合に不要な遅延が発生します。
私の質問は、可能な回避策がconcurrency::task
ありconcurrency::task::then
、それらを直接実行できるかどうかです。
私の理解では、定期的にスケジュールされたタスクは、ほとんどの場合、キャッシュ効率の理由により、その継続をすぐに実行します。ただし、これは、明示的なスレッド (つまり、GPU スレッド) から を使用してスケジュールされたタスクには当てはまりませんconcurrency::task_completion_event
。
私がやっていることの例:
template<typename F>
auto execute(F f) -> concurrency::task<decltype(f())>
{
concurrency::task_completion_event<decltype(f())> e;
gpu_execution_queue_.push([=]
{
try
{
e.set(copy(f())); // Skipped meta-template programming for void.
}
catch(...)
{
e.set_exception(std::current_exception());
}
});
// Any continuation will be delayed since it will first be
// enqueued into the task-scheduler.
return concurrency::task<decltype(f())>(std::move(e));
}
void foo()
{
std::vector<char> data /* = ... */;
execute([=]() -> texture
{
return copy(data)
})
.then(concurrency::task<texture> t)
{
return execute([=]
{
render(t.get());
});
})
.get();
}