8

我刚开始学习 OpenCL。我试图了解将函数/算法移动到 GPU 时预期的性能提升。

大多数教程中给出的最基本的内核是一个内核,它接受两个数字数组并将相应索引处的值相加并将它们添加到第三个数组中,如下所示:

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}

我假设您永远无法证明在 GPU 上计算它是合理的,内存传输的权重会超过在 CPU 上计算它所需的时间(我可能对此错了,因此这个问题)。

我想知道的是,在使用 OpenCL 内核而不是 CPU 时,您期望显着加速的最简单的例子是什么?

4

6 回答 6

6

如果您有足够大的矩阵集,您打算对其执行线性代数运算,或者您基本上对每个元素执行相同的运算,我会认为这是一个微不足道的例子。矩阵乘法、加法、fft、卷积等。你会看到一点加速而不做太多工作。现在,如果您想看到 100 倍的加速,那么您需要深入研究内存管理并了解幕后发生的事情。

对于入门,我建议从 pycuda 开始,因为它非常简单,因为它提供了非常高的抽象级别,并且可以让您快速入门。当您准备好进一步深入学习时,请查看伊利诺伊大学http://courses.ece.illinois.edu/ece498/al/的这门关于使用 cuda 进行并行计算的课程。

于 2010-03-21T18:02:02.347 回答
3

取决于平凡的定义。在我看来,这将是矩阵矩阵乘积,因为它具有O(3)/O(2)计算与内存的比率。表现出相似比率的算法可能会从在 GPU 上的竞争中受益。

于 2010-03-14T19:25:36.177 回答
2

虽然您的内核显然非常微不足道,但它可能是一个有用的示例,但它完全受内存限制,因为对于每个元素,您有两次读取和一次写入,并且只有一次算术运算。有一些指令可以计算地址等,但与访问内存的成本相比,所有这些实际上都不算什么。

假设数据已经在 GPU 上,即使对于这个简单的内核,您也可以从 GPU 的非常高的内存带宽中受益。

当然,GPU 依赖于您有足够的线程来隐藏内存延迟,因此您的本地工作组大小应该相当大(例如 256 或 512),而您的全局工作组大小应该非常大(例如数十万)要有效,但这就是重点!

于 2010-03-14T22:53:28.763 回答
1

我知道这个问题已经很老了,但是......我发现 Mandelbrot 集的计算对于 GPU 来说是非常理想的。您有一个复杂的输入向量 (float2) 和一个标量输出 (int),每个输入向量平均有数百个操作。

它可以用作一个很好的示例应用程序,因为它...

  • 有一个二维输入数据集(计算图像)
  • 您可以解释波前以及为什么在某些情况下二维处理是有益的
  • 演示矢量数据类型
  • 生成一张图片,可以通过人眼快速验证(调试)
  • 可以通过以下方式轻松扩展:颜色映射(__constant)、float4 处理而不是 float2(优化)、生成 int4(R、G、B、A)输出向量(优化)。减少步骤 (RGBA) => (RGB)
  • 需要的数学知识是可以接受的(简单的公式)

问候,斯特凡

于 2013-03-22T09:43:50.453 回答
0

在矩阵乘法之后,我会说图像卷积(例如模糊、去噪等)。查看AMD 的教程

于 2010-03-14T22:27:30.767 回答
0

什么是“最微不足道的”是一个见仁见智的问题,但我会说计算 Mandelbrot 集的图像是使用 GPU 的一个非常简单的应用程序。每个点都完全独立于其他点,因此您可以为每个点启动一个线程并获得巨大的加速。被迭代的公式本身是一个简单的二次函数。我在可以在我的博客上找到的教程中使用它作为示例只是计算数字,甚至没有制作图像以使其更简单。几乎任何令人尴尬的并行(参见维基百科条目)问题都是一个很好的开始。

于 2010-05-18T02:13:42.290 回答