【发布时间】: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