【发布时间】:2013-01-22 21:52:52
【问题描述】:
我需要一些关于 OpenCL 代码的建议。我在 OpenCL 中编写一个粒子系统,直接从 OpenCL 绘制到 gpu 上,所以没有复制到 CPU。这一切都很好,但我在创建新粒子时遇到了问题。
我在 GPU 上分配了一个包含所有粒子数据的大内存区域。粒子的参数之一称为 isAlive,它决定了它的活跃天气。当我想创建一个新粒子时,我会找到一个不活跃的粒子,将其位置修改为起始位置,然后将其设置为 isAlive true。这个过程非常昂贵,因为我必须遍历所有粒子以找到不活跃的粒子,同时我必须确保多个线程不会同时创建相同的粒子(所以我不最后得到更多的粒子然后我问)。 有没有什么好的考虑、算法或策略可以更优雅、更快地解决这个问题?
【问题讨论】:
-
所以您不是将数据复制回主机,而是在每个时间步从主机调用不同的内核?还有,一旦一个粒子死了,除了被一个新粒子替代之外,它还能复活吗?
-
是的,我从不将数据复制回 CPU。我重复一系列内核调用以在每个时间步更新粒子。是的,我一次又一次地重用死粒子,但它作为物理世界中的一个新粒子,只是替换旧的内存区域,所以它与旧的死粒子没有任何联系。
-
你知道给定时间死粒子的数量吗?您是否有足够的内存来分配位数组来跟踪活动状态?你的目标总共有多少个粒子?您是同时替换所有死粒子,还是可以等到稍后的时间步长?
-
我可以很容易地找到死粒子的数量,我认为是的。是的,我确实有更多可用内存。迭代位数组然后在大数组中查找是否会更快?粒子如何死亡和生存是非常不同的。它是一些图形的交互式引擎。有时我需要用大量粒子快速填充屏幕。
标签: opencl