3

C++11 には がないので、Microsoftライブラリからfuture.then使い始めました。ほとんどの場合、うまく機能します。concurrency::taskPPL

ただし、現在、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();
}
4

2 に答える 2

0

.then の要点は、前のブロックの完了に依存するコードのブロックを実行することです。そうでない場合は、最初から .then を使用するべきではなく、代わりにコードをインラインで記述する必要があります。一方、前のブロックの完了に本当に依存している場合は、ブロックが完了するのを待つしかありません。私は何かが欠けているに違いない。

ジョー

于 2013-01-09T20:13:47.467 に答える