Articles of cuda

用解锁的D3DFORMAT抓取深度缓冲区

我目前在一个mod框架(Multitheft Auto)上掏腰包,试图读取D3DFMT_D24S8(DirectX9)中的深度缓冲区。 如果将格式更改为D3DFMT_D32F_LOCKABLE,然后lockingrectange,则可以读取它,但会导致渲染模糊,如下所示: 我目前开放hacky方法,如find指向缓冲区的指针,并读取深度没有正确locking和/或使用CUDA。 任何意见将非常感激。 谢谢!

CUDA 4.1更新

我目前正在通过使用CUDA移植一个粒子系统来更新GPU。 有了CUDA,我已经将所需的数据传递给GPU,并通过主机分配和复制date。 当我构建项目时,它运行良好,但是当我运行它时,项目说我需要分配我的h_position指针。 这个指针是我的主机指针,是为了保存数据。 我知道我需要将当前粒子位置传递给所需的cudaMemcpy调用,并且它们当前存储在列表中,其中创建for循环,并针对每个调用以下代码行的粒子进行集成: m_particleList[i].positionY = m_particleList[i].positionY – (m_particleList[i].velocity * frameTime * 0.001f); 我目前的主机端cuda代码如下所示: float* h_position; // Your host pointer. This holds the data (I assume it's already filled with the data.) float* d_position; // Your device pointer, we will allocate and fill this float* d_velocity; float* d_time; int threads_per_block = 128; // You […]

CUDA性能较差,光线追踪

