Optimization 在OpenCL中比较uchar阵列的最快方法

Optimization 在OpenCL中比较uchar阵列的最快方法,optimization,opencl,Optimization,Opencl,我需要在opencl程序中进行许多比较。现在我把它做成这样 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; } int memcmp(uuu全局无符号字符*a、uu全局无符号字符*b、u全局整数大小

我需要在opencl程序中进行许多比较。现在我把它做成这样

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;
}
int memcmp(uuu全局无符号字符*a、uu全局无符号字符*b、u全局整数大小){

对于(int i=0;i我猜内核会为每个线程计算“大小”元素。我认为,如果您的访问更加合并,您的代码可以得到改进。由于当前GPU的L1缓存,这不是一个大问题,但可能会带来明显的性能损失。例如,您有4个线程(工作项),size=128,因此缓冲区有512个uchar。在您的例子中,线程#0访问a[0]和b[0],但它带来缓存a[0]…a[63],而b也是如此。线程#1属于同一个扭曲(也称为波前)访问a[128]和b[128],因此它带来缓存a[128]…a[191],等等。在线程#3之后,所有缓冲区都在缓存中。考虑到此域的较小大小,这不是一个问题

但是,如果每个线程连续访问每个元素,则在执行4个线程时,始终只需要一条“缓存线”(访问合并)。考虑到每个块有更多线程时,性能会更好。请尝试一下,并告诉我您的结论。谢谢

见:第3.1.2.1节 这有点旧,但他们的概念并不太旧


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

只是另一个减少,所有的总和不应超过0