【代码分析1】

  • 1 replies
  • 2021 views
*

sisiy

  • *****
  • 242
    • 查看个人资料
【代码分析1】
« 于: 十二月 11, 2018, 02:04:36 pm »
 
程序代码: [选择]
#include

__global__ void gpu_shared_memory(float *d_a)

{

 int i, index = threadIdx.x;

 float average, sum = 0.0f;

 //Defining shared memory

 __shared__ float sh_arr[10];

 sh_arr[index] = d_a[index];

 // This directive ensure all the writes to shared memory have completed

 __syncthreads();

 for (i = 0; i<= index; i++)

 {

 sum += sh_arr;

 }

 average = sum / (index + 1.0f);

 d_a[index] = average;

 //This statement is redundant and will have no effect on overall code

execution

 sh_arr[index] = average;

}





*

sisiy

  • *****
  • 242
    • 查看个人资料
(无标题)
« 回复 #1 于: 十二月 11, 2018, 02:06:05 pm »
线程0计算:[0]
线程1计算:[0] + [1]的平均
线程2计算:[0] + [1] + [2]的平均
线程3计算:[0] + [1] + [2] + [3]的平均
...



最后一个线程计算:
  • + ... [index]的平均。



但是这代码(或者对应的文字),没有说明平均的取值范围(但显然大于等于线程数量)


以及,采用了老式的C89写法(变量都在开头定义),这种写法已经不推荐了(因为不清晰和其他方面的原因)。例如for里面现在都是for (int i = 0....)。现代的写法清晰和安全很多(例如i被限定的生存周期在循环内)。

实际上这个代码,是典型的Shared Memory的带宽放大作用,也就是将global memory中的数据,手工缓冲到Shared Memory中,然后再从Shared Memory中读取。因为Shared Memory的延迟往往很低,带宽往往很大,所以很多时候能起到提速的效果。