c++ - 对如何在 C++ AMP 上执行大任务一无所知

标签 c++ parallel-processing gpu gpgpu c++-amp

我的任务是查看我开发的算法是否可以使用 GPU 而非 CPU 上的计算运行得更快。我是加速器计算的新手,有人给我一本我已经通读过的书“C++ AMP”,我认为我对它的理解相当好(我过去用 C 和 C++ 编写代码,但现在主要是 C#)。

但是,在实际应用中,我似乎就是不明白。所以,如果可以的话,请帮助我。

假设我有一项任务是计算一些复杂的函数,该函数需要一个巨大的矩阵输入(如 50000 x 50000)和一些其他数据并输出相同大小的矩阵。整个矩阵的总计算需要几个小时。

在 CPU 上,我只是将任务分成几个部分(部分数量大约为 100 个)并使用 Parralel.For 或我自己编写的简单任务管理循环来执行它们。基本上,保持几个线程运行(线程数=核心数),当线程完成时开始新的部分,直到所有部分都完成。而且效果很好!

但是,在 GPU 上,我不能使用相同的方法,这不仅是因为内存限制(没关系,可以分成几个部分),而且因为如果某些东西运行超过 2 秒,它就会被视为“超时” GPU 被重置!因此,我必须确保我计算的每个部分的运行时间都少于 2 秒。

但这不是每个任务(例如,将一个小时的工作分成 60 个任务,每个任务 1 秒),这很容易,这就是每组任务,因为无论我选择哪种队列模式(立即或自动) ,如果我运行(通过 parralel_for_each)任何总执行时间超过 2 秒的东西,GPU 将被重置。

不仅如此,如果我的 CPU 程序占用了所有 CPU 资源,只要它保持在较低的优先级,UI 就会保持交互 - 系统是响应式的,但是,当在 GPU 上执行代码时,屏幕似乎被卡住直到执行完毕!

那么,我该怎么办?在本书的演示中(N 体问题),它表明它应该像 100 倍一样有效(多核计算给出 2 gflops,或者 w/e 数量的触发器,而放大器给出 200 gflops),但是在实际应用中,我只是不知道该怎么做!

我是否必须将我的大任务分成数十亿个部分,例如,分成多个部分,每个部分需要 10 毫秒来执行并在 parralel_for_each 中一次运行 100 个部分?

还是我只是做错了,我只是没有找到更好的解决方案?

请帮忙!

最佳答案

TDR(您看到的 2 秒超时)是使用在渲染显示和执行计算工作之间共享的资源的现实。操作系统通过强制超时保护您的应用程序不会完全锁定显示。这也会影响尝试渲染到屏幕的应用程序。将您的 AMP 代码移至单独的 CPU 线程不会有帮助,这会释放 CPU 上的 UI 线程,但渲染仍会在 GPU 上被阻塞。

当您在低功率系统上将 N 设置得非常大时,您实际上可以在 n 体示例中看到这种行为。 N的最大值实际上在应用程序中是有限制的,以防止您在典型场景中遇到此类问题。

您实际上走在正确的轨道上。如果你想达到特定的帧速率,你确实需要将你的工作分解成适合 sub 2s block 或更小块的 block 。您还应该考虑您的工作是如何排队的。请记住,所有 AMP 工作都是排队的,在自动模式下您无法控制它何时运行。使用立即模式是更好地控制命令批处理方式的方法。

注意:TDR 在专用计算 GPU 硬件(如 Tesla)上不是问题,如果底层 GPU 支持,Windows 8 在处理 TDR 超时限制时提供了更大的灵 active 。

关于c++ - 对如何在 C++ AMP 上执行大任务一无所知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19383788/

相关文章:

c++ Variadic Macro编译错误

python - Python 中多处理的同步问题,双 for 循环

c - 如何使用 MPI_Abort() 终止其他处理器

c# - 具有 MaxDegreeOfParallelism 和实际线程数的 ParallelOptions

performance - 不同GPU内存空间的访问时间是多少?

tensorflow - 在 tensorflow v.1.15 sess=tf.Session() - 无法加载动态库 'cudnn64_7.dll' ; dlerror : cudnn64_7. 找不到 dll

cuda - 来自 CUDA 代码的 100% GPU 使用率导致屏幕延迟

c++ - 在单独分配的堆栈上运行函数

c++ - 静态模板类的建议

c++ - 使用 native 系统调用在 C++ 中播放声音?