我的这段代码是经过分析、优化和缓存高效的,因为我可能会根据我的知识水平得到它。它在概念上像这样在 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 上的其余任务
- 对于 CPU 级别的操作,保留我的 super-duper
RunTask()
功能,而无需修改它以符合restrict(amp)
. 我当然可以restrict(amp)
为 GPU 任务设计一个兼容的 lambda。
最初我想这样做:
// 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 个请求?即便如此,我将如何实现它?