通过GPU计算并行程序的一部分的可能选项
Possible options to calculate a part of paralleled Program over GPU
嗨,我对gpu不太熟悉,我只是有一个理论问题。
所以我正在开发一个名为Sassena的应用程序,它从分子动力学轨迹计算中子散射。这个应用程序是与MPI并行编写的,在CPU上运行得很好。但我愿意在GPU上运行这个应用程序,让它更快。当然不是全部,而是部分。当我查看源代码时,它的工作方式是典型的MPI,这意味着第一列将数据单独发送到每个节点,然后每个节点进行计算。现在,有一部分计算是使用快速傅立叶变换(FFT),它消耗了最多的时间,我想把这部分发送到GPU。
我看到两个解决方案摆在我面前:
-
当节点到达FFT部分时,它们应该将数据发送回主节点,当主节点收集所有数据时,它将其发送给GPU,然后GPU进行FFT,将其发送回cpu,cpu进行其余操作。
-
每个节点都会动态地将数据发送到GPU,在GPU进行FFT后,它会发送回每个节点,然后它们完成其余的工作。
所以我的问题是这两者中哪一个是可能的。我知道第一个是可行的,但它需要大量的沟通,这很耗时。但第二种方式,我不知道这是否可能。我知道在第二种情况下,它也将取决于计算机体系结构。但是CUDA或OpenCL能做到这一点吗??
谢谢你的任何想法。
据我所知,您不受CUDA的限制。您在这里受到限制的是您拥有的GPU数量。您需要创建某种队列,将您的工作分配到可用的GPU,并跟踪可用资源。根据CPU数量与GPU数量之间的比率以及每个FFT所需的时间,与仅在每个核心上进行FFT相比,您可能需要等待更长的时间才能将每个FFT传递给GPU。
我的意思是,你失去了在每个核心上执行的FFT的异步计算。相反,CPU 2
必须等待CPU 1
完成其FFT计算,才能在GPU上启动新内核。
除了我所说的,还可以创建一个简单的互斥体,当CPU开始计算其FFT时,该互斥体被锁定,当它完成时被解锁,以便下一个CPU可以使用GPU。
你可以看看StarPU。它是一个基于任务的api,可以处理向GPU发送任务。它也是为分布式内存模型设计的。
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- C/C++预处理器是否可以检测一些编译器选项
- C++:如何使函数只返回作为列表一部分的字符串
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- std::sort()函数无法对向量的一部分进行排序
- 通过选项卡的文本设置QTabWidget顺序
- 通过ccmake在cmake中缓存依赖选项
- 如何传递多个 std::文件系统选项?
- 基于编译器选项的编译二进制路径
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- 如何应用 libcurl 的持久连接选项
- 文件中.dat Dlib 选项
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- Visual Studio C++ 它只构建选项卡中显示的文件吗?
- 通过GPU计算并行程序的一部分的可能选项