私の知識レベルで取得できる可能性が高いのと同じくらい、プロファイリングされ、最適化され、キャッシュ効率の高いこのコードがあります。概念的には次のように CPU 上で実行されます。
#pragma omp parallel for schedule(dynamic)
for (int i = 0; i < numberOfTasks; ++i)
{
result[i] = RunTask(i); // result is some array where I store the result of RunTask.
}
これRunTask()
は基本的に、同じ非常に大きなデータセットに対して毎回繰り返し実行される一連の線形代数演算であるため、GPU で実行するのに適しています。だから私は次のことを達成したいと思います:
- 一部のタスクを GPU にオフロードする
- GPU がビジー状態の間、CPU で残りのタスクを処理する
RunTask()
CPU レベルの操作については、準拠するように変更する必要なく、超大型機能を保持しrestrict(amp)
ます。restrict(amp)
もちろん、GPU タスクに準拠したラムダを設計することもできます。
当初、私は次のことを考えていました:
// assume we know exactly how much time the GPU/CPU needs per task, and this is the
// most time-efficient combination:
int numberOfTasks = 1000;
int ampTasks = 800;
// RunTasksAMP(start,end) sends a restrict(amp) kernel to the GPU, and stores the result in the
// returned array_view on the GPU
Concurrency::array_view<ResulType, 1> concurrencyResult = RunTasksAMP(0,ampTasks);
// perform the rest of the tasks on the CPU while we wait
#pragma omp parallel for schedule(dynamic)
for (int i = ampTasks; i < numberOfTasks; ++i)
{
result[i] = RunTask(i); // this is a thread-safe
}
// do something to wait for the parallel_for_each in RunTasksAMP to finish.
concurrencyResult.synchronize();
//... now load the concurrencyResult array into the first elements of "result"
しかし、私はあなたがこのようなことをすることができるとは思わない.
parallel_for_each の呼び出しは、同期しているかのように動作します。
( http://msdn.microsoft.com/en-us/library/hh305254.aspx )
では、私の要求の 1 ~ 3 を達成することは可能ですか、それとも 3 番を捨てる必要がありますか? それでも、どのように実装しますか?