大数据与算法——累加求和、求最大值、排序加速(二)

本文介绍了一项关于大数据处理的任务,重点在于使用不同的加速技术来提升累加求和、求最大值和排序算法的效率。实验中采用了多线程、SSE指令集、OpenMP和CUDA等方法,并通过Socket通信实现双机分布式计算。

大数据与算法作业介绍及加速方法解析

1.作业介绍

1.1 作业要求

利用多种加速方式,实现对64*2000000个数据的累加求和、求最大值、排序三种算法的加速,采用两台计算机实现分布式计算,并通过Socket实现通信,尽可能提高加速比,加速手段可包括:多线程、多进程、SSE指令集、Openmp加速、Cuda显卡加速,以及拓展部分:实现非windows系统的算法加速。

其中关键的要求在于
1.数据量:64*2000000(可根据电脑性能自行减少,满足加速关系即可);
2.加速算法:累加求和、求最大值、排序三种算法;
3.通信方式:Socket(由于是双机加速,即为C/S模型;且由于UDP通信无法保证可靠性,故选择TCP通信,保证数据按时准确的传输)、RPC(使用此方法时会下降分数)
4.加速方式:加速方法不限,老师提供了以下几种:
多线程、多进程、SSE指令集、Openmp、Cuda加速;
5.扩展:使用非windows系统实现加速(我们选择了Linux下的Ubuntu系统)

1.2 概念解析

1.2.1 算法
累加求和

针对于累加则没有太多的算法上的研究,对于拥有强大计算能力的计算机来说,用循环累加即可,这里给出不加速版本的累加代码如下:

int mysum(const float data[], const int len, float &result) 
//data是原始数据,len为长度。结果通过函数返回
{
	double localresult = 0.0f;
	for (size_t i = 0; i < len; i++)
	{
		localresult += log(sqrt(rawFloatData[i] / 4.0));	//有意浪费时间
	}
	result = localresult;
	return 0;
}

这里使用localresult作为中间变量,是由于float变量在进行大数加法时,会由于误差无法将一个较小的数加进去,故选择用double类型作为中间量,最后再转回float

求最大值

由于数据是随机生成的,并无顺序可言,故求最大值也不存在什么加速算法,不加速版本如下:

int mymax(const float data[], const int len, float &result)
//data是原始数据,len为长度。结果通过函数返回
{
	double localresult = 0.0f;
	for (size_t i = 0; i < len; i++)
	{
		if (localresult <= log(sqrt(data[i] / 4.0)))
			localresult = log(sqrt(data[i] / 4.0));			//有意浪费时间
	}
	result = localresult;
	return 0;
}
排序

对于无序数组的排序算法则有很多,我们熟知的就有快速排序、选择排序、冒泡排序等,这里还给出了包括堆排序、归并排序、折半插入排序的C++代码

快速排序(递归实现)
void MyquickSort(int left, int right, float data[])
{
	if (left >= right)
		return;
	int i, j;
	float base, temp;
	i = left, j = right;
	base = data[left]  ;  //取最左边的数为基准数
	while (i < j)
	{
		while (data[j] >= base && i < j)
			j--;
		while (data[i] <= base && i < j)
			i++;
		if (i < j)
		{
			temp = data[i];
			data[i] = data[j];
			data[j] = temp;
		}
	}
	//基准数归位
	data[left] = data[i];
	data[i] = base;
	MyquickSort(left, i - 1, data);//递归左边
	MyquickSort(i + 1, right, data);//递归右边
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生如昭诩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值