什么是在GPU上计算的最简单的功能?

han*_*der 8 gpgpu opencl

我刚刚开始学习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];
}
Run Code Online (Sandbox Code Playgroud)

我假设你永远无法证明在GPU上计算这一点,内存传输会减重在CPU上计算这个数量的时间(我可能错了,因此这个问题).

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

Foo*_*ofy 6

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

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