我需要在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或其他东西的矢量?谢谢!
答案 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以及“循环展开”。