在 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"。
我需要在 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"。