我有兴趣通过在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字节字的写入不会影响相邻字)。这样的共享向量是否会表现良好?
感谢您的帮助!
答案 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个结果。
最好尝试,然后做一些变化。