我使用CUDA 7.5来学习光线跟踪的基础知识。 到目前为止,我什么也没有做,只有恒定的颜色无照明球体 – 只有光线跟踪。 但是,对于800×600的分辨率,我的增量时间已经是14 – 16毫秒 – 每个像素1个射线。 一些电脑的规格,如果需要的话:GPU – NVIDIAtitanium金黑色,CPU – 英特尔酷睿i7 …,足够的内存。 这是内核: __global__ void runKernel(Camera* cam, SphereData* objs, uint* size, uchar* out_img) { vec3 pos = cam->getPos(); rs::Rectangle rec = cam->genNearPlaneRectangle(); vec3 start = rec.center – rec.right – rec.up; float pixelsizex = 1.0F / cam->getWidth(); float pixelsizey = 1.0F / […]

在GPU上模拟数百甚至数千个“慢”运行的CPU?

介绍 这个问题是特定于GPU编程。 这不是主要关于游戏的想法。 但是,为了更好地理解这个问题,我将详细说明我想要在游戏中实现什么。 NVidia GeForce GTX 980的发展将会发生,如果AMD / ATI特定的硬件可用,则不会有任何问题。 我还没有编写一行代码,但是我会在C#中使用.NET的DirectX库,比如SharpDX。 我不具备所要求的知识,请原谅我的无知和/或不正确的术语。 另外请记住,虽然我没有受过这方面的教育,但我绝对愿意学习。 我现在只是在考虑/研究我的想法。 基本的想法( 游戏 ) “游戏”不是graphics密集型的,而是在计算上密集运行在GPU上运行数百乃至数千个小程序的“模拟世界”。 除了基本的互通以外,每个节目都是相互独立的。 我现在能想到的唯一“沉重的”graphics是显示每个虚拟机,并且可能在通信和/或运行指令时闪烁一些闪烁的灯光。 在彼此“物理”连接的机器之间绘制线条。 有点像世界地图。 以及绘制命令行当然。 但没有什么奇特的,大部分的计算时间都是专门用于模拟的。 我的基本想法是在一个沙盒中有一个计算机networking,就像命令行控制的“游戏”一样。 玩家使用的命令行是一个单独的“计算机”,即玩家在“游戏”世界中坐的位置。 这是游戏界面,它具有在模拟(GPU)networking中创建计算机的能力,以及与模拟networking“物理”交互的能力,例如开启/closures计算机(终止GPU线程并启动新的线程) ,上传程序在特定的计算机上运行,​​“插入”networking电缆和改变计算机硬件。 玩家电脑将运行在CPU上。 networking应该都能够在每台电脑之间以及玩家电脑之间进行通讯。 我希望每台计算机运行一个CPU架构,比如x86。 显然,x86可能太雄心勃勃,我会对最基本的架构很好。 如果任何现存的架构“太多”,那么脚本语言也会很好,但是最优的是,会使用编译器。 如仿真的架构的C编译器。 每台计算机将有一个编译的程序运行。 该计划将不得不照顾电脑所做的一切,包括IO,networking通信,无线电通信。 正如我已经指出,速度并不重要。 每台机器可以运行在20赫兹(IPS,每秒指令),更高的速度当然会更好。 每台机器都有自己的内存,存储介质和CPU,并且可以升级,因此每台机器在速度,内存容量和存储容量方面都可能不同。 存储应该在游戏会话之间保存,最佳的存储将被保存在计算机硬盘的真实世界(物理)存储中,以防止游戏意外停止,那么每台机器的“物理”存储将存活…即使由于写操作没有完成,会发生腐败。 /细节… 问题 这是可行的吗? 有没有一种比其他所有方法更可行的具体方法? 为什么? 哪种方法比较容易? 考虑到我对编写CPU仿真器的知识缺乏了解。 GPU / CPU相互通信,尤其是在每个机器存储方面…是否是好的/坏主意? networking…可以将几个CUDA / OpenCL线程作为networking相互通信吗? 考虑到CPU仿真,通信还有可能吗? 如果我在机器上运行的编译好的程序在仿真中写入特定的内存地址,那么可以传输到另一个GPU线程来读取模拟内存吗? […]

非重叠排斥球的非实时模拟

我想对非重叠排斥球进行非实时模拟,最初是2D,后来是3D。 对于“非真实”,我的意思是在每个时间步后都不需要渲染。 首先,为简单起见,考虑一个简单的封闭域。 在实践中,领域将是复杂和不规则的,但始终是封闭的。 边界上的球是固定的,可以重叠。 只要没有其他球重叠,一个固定的球就会复制出一个相同大小的自由球。 固定球和自由球相互排斥,但固定球不能移动。 请注意,重复球应该充分倾斜,以开始排斥。 在弹性碰撞球的情况下,两个球碰撞后,它们以一定的速度改变方向,但在这种情况下,球停止重叠后可以快速停止。 自由球移动,直到没有运动,或者说我们解决运动问题,直到收敛。 然后每个固定球再次产生一个自由球,这个过程继续进行,直到没有固定球由于被任何其他球重叠而复制。 我认为GPU(CUDA)会更快地解决这个问题,但最初我正在考虑在CPU上编写代码。 然而,在进行编码之前,我想知道这项工作的“可行性”。 也就是说,考虑到一百万个球,大概需要多长时间来非实时地模拟这种或类似的问题。 对于一百万个球来说,如果解决时间是几分钟的话,我会潜心钻研这个问题。 所以,对于有经验的程序员来说,我的问题是大概需要多长时间来模拟数百万个variables的这种问题呢? 它是按秒,分钟还是以小时为单位?

Nvidia Nsight 4.6 VS版 graphicsdebugging器找不到glew32.dll

我试图debugging一些纹理和FBO的Nvidia Nsight 4.6 VS版。 但是,当我select“启动CUDAdebugging”或“启动graphicsdebugging”我得到一个错误。 “程序无法启动,因为您的计算机缺lessglew32.dll。尝试重新安装程序来修复此问题” 当我不使用Nsight时,应用程序运行得很好。 什么可能是我的问题? 我的系统; Windows 7 x64位。 Nsight 4.6 x64位。 GTX 580与最新的驱动程序。 OpenGL版本3.3。 构建一个Win32应用程序。 (试图将构建目标更改为x64,但这只是导致了glfw和glew的一堆链接错误)

GPGPU物理和游戏逻辑

在阅读有关GPU加速物理的Erwin Coumans演示文稿之后,我想知道gpu加速物理: http: //www.gdcvault.com/play/1018185/GPU-Rigid-Body-Rigid-Body(演示video在这里: http:/ /www.youtube.com/watch?v=ZkF4yMmP0R8 ) 虽然它看起来像是一个巨大的性能提升,但我没有任何与gpgpu编程expirience,所以我想知道这是多么实际的游戏。 你必须管理游戏引擎不同部分之间的通信。 我知道有opencl和opengl共享内存的设施,涵盖了渲染部分..但是一个典型的游戏引擎的其他部分呢? 比方说,我们有一个固定的时间步物理模拟(可以说60HZ)和相应的游戏逻辑(它也运行在60HZ),需要作用于物理引擎触发的某些事件。 游戏逻辑并不一定适合在GPU上执行,例如它可能是分支密集型的。 这意味着从GPU读回到CPU,这不会造成太多的延迟让我们的游戏逻辑在60HZ进行?

CUDA和Shader有什么区别?

我是CUDA的新手,似乎CUDA和Shader都是GPU程序。 当我们谈论渲染中的GPU编程时,如GPU体素化,我们是在谈论CUDA还是仅仅将数据转换为Shader?

CUDA 4.1粒子更新

我正在使用CUDA 4.1来parsing我用DirectX 10制作的粒子系统的更新。到目前为止,我的粒子系统的更新方法是在for循环中的一行代码,使得每个粒子落在y轴模拟瀑布: m_particleList[i].positionY = m_particleList[i].positionY – (m_particleList[i].velocity * frameTime * 0.001f); 在我的.cu类中,我创建了一个从我的粒子类复制的结构,如下所示: struct ParticleType { float positionX, positionY, positionZ; float red, green, blue; float velocity; bool active; }; 然后我在.cu中也有一个UpdateParticle方法。 这包括我的粒子需要根据最初的代码行来更新自己的3个主要参数。 : __global__ void UpdateParticle(float* position, float* velocity, float frameTime) { } 这是我的第一个CUDA程序,我不知道下一步该做什么。 我试图简单地把particleList行放在UpdateParticle方法中,但是粒子不会像他们应该那样掉下来。 我相信这是因为我没有在课堂上使用粒子坠落代码所需的东西。 有人能告诉我什么是我想念得到它的工作,因为它应该? 如果我这样做是完全错误的,请告诉我。

如何将深度缓冲区从OGRE传递到CUDA?

我正在使用OGRE来渲染一些对象。 在每一帧中,我都想把结果深度缓冲区传递给CUDA,以便在其上运行一些内核并计算结果。 我怎样才能做到这一点? 如何访问OGRE中的深度缓冲区? 如何将其传递给CUDA进行处理? 我不需要写入CUDA内核的深度缓冲区,它可以是只读的。