如何解决Myers Diff是否适合在GPU上运行?
| 我对通过在GPU(即OpenCL)上运行更快的Myers diff实现感兴趣。我对算法有很好的了解,但对GPU编程还是陌生的。我的直觉是GPU不能很好地运行,但是我想听听想法和想法。 这是对C语言中算法的一次迭代的描述。我们有两个常量缓冲区,分别为字节“'left \”和“'right \”(我们正在比较的数据),以及一个称为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字节字不会影响相邻的字)。这样的共享载体会表现良好吗?
谢谢你的帮助!
解决方法
你可以试试看。 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;
}
}
然后,您只需要运行线程的max while循环数。但是每次OpenCL运行时,只会产生1个向量结果。
最好尝试一下,然后做一些变化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。