- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GPGPU编程仅允许执行SIMD指令吗?
如果是这样,那么重新编写具有以下特征的算法必须是一项繁琐的任务:
被设计为在通用CPU上运行以在GPU上运行?也有一个
可以转换为SIMD架构的算法中的模式?
最佳答案
好吧,GPGPU仅支持SIMD执行并不是很准确。许多GPU具有一些非SIMD组件。但是,总的来说,要充分利用GPU,您需要运行SIMD代码。
但是,您不一定要编写SIMD指令。即GPU SIMD与CPU SIMD不同-即与编写代码以利用x86 SSE(Stream SIMD扩展)等不同。事实上,作为向您推崇CPU SIMD的人之一(我参与其中英特尔MMX是最早的一种,并且一直沿用到FP SIMD的演变。)我经常不得不纠正那些认为像英特尔这样的CPU具有SIMD指令的人。我更喜欢将它们视为打包矢量指令,尽管我勉强称其为SIMD打包矢量指令集,只是因为每个人都滥用该名称。我还强调,CPU SIMD指令集(例如MMX和SSE)可能具有SIMD打包矢量执行单元-整数和浮点ALU等-但它们没有SIMD控制流,并且通常没有SIMD内存访问权限(又名散布/聚集(尽管Intel Larrabee朝着这个方向发展))。
我的comp-arch.net Wiki上有一些与此相关的页面(我为自己的爱好写了计算机体系结构):
-http://semipublic.comp-arch.net/wiki/SIMD
-http://semipublic.comp-arch.net/wiki/SIMD_packed_vector
-http://semipublic.comp-arch.net/wiki/Difference_between_vector_and_packed_vector
-http://semipublic.comp-arch.net/wiki/Single_Instruction_Multiple_Threads_(SIMT)
尽管我还没有像Intel MMX或SIMD那样写过有关SIMD打包矢量指令序列的文章,对此我深表歉意。
但我不希望您阅读以上所有内容。让我尝试解释一下。
想象一下,当以简单的标量方式编写时,您有一段类似于以下代码的代码:
// operating on an array with one million 32b floating point elements A[1000000]
for i from 0 upto 999999 do
if some_condition(A[i]) then
A[i] = function1(A[i])
else
A[i] = function2(A[i])
for i from 0 upto 999999 by 8 do
register tmp256b_1 = load256b(&A[i])
register tmp256b_2 = tmp256b_1 * tmp256b_1
register tmp256b_3 = _mm_sqrt_ps(tmp256b_1) // this is an "intrinsic"
// a function, possibly inlined
// doing a Newton Raphson to evaluate sqrt.
register mask256b = ... code that arranges for you to have 32 1s in the "lane"
where some_condition is true, and 0s elsewhere...
register tmp256b_4 = (tmp256b_1 & mask) | (tmp256b_3 | ~mask);
store256b(&A[i],tmp256b_4)
for i from 0 upto 999999 by 8 do
register mask256b = ... code that arranges for you to have 32 1s in the "lane"
where some_condition is true, and 0s elsewhere...
register tmp256b_1 = load256b(A[i])
if mask256b == ~0 then
register tmp256b_2 = tmp256b_1 * tmp256b_1
store256b(&A[i],tmp256b_2)
else mask256b == 0 then
register tmp256b_3 = _mm_sqrt_ps(tmp256b_1) // this is an "intrinsic"
store256b(&A[i],tmp256b_3)
else
register tmp256b_1 = load256b(&A[i])
register tmp256b_2 = tmp256b_1 * tmp256b_1
register tmp256b_3 = _mm_sqrt_ps(tmp256b_1)
register tmp256b_4 = (tmp256b_1 & mask) | (tmp256b_3 | ~mask);
store256b(&A[i],tmp256b_4)
// operating on an array with one million 32b floating point elements A[1000000]
for all i from 0 upto 999999 do
if some_condition(A) then
A = function1(A)
else
A = function2(A)
关于gpgpu - GPGPU编程仅允许执行SIMD指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682801/
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中,因此是我的问题)。默
我是一名优秀的程序员,十分优秀!