MP MPI GPU

引言
目前接触到的并行处理框架主要有MP、MPI、CUDA以及MapReduce(Hadoop、Spark)。MPI和MapRedcue(Hadoop、Spark)都可以在集群中运行,而MP因为共享存储结构的关系,不能在集群上运行,只能单机。另外,MPI、Spark让数据保留在内存中,可以为节点间的通信和数据交互保存上下文,所以能执行迭代算法,而Hadoop却不具有这个特性。因此,需要迭代的机器学习算法大多使用MPI、Spark来实现。当然,部分机器学习算法也是可以通过设计使用Hadoop来完成的。

  1. MP(openmp)
    代码
  2. MPI(mpich2)
    代码
  3. 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实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值