方案一,递归调用的方式,同前文
//并行规约
//参数含义:L为数据总长度,length是当前线程的计算长度。
template <class T>
T omp_reduction1(T*data ,int length,int L)
{
if (length == 1) return *data;
int strize = pow(2,log(L)/log(2)-log(length)/log(2));
for (int i = 0; i <L; i++)
{
if (i%(2*strize)==0)
{
data[i]+=data[i+strize];
}
}
omp_reduction1(data,length / 2,L);
}
方案二,不采用递归调用的代码,更加简洁
template <class T>
T omp_reduction1(T*data ,int length)
{
for (int strize = 1; strize < length; strize*=2)
{
for (int i = 0; i < length; i++)
{
if (i%(2*strize)==0)
{
data[i]+=data[i+strize];
}
}
}
return *data;
}