我用pycuda做了一个相对论性的光线跟踪器。基本上,对于一个大的2D阵列中的每个“像素”,我们必须使用Runge-Kutta来求解一个由6个ode组成的系统。因为每个集成都是独立于其他的,所以应该非常容易。其他人已经用C/C++ + CUDA实现了它的优异结果(见this project)。在
问题是,我不知道怎样做才是最好的方法。我正在编写一个内核,它执行一些Runge-Kutta步骤,然后将结果返回给CPU。这个内核被调用了很多次,以获得整个光线的集成。问题是由于某些原因,非常慢。我知道这确实是一个瓶颈,因为我觉得这是一个很慢的转移。在
如果你能为我推荐这个案例的最佳编程实践,那就太好了。(使用pycuda)。我在徘徊的一些事情:
澄清一下:我不得不暂停/重启内核的原因是看门狗。超过10秒的内核被看门狗杀死了。在
提前谢谢你!在
你的主要问题似乎太笼统了,在没有看到代码的情况下很难给出一些具体的建议。我会试着回答你的子问题(不是一个真正的答案,但评论有点长)
没有
取决于你说的“获取一些信息”是什么意思。如果这意味着在CPU上做一些事情,那么,当然,你必须转移它。如果要在另一个内核调用中使用,则不需要传输它。在
它实际上取决于等式,线程数和你正在使用的显卡。我可以想象这样一种情况,一个RK步骤需要那么长时间。在
没有密码就无法确定。试着创建一些最小的演示示例,或者,至少,发布一个链接到一个可运行的(即使它很长)一段代码来说明您的问题。至于PyCUDA,它是CUDA的一个非常薄的包装器,所有适用于后者的编程实践,也适用于前者。在
我可能会帮助您处理内存,也就是说,在迭代过程中,不必从CPU复制到GPU。我正在使用euler时间步进法逐步发展一个系统,我在GPU上保存所有数据的方式如下所示。 然而,问题在于,一旦第一个内核被启动,cpu就会继续执行它后面的行。一、 边界核在时间演化步骤之前被启动。在
我需要的是一种同步的方法。我试过用它strm.同步()(请参阅我的代码)但它并不总是有效的。如果您对此有任何想法,我将非常感谢您的意见!谢谢!在
相关问题 更多 >
编程相关推荐