GPU着色器图灵完备吗

Posted

技术标签:

【中文标题】GPU着色器图灵完备吗【英文标题】:Are GPU shaders Turing complete 【发布时间】:2014-08-25 12:09:07 【问题描述】:

我了解完整的 GPU 是计算的庞然大物 - 包括计算的每一步和内存。所以很明显,GPU 可以计算我们想要的任何东西——它是图灵完备的。

我的问题是关于各种 GPU 上的单个着色器(“流处理器”/“CUDA 核心”): 图灵完备吗? 我可以(理论上)使用单个着色器在任意输入上计算任意函数吗? 我试图了解计算着色器的“规模”。

【问题讨论】:

如果一种语言有 if 和 goto,那么它就是图灵完备的。最有可能的是,现代的着色器支持都在微不足道地完成了。 【参考方案1】:

您是说着色器是用于计算着色的程序吗?

在 wiki talk 我发现:

(...)Shader 模型 1.x 和 2.0 确实不是图灵完备的,因为 他们缺乏通用的迭代能力(他们确实有一些 有限的循环结构,但这在 编译时间,所以迭代次数必须是常数)。

Shader 模型 3.0,用于最新的 PC 硬件等 Xbox 360,具有完全通用的循环能力,并且是图灵完备的 在理论意义上。这很好地突出了差异 理论和实践之间,虽然!当人们声称设备是 图灵完备,他们真正的意思是“如果这有无限的时间 和无限存储,这将是图灵完备的”。着色器模型 3.0 在寄存器空间和程序指令方面仍然极其有限 计数,因此在进行任何实际测试时都会失败。

请注意,如果您允许,即使着色器 1.x 也可以成为图灵完备的 多次渲染操作。例如,它是微不足道的 使用重复的渲染到纹理实现生命游戏 操作。在这种情况下,输入和输出纹理提供了一个大的 存储空间量,并且重复的渲染调用填充 缺少的迭代构造。不过,这是作弊,因为它 取决于 CPU 来发出渲染调用!

作为非图灵完备语言的示例: Wikipedia Page on non-turing-complete Shaders

通常它取决于着色器语言(以及您的图灵完备要求),但我认为最新的着色器语言可以称为图灵完备(如果我们忽略有限内存的任何限制),因为它们可以循环和读/写变量.

编辑

如果我误解了您的问题并且您的意思是将着色器作为着色器处理单元(如 Cuda 核心),那么我认为不应将单核视为图灵完整或不完整的类别。 GPU 不仅建立在核心之上。回答您的问题,您可以使用任意数量的 cuda 内核对 GPU 进行编程,以“通过任意输入计算任意函数”。

【讨论】:

是的,我问的是现代 GPU 中的单个执行单元。如果我给它我想要的所有 RAM(比如 2G),那么该着色器的单个编译程序是否能够计算任意函数(在内存要求的范围内)? 使用单核的 GPU 为您提供与多核 GPU 相同的“图灵能力”。 GPU 不仅建立在核心之上。 Cuda Core 只是 straming 多处理器单元的一部分,运行 GPU 需要比这更多的资源。要执行您的 gpu 程序,您需要有工作 GPU 的计算机,而不仅仅是它的一部分。我认为你应该考虑你的程序是否写成图灵完备的语言。

以上是关于GPU着色器图灵完备吗的主要内容,如果未能解决你的问题,请参考以下文章

GPU渲染管线概述

C++ 预处理器元编程图灵完备吗?

如何获得在着色器中用作Vulkan API中的变量的GPU输入?

GPU 上的图像处理 - 过滤器的连续着色器 - FBO

WebGL着色器入门简介

GPU 渲染管线与着色器 大白话总结 ---- 一篇就够