多线程并行数组求和(相邻配对模式)

方案一,递归调用的方式,同前文

//并行规约
//参数含义: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;
}


发布了56 篇原创文章 · 获赞 30 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_17239003/article/details/78821648