- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从程序员的角度来看,GPGPU 和常规多核/多线程 CPU 编程之间的主要实际区别是什么?具体来说:
最佳答案
有趣的问题。我已经研究过这个问题,所以我的回答是基于一些引用资料和个人经验。
哪些类型的问题更适合常规多核,哪些类型更适合 GPGPU?
就像提到的@Jared。 GPGPU 是为非常规则的吞吐量工作负载而构建的,例如图形、密集矩阵-矩阵乘法、简单的 photoshop 过滤器等。它们擅长容忍长延迟,因为它们天生就被设计为容忍纹理采样,一个 1000 多个周期的操作。 GPU 内核有很多线程:当一个线程触发长延迟操作(比如内存访问)时,该线程将进入休眠状态(而其他线程继续工作),直到长延迟操作完成。这允许 GPU 保持其执行单元比传统内核更忙。
GPU 不擅长处理分支,因为 GPU 喜欢将“线程”(如果您不是 nVidia,则为 SIMD channel )批处理并一起发送到管道中以节省指令获取/解码能力。如果线程遇到分支,它们可能会发散,例如,8 线程经线中的 2 个线程可能会占用该分支,而其他 6 个线程可能不会占用它。现在,warp 必须分成大小为 2 和 6 的两个 warp。如果您的核心有 8 个 SIMD channel (这就是原始 warp 包含 8 个线程的原因),那么现在您的两个新形成的 warp 将运行效率低下。 2-thread warp 将以 25% 的效率运行,6-thread warp 将以 75% 的效率运行。可以想象,如果一个 GPU 继续遇到嵌套分支,它的效率会变得非常低。因此,GPU 不擅长处理分支,因此不应在 GPU 上运行带有分支的代码。
GPU 的协作线程也很糟糕。如果线程需要相互通信,那么 GPU 将无法正常工作,因为 GPU 不支持同步(但 nVidia 支持同步)。
因此,GPU 最糟糕的代码是并行度较低的代码或具有大量分支或同步的代码。
编程模型的主要区别是什么?
GPU 不支持中断和异常。对我来说,这就是最大的不同。除此之外,CUDA 与 C 没有太大区别。您可以编写一个 CUDA 程序,将代码发送到 GPU 并在那里运行。您在 CUDA 中访问内存的方式略有不同,但这同样不是我们讨论的基础。
导致编程模型存在差异的关键底层硬件差异是什么?
我已经提到过他们了。最大的是 GPU 的 SIMD 特性,它需要以非常规则的方式编写代码,没有分支和线程间通信。这是为什么,例如,CUDA 限制代码中嵌套分支的数量的部分原因。
哪一个通常更容易使用以及使用多少?
取决于您正在编码什么以及您的目标是什么。
易于矢量化的代码:CPU 更易于编码,但性能较低。 GPU 编码稍难,但物有所值。
对于所有其他人,CPU 更容易,而且性能通常也更好。
从长远来看,为 GPU 实现高级并行库(例如 Microsoft 的任务并行库或 D 的 std.parallelism)是否可行?
根据定义,任务并行需要线程通信并且也有分支。任务的思想是不同的线程做不同的事情。 GPU 是为许多做相同事情的线程而设计的。我不会为 GPU 构建任务并行库。
如果 GPU 计算效率如此惊人,为什么 CPU 的设计不更像 GPU?
世界上的许多问题都是分支和不规则的。上千个例子。图形搜索算法、操作系统、Web 浏览器等。只是补充一下——即使图形也像每一代一样变得越来越分支和通用,因此 GPU 将变得越来越像 CPU。我并不是说它们会变得像 CPU 一样,但它们会变得更加可编程。正确的模型介于低效 CPU 和非常专业的 GPU 之间。
关于multithreading - GPGPU 与多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919172/
GPGPU编程仅允许执行SIMD指令吗? 如果是这样,那么重新编写具有以下特征的算法必须是一项繁琐的任务: 被设计为在通用CPU上运行以在GPU上运行?也有一个 可以转换为SIMD架构的算法中的模式?
以计算能力为1.3的硬件为例。 30 条短信可用。那么最多可以同时运行240个块(考虑到寄存器和共享内存的限制,对块数的限制可能会低很多)。超过 240 的那些块必须等待可用的硬件资源。 我的问题是那
我正在寻找与使用 GPGPU 计算时 CPU 如何将程序代码移动到 GPU 相关的信息。互联网上有很多关于数据传输的手册,但没有关于指令/程序加载的手册。 问题是:程序由 CPU 处理,它在每个计算单
我有一个 Cuda 应用程序;在首先为各种数组分配 cuda 内存后,程序循环执行:将数据传输到 GPU,在 GPU 上处理内核,从 GPU 传回数据。第一个数据集由 GPU 正确处理并返回。此后后续
GPGPU 在许多任务(不是全部)上都有很大的潜力,尤其是处理数据库中的矩阵,至少根据围绕该主题的所有 PR。 我还没有找到使用 GPGPU 来加速性能的数据库。 你知道任何利用 GPGPU 的开源数
当一个 wavefront 执行时,它提供了细粒度的多线程。这样做的后果之一是没有分支预测要求,如下面的幻灯片所示: 但是我无法理解这一点。有人可以用简单的方式解释一下吗? 最佳答案 分支会在指令流的
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
CUDA初学者在这里。 在我的代码中,我目前在主机代码的循环中多次启动内核。 (因为我需要块之间的同步)。所以我想知道我是否能够优化内核启动。 我的内核启动看起来像这样: MyKernel>>(dou
我正在尝试使用 WebGL 和 GLSL 着色器编程在 GPU 上实现有效的流体求解器。 我发现了有趣的文章: http://http.developer.nvidia.com/GPUGems/gpu
我一直在他们的 Stream 2.0 测试版中使用 ATI OpenCL 实现。当前测试版中的 OpenCL 目前仅使用 CPU,下一个版本应该支持 GPU 内核。我下载了 Stream,因为我的工作
我有一个CUDA程序,似乎正在达到某种资源的某种极限,但是我无法弄清楚该资源是什么。这是内核函数: __global__ void DoCheck(float2* points, int* segme
我想知道使用 GPGPU 可以实现什么样的金融应用程序。我知道使用 CUDA 在 GPGPU 上使用蒙特卡罗模拟进行期权定价/股票价格估计。有人可以列举在金融领域的任何应用程序中使用 GPGPU 的各
从程序员的角度来看,GPGPU 和常规多核/多线程 CPU 编程之间的主要实际区别是什么?具体来说: 哪些类型的问题更适合常规多核,哪些类型更适合 GPGPU? 编程模型的主要区别是什么? 导致编程模
我正在考虑将一些数学运算卸载到 GPU。由于我已经在使用 D3D11,因此我将使用计算着色器来完成这项工作。但问题是,无论用户拥有什么 GPU,我都需要相同输入的结果相同。 (仅要求它支持计算着色器
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在 GLSL 上实现 Scrypt 哈希器(用于 LTC 矿工)(不要问我为什么)。 而且,实际上,我坚持使用 HMAC SHA-256 算法。尽管我已经正确实现了 SHA-256(它为输入
我最近在 GTC 上看到了 arrayfire 演示,我想我会尝试一下。以下是我在尝试使用它时遇到的一些问题。我在 Windows 7 系统上运行 Visual Studio 2013,使用来自 AM
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我曾不止一次偶然发现术语“非连贯”和“连贯”内存 tech papers与图形编程有关。我一直在寻找一个简单明了的解释,但发现大多数是this的“硬核”论文。类型。我很高兴收到关于 GPU 架构上实际
基本上问题是如何在 Metro 应用程序中运行 gpgpu 代码。该库不需要专门用于计算,例如,使用XNA的hlsl(最初是为了渲染东西)进行通用计算(XNA不包含在Metro中,因此是我的问题)。默
我是一名优秀的程序员,十分优秀!