2013-01-09 48 views
3

由于C++ 11没有future.then我已经开始使用来自Microsoft PPL库的concurrency::task。它大部分时间都很好用。执行。然后不加延迟

但是,现在我处于GPGPU的状态,所以如果在GPU空闲的时候在PPL调度程序中计划的延续会导致不必要的延迟。

我的问题是,是否有任何可能的解决方法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(); 
} 
+0

您的问题似乎从需要多个干根据任务类型(要执行的代码),代表不同类型的计算资源(CPU和GPU)的任务队列。在PPL中,这将涉及使用[Scheduler class](http://msdn.microsoft.com/zh-cn/library/dd492385.aspx)。 – rwong

回答

0

。那么整点是要执行的是取决于前面的块完成的代码块。如果情况并非如此,那么你首先不应该使用.then,而应该直接写代码。另一方面,如果你确实依赖于前面的块完成,则别无选择,只能等待它完成。我肯定错过了什么。

+0

你错过了一些东西。问题在于延续在被执行之前被排入任务调度程序而被不必要地延迟,而不是被直接执行。 – ronag

0

的PPL调度不保证在执行了。然后拉姆达,或者是什么的线程执行它作为。您可以将其视为一个独立的任务,计划在上一个任务完成后才开始。调度器可以立即执行继续任务,它甚至可以使用相同的线程,但这不是确定的。

对于调度执行的讨论,参见:

Appendix A: The Task Scheduler and Resource Manager

最新的MSDN文档也有一些更多的信息:

Task Scheduler (Concurrency Runtime)