引言
目前接触到的并行处理框架主要有MP、MPI、CUDA以及MapReduce(Hadoop、Spark)。MPI和MapRedcue(Hadoop、Spark)都可以在集群中运行,而MP因为共享存储结构的关系,不能在集群上运行,只能单机。另外,MPI、Spark让数据保留在内存中,可以为节点间的通信和数据交互保存上下文,所以能执行迭代算法,而Hadoop却不具有这个特性。因此,需要迭代的机器学习算法大多使用MPI、Spark来实现。当然,部分机器学习算法也是可以通过设计使用Hadoop来完成的。
- MP(openmp)
代码 - MPI(mpich2)
代码 - GPU(cuda)
代码
OpenMP:由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。
int demo1()
{
clock_t t1 = clock();
#pragma omp parallel for
for (int i=0;i<8;i++)
{
int a = 0;
for (int i=0;i<100000000;i++)
{
a++;
}
}
clock_t t2 = clock();
return t2-t1;
}
int demo5()
{
int max = 0;
int sum=0;
int a[10] = {10,9,8,7,6,5,4,3,2,1};
#pragma omp parallel for
for (int i=0;i<10;i++)
{
int temp = a[i];
#pragma omp critical
{
sum+=a[i];
if (temp > max)
max = temp;
}
}
return max;
}
MPI
1、MPI是一个库,而不是一门语言。许多人认为,MPI就是一种并行语言,这是不准确的。但是,按照并行语言的分类,可以把FORTRAN+MPI或C+MPI看作是一种在原来串行语言基础之上扩展后得到的,并行语言MPI库可以被FORTRAN77/C/Fortran90/C++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别;
2、MPI是一种标准或规范的代表,而不特指某一个对它的具体实现,迄今为止,所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行;
3、MPI是一种消息传递编程模型,并成为这种编程模型的代表。事实上,标准MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的
int my_rank = 0, comm_sz = 0, n = 1024, local_n = 0;
double a = 0.0, b = 3.0, h = 0, local_a = 0, local_b = 0;
double local_int = 0, total_int = 0;
int source;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
h = (b - a) / n; /* h is the same for all processes */
local_n = n / comm_sz; /* So is the number of trapezoids */
local_a = a + my_rank*local_n*h;
local_b = local_a + local_n*h;
local_int = Trap(local_a, local_b, local_n, h);
if (my_rank != 0)
{
MPI_Send(&local_int, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
}
else
{
total_int = local_int;
for (source = 1; source < comm_sz; source++)
{
MPI_Recv(&local_int, 1, MPI_DOUBLE, source, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
total_int += local_int;
}
}
if (my_rank == 0)
{
printf("With n = %d trapezoids, our estimate\n", n);
printf("of the integral from %f to %f = %.15e\n", a, b, total_int);
}
MPI_Finalize();
CUDA
CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。
__global__ void
add(float *a,float *b,float *c)//__global__声明的函数,告诉编译器这段代码交由GPU执行
{
int i = threadIdx.x;
int sum = a[i]*a[i]*a[i]+b[i]*b[i]*b[i];
c[i] =sum;
}
参考文献
mpi,mpich,openmpi,openmp
mpi+python环境搭建
Python多核编程mpi4py实践