GPU 上有垃圾回收吗?

Is there garbage collection on the GPU?

据我了解,当使用没有垃圾回收的语言在堆内存中分配内存时,需要释放它。当所有引用变量超出范围时,具有垃圾收集功能的语言会自动执行此操作。当程序终止时,OS 声明泄漏的内存。

GPU上有没有类似的垃圾收集器?

例如,我在 OpenGL 中创建了一个 VBO,这个缓冲区会无限期地保留在 vram 上吗?有没有heap/stack vram的概念?

另一个例子是,如果我要使用 glCreateProgram 在 gpu 上创建一个程序,然后将着色器附加到它,我该如何(如果我需要的话)释放分配给程序?

与 OpenGL 的许多事情一样,这取决于实现。该规范为不同的驱动程序实现提供了很大的空间。

例如,glDeleteTextures 表示:

After a texture is deleted, it has no contents or dimensionality, and its name is free for reuse (for example by glGenTextures).

唯一可以立即保证的是名称(glGenTextures 返回的整数值)再次可用。它没有说明该内存是否实际上已被清理。

如果驱动程序想要实现一个垃圾收集器来清理已被删除的缓冲区后面的实际内存,他们可以这样做。一个更简单的实现会在返回之前清理所有内容。

也不能保证数据最终会出现在 VRAM 中。根据多种因素,您的某些缓冲区可能最终会出现在常规 RAM 中。

为了更直接地回答您的问题:

  1. 上面主要解释了,要看驱动了。
  2. 是,直到删除创建 VBO 的上下文。
  3. 同样,取决于驱动程序。传统意义上并没有真正的堆栈,您有数千个内核在不同时间进行浮点数学运算。着色器操作可能以某种指令 cache/stack 格式加载,这会因不同的内核组而异。大多数 VRAM 只是堆 textures/vertices/other 数据块
  4. 您应该在创建程序后 detatch/delete 您的着色器。我刚才在 gamedev.stackexchange 上回答了这个问题:https://gamedev.stackexchange.com/a/47912/12191