顶级难题--SDK例题中的particles自带之bug

本人是做离散元这一块的,在cuda3.1这个版本的sdk中有一个很好的例题particles,完全可以作为基础源代码,供我接下来开发利用,但是不幸的是这个程序里面自身带有一个bug,这个bug已经被NIVIDA公司的工程师发现,并且debug过(这一点的证据会在接下来论述),但是很不幸的是没能解决。不自量力,我消耗了两个星期,查阅了很多OpenGL的资料,始终没有解决掉这个bug。罗嗦了一大顿主要是强调一下该问题的难度,下面具体描述一下这个bug。
在我的电脑中(GTX 460,显卡内存为1024MB),particles例题所在的位置为C:\SDK\C\src\particles,这个bug所在的项目为particleSystem.cpp,在这个项目下,直接搜索“debug”,便可以定位此bug所在的函数为ParticleSystem::dumpParticles(),这一点证明了这个bug是被NIVIDA公司的工程师发现过的。在编译运行这个程序后,单击按键“1”“2”“3”“4”后,小球会表现出不同的状态,这个运行是没问题的,关键点是在你按下键盘上的“u”后,会出现附图1所示的中断对话框,其实这个按键“u”的作用是在屏幕上输出小球的位置坐标跟速度值(速度输出时没问题的,bug出现在坐标输出上,我试验过了的)。我已经定位到这个错误百分百发生在“ copyArrayFromDevice(m_hPos, 0,m_posVbo, sizeof(float)4count); ”这句话中,而且有90%以上的可能发生在m_posVbo这个量上,但是它涉及到复杂的OpenGL与CUDA交互存储操作,我始终不能干掉这个bug,相当无助。很希望一个开发这个程序工程师的联系方式,咨询一下,但没能找到;各位大侠如果有什么调试建议,或者能指条明路,还望不吝赐教,不胜感激。我的QQ281221472,邮箱wallyy1007@gmail.com。

[
QQ群里的人说是:
copyArrayFromDevice(m_hPos, 0,m_posVbo, sizeof(float)4count);
改成
copyArrayFromDevice(m_hPos, 0, &m_cuda_posvbo_resource, sizeof(float)4count);

然后修改.cuh文件中的原型为void copyArrayFromDevice(void* host, const void* device, struct cudaGraphicsResource **cuda_vbo_resource, int size);
我不懂的。只是复制过来。

[ 本帖最后由 悠闲的小猫 于 2010-11-6 11:45 编辑 ]

[

据说原来的是因为什么cudaGraphicsRegisterBuffer()注册m_posVbox后应该使用handle而不是使用m_posVbox这个GLuint,
否则cudaGraphicsResourceGetMappedPointer()这里尝试dereference指针的时候出现access violation.

据说按照二楼的改写就好了。

我完全小白,不懂。

十分感谢谢两位的指点,不过我按照以上所说的做了,还是有问题存在。就是程序里有好多地方与void copyArrayFromDevice(void* host, const void* device, struct cudaGraphicsResource **cuda_vbo_resource, int size);相关联,一旦修改了,在其他地方会报错,我也尝试修改,但还是不成功。还望多多指教。

[

你仔细阅读一下copyArraryFromDevice(),你会发现,里面判断了第三个参数是不是0(NULL)。对这个函数的很多调用都传入了0,所以那段if后面的代码没有执行;而出错的那个调用,传入了m_posVbox(实际上应该是&m_cuda_posvbo_resource), 这样,你保持原型不懂,只修改:
copyArrayFromDevice(m_hPos, 0,m_posVbo, sizeof(float)4count);
改成
copyArrayFromDevice(m_hPos, 0, (int)&m_cuda_posvbo_resource, sizeof(float)4count); 只做一个强制转换即可。这样在32-bit下是没问题的。

十分感谢悠闲的小猫,在你全力的协助下,终于让我看见了颗粒位置的输出,虽没有我的功劳,但还是很兴奋。我人不明白这么修改的原因(希望加入你说的群,探讨一下这个问题),但总算可以解决一下我的燃眉之急,接下来还得努力学习CUDA。这是我第一次通过论坛求助解决掉一个问题,真是强大,非常非常感谢悠闲的小猫!以后常联系。

[

额。不是我。。。我是转发别人的。。
群也不是我的。是风辰老大的。。

[ 本帖最后由 悠闲的小猫 于 2010-11-9 12:19 编辑 ]