并行计算实验2--多结点运行程序

并行计算实验2

2021.11.24

创建结点

docker run --rm --name=node1 --network=mpi-net -v /root/program:/root/program -itd  mpi-centos

image-20211124164625995

查看结点

image-20211124165112642

进入结点

docker exec -it e21c327ef219 /bin/bash

由于我们的共享地址是 :/root/program,所以将server文件创建在这里,编译后的文件也放在这里

创建servers文件

#当前目录是/root/program
vi servcers 
node1:3
node2:3
node3:3

编译cpi文件到此

mpicc /root/mpich-3.2/examples/cpi.c -o /root/program/cpi

当前的文件:ls

image-20211124173909054

执行编译

mpirun -n 9 -f ./servers ./cpi

image-20211124173330544

三.MPI程序演示

新建pi.c

#include <stdio.h>
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <mpi.h> 

void read_num(long long int *num_point,int my_rank,MPI_Comm comm); 
void compute_pi(long long int num_point,long long int* num_in_cycle,
                long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank); 

int main(int argc,char** argv){ 
    long long int num_in_cycle,num_point,total_num_in_cycle,
    local_num_point; 
    int my_rank,comm_sz; 
    double begin,end; 
    MPI_Comm comm; MPI_Init(NULL,NULL);//初始化 
    comm=MPI_COMM_WORLD; 
    MPI_Comm_size(comm,&comm_sz);//得到进程总数 MPI_Comm_rank(comm,&my_rank);//得到进程编号 

    read_num(&num_point,my_rank,comm);//读取输入数据begin=MPI_Wtime();
    compute_pi(num_point,&num_in_cycle,&local_num_point,comm_sz,&total_num_in_cycle,comm,my_rank); 
    end=MPI_Wtime(); 
    if(my_rank==0){ printf("Elapsing time: %fs\n",end-begin); } 
    MPI_Finalize(); 
    return 0; 
} 

void read_num(long long int* num_point,int my_rank,MPI_Comm comm){ 
    if(my_rank==0){ 
        printf("please input num in sqaure \n"); scanf("%lld",num_point); } 
    MPI_Bcast(num_point,1,MPI_LONG_LONG,0,comm); 
} 

void compute_pi(long long int num_point,long long int* num_in_cycle,long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank){
    *num_in_cycle=0; 
    *local_num_point=num_point/comm_sz; 
    double x,y,distance_squared; 
    srand(time(NULL)); 
    for(long long int i=0;i< *local_num_point;i++){ 
        x=(double)rand()/(double)RAND_MAX; 
        x=x*2-1; 
        y=(double)rand()/(double)RAND_MAX; 
        y=y*2-1; 
        distance_squared=x*x+y*y; 
        if(distance_squared<=1) 
            *num_in_cycle=*num_in_cycle+1; 
    } MPI_Reduce(num_in_cycle,total_num_in_cycle,1,MPI_LONG_LONG,MPI_SUM,0,comm); 
    if(my_rank==0){ 
        double pi=(double)*total_num_in_cycle/(double)num_point*4; printf("the estimate value of pi is %lf\n",pi); 
    } 
}

编译

mpicc pi.c -std=c99 -o pi  #不写后面会报错

image-20211124175810284

运行

mpirun -n 1 ./pi

image-20211124180114880

### 数据结构与并行计算面试题目 #### 数组和链表的区别 数组是一种线性的数据结构,它由相同类型的元素组成,并且这些元素存储在连续的内存位置中。访问数组中的任意元素的时间复杂度为O(1),因为可以通过索引直接定位到所需元素的位置[^1]。 相比之下,链表是由一系列节点组成的集合,每个节点包含两个部分:一个是存储的数据项;另一个是指向下一个节点的指针。由于这种链接方式,在遍历链表时需要逐个检查每一个结点直到找到目标为止,因此查找特定元素的操作时间复杂度为O(n)。 #### 核处理器、众核处理器以及GPU的作用 核处理器指的是在同一芯片上有个独立的核心单元能够并发运行程序的不同部分。这使得应用程序可以在同一时间内完成更的工作量从而提高效率。对于那些可以被分解成许子任务的工作负载来说尤其有用,比如矩阵乘法运算或是视频编码过程等[^2]。 众核处理器则进一步增加了核心的数量,旨在提供更高的吞吐率以应对更加复杂的计算需求。这类架构非常适合于大规模科学仿真或者机器学习训练这样的场景下使用。 图形处理单元(Graphics Processing Unit,GPU)最初是为了加速计算机图形渲染而设计出来的专用硬件设备。然而随着技术的发展,人们发现它们同样适用于其他领域内的高性能计算任务——特别是当面对着诸如图像识别之类的大规模并行化问题时表现尤为出色。这是因为GPU拥有大量的流式处理器(SM),能够在短时间内同时执行数千条相似性质但又相互独立的小型指令集。 #### SIMD的概念及其应用场景 单指令数据(SIMD)意味着一条指令能作用于一组不同的输入值之上。具体而言就是说如果存在N个待处理的数据,则只需要发出一次命令就可以让所有这些数值都被相应地加以变换。这种方法极大地提高了单位周期内所能做的有效工作的数量,进而加快了整个系统的响应速度。典型的应用实例涵盖了媒体文件压缩解码器、三维建模软件包还有金融风险评估模型等方面[^3]。 #### 并行计算的实际用途举例说明 并行计算广泛应用于各个行业当中,尤其是在科学研究和技术开发方面发挥着不可替代的重要角色。例如气象预报机构利用超级计算机集群来进行全球气候模式预测; 生物学家借助DNA测序仪快速解析遗传物质的信息片段以便更好地理解生命现象背后的规律; 物理学家依靠粒子碰撞实验装置探索微观世界的奥秘等等。上述例子均涉及到海量级别的原始观测资料整理分析工作,只有采用高效的分布式框架才能满足实时性和精确性两方面的严格要求[^4]。 ```python def parallel_computing_example(data_chunks): from multiprocessing import Pool def process_chunk(chunk): result = [] for item in chunk: processed_item = some_processing_function(item) result.append(processed_item) return result with Pool() as pool: results = pool.map(process_chunk, data_chunks) final_result = sum(results, []) return final_result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

魔芋小灰菜

不要下次一定,要一键三连

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

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

打赏作者

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

抵扣说明:

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

余额充值