大数据与算法——累加求和、求最大值、排序加速
大数据与算法作业介绍及加速方法解析
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);//递归右边
}

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

被折叠的 条评论
为什么被折叠?



