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

Fastest way to compare uchar arrays in 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;
}

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

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

但是,如果每个线程连续访问每个元素,那么您的 4 个线程执行始终只需要一个 "cache line"(访问合并)。当每个块考虑更多线程时,行为会更好。请尝试一下,然后告诉我您的结论。谢谢。

参见:http://www.nvidia.com/content/cudazone/download/opencl/nvidia_opencl_programmingguide.pdf第 3.1.2.1 节 有点老了,但是他们的观念没那么老

PS:顺便说一下,在此之后我会尝试使用你评论的 uchar4 以及 "loop unrolling"。