在OpenCL中比较uchar数组的最快方法

时间:2016-02-03 12:08:35

标签: optimization opencl

我需要在opencl programm中做很多比较。现在我就这样做了

int memcmp(__global unsigned char* a,__global unsigned char* b,__global int size){
    for (int i = 0; i<size;i++){
         if(a[i] != b[i])return 0;
    }
    return 1;
}

我怎样才能让它更快?也许使用像uchar4或其他东西的矢量?谢谢!

1 个答案:

答案 0 :(得分:1)

我猜你的内核为每个线程计算“size”元素。我认为如果您的访问更加合并,您的代码可以得到改善。由于当前GPU的L1缓存,这不是一个大问题,但它可能意味着明显的性能损失。例如,您有4个线程(工作项),大小= 128,因此缓冲区有512个uchars。在你的情况下,线程#0接受[0]和b [0],但它带来缓存[0] ... a [63]和b相同。线程#1属于相同的warp(aka波前)访问[128]和b [128],因此它带来缓存a [128] ... a [191]等。在线程#3之后所有缓冲区在缓存中。考虑到这个域的小尺寸,这不是问题。

但是,如果每个线程连续访问每个元素,则只需要一个“缓存行”来执行4个线程(访问将被合并)。当考虑每个块的更多线程时,行为将更好。请试一试,告诉我你的结论。谢谢。

见:http://www.nvidia.com/content/cudazone/download/opencl/nvidia_opencl_programmingguide.pdf第3.1.2.1节 它有点旧,但它们的概念并不那么古老。

PS:顺便说一句,在此之后我会尝试使用你评论的uchar4以及“循环展开”。