我写了一个CUDA随机漫步模拟。即我有两个向量X和Y,包含我模拟的所有粒子的位置。在每个时间步长期间,我根据我的计算更新它们的位置。
/* Calculate velocity magnitude */
CURAND_CALL(curandGenerateNormal(gen, dev_v, Nrand,0,1.0));
/* Generate direction on device */
CURAND_CALL(curandGenerateUniform(gen, dev_alpha, Nrand));
/* X_t+1 = X_t + V */
scosaxpy<<<blocksPerGrid,threadsPerBlock>>>(Nrand,dev_alpha,dev_v,dev_x);
ssinaxpy<<<blocksPerGrid,threadsPerBlock>>>(Nrand,dev_alpha,dev_v,dev_y);
sscosaxpy()
将我的位置更新为x+=cos(alpha)*vx
。然后我的代码结构为
/* initilize memory */
/* set up CURAND */
for(t=0;t<T;t++){
/* calculate velocity magnitude and direction */
/* update position */
/* eventually copy memory to host */
}
现在出现了我没有背景的部分。用OpenGL进行可视化。我查了一些例子(NVIDIA也为CUDA和OpenGL之间的交互提供了一些例子),但是大多数都是复杂的,或者不处理由CUDA完成计算的情况。
我的问题:任何人都可以通过以下方式向我提供可视化输出的步骤
for(t=0;t<T;t++){
/* calculate velocity magnitude and direction */
/* update position */
/* eventually copy memory to host */
/* Update the position of my particles in a 2D plot */
}
你能提供一个完整的工作实例吗?
答案 0 :(得分:1)
在OpenGL中有很多方法可以做到这一点。它们的复杂性和性能各不相同。由于您使用的是CUDA,我相信您希望自己的可视化运行速度非常快。这比仅仅渲染这些点而不考虑性能要复杂一些。如果您之前没有OpenGL经验,我建议您使用最简单的解决方案,在此处绘制一个点。看看这个教程(它只是一个例子。你可以尝试任何有工作代码的教程):http://openglsamples.sourceforge.net/triangle.html
尝试运行它并看到一个三角形。现在找到一个display()函数,看看负责绘图的代码放在glBegin(GL_TRIANGLES)之间;和glEnd();
您需要修改它,因为您不想绘制三角形。相反,这是你应该做的。在CUDA步骤之后,我期待你拥有一系列3D点。
for(t=0;t<T;t++){
/* calculate velocity magnitude and direction */
/* update position */
/* eventually copy memory to host */
}
/* Now your points are stored in an array. Let's say float particles[T][3]; */
/* Update the position of my particles in a 2D plot */
display();
您应该修改我已经提到的display()部分:
glBegin(GL_POINTS);
for(int t=0;i<T;t++)
{
glColor3f(1.0f,1.0f,1.0f); //In case you want to give them unique colors in future
glVertex3f( particles[t][0], particles[t][1], particles[t][2]);
}
glEnd();
现在你应该看到你的粒子。如果数字T相对较高,渲染可能会很慢,但只是为了描绘粒子所在的位置,它就足够了。请记住,粒子的位置必须在摄像机的视角中,其中cas位于点(0,0,3)并且在Z轴的负方向上看具有45度视角。