Myers Diff是否适合在GPU上运行?

时间:2011-06-04 01:19:23

标签: opencl gpgpu gpu-programming

我有兴趣通过在GPU上运行它来实现更快的Myers diff实现,即使用OpenCL。我对算法有很好的理解,但对GPU编程不熟悉。我的预感是GPU不会表现良好,但我想听听想法和想法。

这是C中算法的一次迭代的描述。我们有两个常量缓冲区,分别是'left'和'right'(我们正在比较的数据),以及一个名为vector的int32共享可变数组。 'idx'是迭代索引。然后算法基本上是这样的:

   void myers_diff_iteration(const uint8 *left, const uint8 *right, int32 *vector, int32 idx) {
       int32 x = MAX(vector[idx-1], vector[idx+1]);
       int32 y = idx - x;
       while (left[x] == right[y]) {
           x++;
           y++;
       }
       vector[x] = x;
   }

我的猜测是,while循环(具有非常不可预测的迭代次数,范围从零到一百万)可能在GPU上非常糟糕,并且消除了任何性能增益。真的吗?有关如何改进它的任何提示?

此外,矢量在循环的所有迭代之间共享。每次迭代都会写入不同的位置,因此不需要同步(除了要求对对齐的4字节字的写入不会影响相邻字)。这样的共享向量是否会表现良好?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你可以试试。 GPU会在while循环中出现严重问题,但只要有足够的“迭代”(线程)运行,就不会有任何速度丢失。

你可以这样重写:

   void myers_diff_iteration(const uint8 *left, const uint8 *right, int32 *vector, int32 idx) {
       int id = get_global_id(0);
       int32 x = MAX(vector[idx-1], vector[idx+1]) + id;
       int32 y = idx - x + id;
       if (left[x] != right[y]) {
           vector[x] = x;
       }
   }

然后你只需要运行线程的最大循环数。但它只会产生每个OpenCL运行的向量的1个结果。

最好尝试,然后做一些变化。