【问题标题】:Dynamic Thread Pooling with the GPU使用 GPU 进行动态线程池
【发布时间】:2015-07-15 20:11:38
【问题描述】:

到目前为止,我已经实现了一个带有线程池范例的简单程序, 其中我有许多线程在处理许多任务。 一次可用的所有任务彼此独立。 对于每个任务,我都会有一些输出,通常会产生一些任务。 (例如

func(a, b): tasks.enque((a+b, b+1), (a*b, b+2)); return sin(a);

实际上,每个完成的任务都会生成更多的任务,因此工作量增长得非常快。 为了将计算时间保持在合理的低水平,我想我可以使用 GPU 生成树,因为任务是独立的,只要它们被创建。

有了这个,我提出了我的问题:是否有可能以某种方式直线前进,例如使用 OpenCL?
我想知道这是否是个好主意。到目前为止,我还没有看到在 OpenCL 中动态地将任务添加到队列中的可能性,如果我想说: 好的 - 首先我计算第一个队列,并生成一个新队列,我稍后再开始,我担心 GPU 和 CPU 之间的内存复制开销可能太大,以至于对于简单的来说它不再有效我打算做的计算。 我不确定我是否能够将数据保存在 GPU 内存中,或者它是否是自动提取的,因此需要在那里复制并再次复制回来。 (我打算用 OpenCL.net)

感谢您用您的知识启发了我, 因为我是多线程和 GPU 的绝对初学者

【问题讨论】:

  • 从未学过 SMP 是什么让您认为学习异构计算是个好主意?将数据从托管 C# 复制到 GPU 的开销非常大。只有当你有一个包含大量 SIMD 的深管道时,你才能真正获得一些东西。但鉴于您在 SMP 方面没有任何经验,我怀疑您是否知道 SIMD 的含义。
  • 这正是问题所在,我如何才能实现这种深度管道。这是某种 SIMD。好的,这是两条指令(乘法和加法),这将对所有数据执行。但是,我不想将它复制回来,而是想对结果再次执行相同的任务,直到满足某个阈值(内存已满,或者满足某个时间或深度阈值,这是预先定义的)。这个想法是,计算 N 个航路点之间所有路径的长度,我可以在某个给定时间内计算,或者在最大 M 跳时使用。
  • 我需要在那里进行两次计算:一次是通过将每个航路点之间的成本相乘来确定每条路径的成本,另一次是通过求和来确定。您每次都可以往返。
  • 您当前的方法是 SISD,查找 SIMD 并适当地重写您的方法签名。然而即便如此,你真的还没有准备好学习 OpenCL。您没有线程同步、数据编组或线程处理、本机/托管互操作或本机/设备互操作的经验......
  • 是的,你说得对,我一点经验都没有,但我想,经验之前的一步是学习,所以我希望我可以从这个开始,并在这里找到帮助.因此,我将在明天尝试发布一些我想到的方法,并希望您对我有耐心,以帮助我理解我做错了什么。

标签: c# multithreading opencl


【解决方案1】:

从 OpenCL 2.0 开始,无需主机交互即可将内核从设备中排入队列。 看看OpenCL™ 2.0: Device Enqueue and Workgroup Built-in Functions

但我怀疑你会找到 OpenCL 2.0 的 .Net 绑定,据我所知,目前还没有 C++ 绑定。

【讨论】:

  • 看起来很有趣。问题是,我的电脑,我大学的电脑都有NVIDEA Graphics,而且目前看来,OpenCL2.0对他们来说是不可用的。
  • 在 Nvidia 上是最大 OpenCL 1.2,AMD 和 Intel 在 GPU 和 CPU 上支持 OpenCL 2.0。
  • C++ 绑定是不可能的。在不知道您使用的编译器/版本的情况下进行互操作只能在 C 中实现。
  • @Aron 我不确定你在说什么。 OpenCL 1.2 C++ 绑定可以在 Khronos 网站上下载,OpenCL 2.0 C++ 绑定应该会在未来提供。
  • 等等...这些是源文件还是二进制文件?
猜你喜欢
  • 2023-03-12
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多