执行.then没有延迟

时间:2013-01-09 19:07:14

标签: c++ visual-studio-2012 task future ppl

由于C ++ 11没有future.then,我已开始使用Microsoft PPL库中的concurrency::task。它大部分时间都很好用。

但是,现在我正处于我正在进行GPGPU的情况,因此在PPL调度程序中安排.then延续会导致GPU空闲时出现不必要的延迟。

我的问题是concurrency::taskconcurrency::task::then是否有任何可能的解决方法让它们直接执行。

根据我的理解,由于缓存效率的原因,在大多数情况下,定期计划的任务会立即执行。但是,使用concurrency::task_completion_event从显式线程(即GPU线程)调度的任务不是这种情况。

我正在做的一个例子:

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();
}

2 个答案:

答案 0 :(得分:0)

.then的重点是执行一段代码,该代码块依赖于前一个块的完成。如果不是这种情况,那么你不应该首先使用.then,而应该只是内联编写代码。另一方面,如果你确实依赖于之前的块完成,那么别无选择,只能等待它完成。我一定错过了什么。

答案 1 :(得分:0)

PPL调度程序不保证执行.then lambda或执行什么线程。您可以将其视为单独的任务,计划仅在上一个任务完成后启动。调度程序可以立即执行延续任务,它甚至可以使用相同的线程,但这不是确定的。

有关调度程序实现的讨论,请参阅:

Appendix A: The Task Scheduler and Resource Manager

最新的MSDN文档还提供了更多信息:

Task Scheduler (Concurrency Runtime)