我在理解如何实现CUDA共享内存方面遇到了一些问题,因为除了检查某个线程应该执行哪些计算之外,我没有使用线程号。
__global__ void gpu_histogram_equalization(unsigned char * img_out, unsigned char * img_in,
int * hist_in, int img_size, int nbr_bin, int numOfThreads, int * lut){
int i = 0;
int x = threadIdx.x + blockDim.x*blockIdx.x;
int start;
int end;
/* Get the result image */
if(x >= img_size) {
return;
}
start = ((img_size/numOfThreads) * x);
if(numOfThreads == 1) {
end = (img_size/numOfThreads);
}
else {
end = ((img_size/numOfThreads) * (x+1));
}
for(i = start; i < end; i ++){
if(lut[img_in[i]] > 255){
img_out[i] = 255;
}
else{
img_out[i] = (unsigned char)lut[img_in[i]];
}
}
}
任何人都可以澄清我的推测是真的,这是不可能利用共享内存?
答案 0 :(得分:1)
如果多次重复使用数据,使用共享内存可以提高性能。可以重写代码以利用更高的内存带宽并放弃使用共享内存。
这样的事情:
__global__ void gpu_histogram_equalization(unsigned char * img_out, unsigned char * img_in,
int * hist_in, int img_size, int nbr_bin, int numOfThreads, int * lut){
int lutval;
int x = threadIdx.x + blockDim.x*blockIdx.x;
/* Get the result image */
if(x >= img_size) {
return;
}
lutval = lut[img_in[x]];
if(lutval > 255){
img_out[x] = 255;
}
else{
img_out[i] = (unsigned char)lutval;
}
}