主要考虑两种PI的计算方法 , 一种为积分法的用共享内存试的GPU实现, 另外一种为在面积估算MPI伪代码实现。
1.积分法求pi
// 计算PI
// 算法:在[0,1]范围内积分 1/(1+x*x)
// 做积分,把每一个block中的和放入sum对应的下标中
__global__ void kernel1(float* sum, int num){
int gid = blockIdx.x*blockDim.x+threadIdx.x;//线程索引
float temp;
extern float __shared__ pi[]; // 每一个block中的共享内存
pi[threadIdx.x] = 0.0; // 初始化
__syncthreads();
// 计算积分 , 放入对应线程里
while(gid < num){
temp = (gid + 0.5f) / num;
pi[threadIdx.x] += 4.0/(1 + temp*temp);
gid += blockDim.x * gridDim.x
}
// 对每一个block归约求和
for(int i=(blockDim.x>>1);i>0;i>>=1){
if(threadIdx.x<i){
pi[threadIdx.x] += pi[threadIdx.x+i];
}
__syncthreads();
}
if(threadIdx.x==0)
sum[blockIdx.x]=s_pi[0];
}
}
// 对sum在执行一次归约求和
__global__ void kernel2(float *sum,int num,float *pi){
int id&