[多核并行计算]进程间通信-性能研究

 

首先介绍下多核并行计算的场景,及测试方法:

(1)并行计算运用在特定大型服务器之上,其硬件水平很高,可能有多几百到上千个cpu。

(2)这些cpu分成了2类,一类是控制cpu,作为主控,用于发起计算,与其他CPU交互,发起计算通知,分析并统计结果等作用;第二类是计算cpu(占大多数)。系统中绝大多数cpu属于计算cpu,因为整个系统就是为了高性能计算。由于计算量大,所以需要很多很多的cpu进行并行计算。每个cpu计算完后,将计算结果传回主控CPU。

(3)系统发起一次计算通知后,每个CPU核心会绑定一个进程开始进行实时运算。不同的CPU上运行着不同的实时进程,计算的通知和计算的结果,需要进程间通信,进行消息传递。并而且要求进程间通信的性能要足够的高,因为当cpu数量上涨到几百上千的时候,进程间通信的性能会影响到整个计算的结果收集。某些实时场景下,系统不允许某一次计算超期完成,这将导致整个业务的失败。

并行计算有知名的MPI库,如果不使用MPI,使用传统方式的linux IPC通信机制,比如管道,信号量,共享内存,消息队列等进程间通信方式。性能会是怎样的呢?下面对这几种IPC通信,进行性能研究。查看每种IPC之间的性能差距,及与MPI库做对比。形成性能分析报告。

首先采用管道方式来进行高性能密集并行计算。 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h> 
#include <math.h> 
#include <sys/time.h> 
#include <sys/stat.h>

#define SHARE_RFIFO_PATH "/home/rfifo"
#define SHARE_WFIFO_PATH "/home/wfifo"

int    on_cpu;
double dval = 1.23;

int create_process()
{
        int ret;
        pid_t pid;

        pid = fork();
        if(pid < 0) {
                perror("fork");
                return -1;
        }
        if(pid == 0) {

        } else {

        }
        return ret;
}

int gettimeofday(struct timeval *tv, struct timezone *tz);
int do_calc(int loop)
{
        int i;
        for(i=0; i<loop; i++) {
                dval *= sin(3.14159);
        }
}

int do_simulation(int loop_num, int one_loop_num)
{
        int i, count = 0;
        struct timeval tv1, tv2;
        long long us1, us2, ms1, ms2;
        long long ms, us;
        short skip = 2000;
        int max=-1, min = 99999999, val;
        for(i=0; i<loop_num; i++) {
                gettimeofday(&tv1, NULL);
                do_calc(one_loop_num);
                gettimeofday(&tv2, NULL);

                if(--skip < 0) {
                        us1 = (int64_t)tv1.tv_sec*1000*1000 + tv1.tv_usec;
                        us2 = (int64_t)tv2.tv_sec*1000*1000 + tv2.tv_usec;
                        ms1 = (int64_t)tv1.tv_sec*1000 + tv1.tv_usec/1000;
                        ms2 = (int64_t)tv2.tv_sec*1000 + tv2.tv_usec/1000;
                        us = us2 - us1;
                        ms = ms2 - ms1;
                        if(us > max)
                                max = us;
                        if(us < min)
                                min = us;
                        count++;
                        skip = 1000;
                }
        }
        printf("on cpu %d count %d, Jitter %d, max %d, min %d\n", \
                        on_cpu, count, max-min, max, min);
}

int main(int argc, char **argv)
{
        int i, ret = 0;
        int rfd, wfd;
        int len = 0;
        char rbuffer[64], wbuffer[64];

        pid_t pid;

        do_simulation(300000, 20000);
        return 0;

        rfd = mkfifo(SHARE_RFIFO_PATH, O_RDONLY);
        wfd = mkfifo(SHARE_WFIFO_PATH, O_WRONLY);
        if(rfd < 0 || wfd < 0) {
                perror("mkfifo:");
                return rfd|wfd;
        }

        len = read(rfd, rbuffer, sizeof(rbuffer));
        if(len < 0) {
                perror("read:");
                close(rfd);
                close(wfd);
        }




        while(1) sleep(1);
        return ret;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
Linux多核编程是指在Linux操作系统上使用多个处理核心进行程序开发和运行的技术。随着计算机硬件的发展,现代计算机通常具有多个处理核心,而如果程序无法充分利用这些核心,就无法发挥计算机的最大性能。 在Linux中,多核编程可以通过多种方法实现。其中一种常见的方法是使用多线程。多线程是在一个进程内创建多个线程,每个线程都可以独立执行代码。这样,不同的线程可以在不同的核心上并行执行,从而提高程序的运行效率。 另一种方法是使用进程间通信(IPC)来实现多核编程。通过创建多个进程,并通过管道、共享内存等方式进行通信,可以将任务划分为多个子任务,在不同的核心上同时运行,从而实现并行计算。 此外,Linux还提供了一些多核编程的工具和库,如OpenMP(Open Multi-Processing)和OpenMPI(Message Passing Interface),它们提供了一些高级的并行编程接口,帮助开发者更方便地进行多核编程。 值得注意的是,多核编程虽然可以提高程序的并行性和性能,但也带来了一些挑战。例如,需要考虑线程间的竞争和同步问题,避免出现死锁、竞态等并发问题。因此,在进行多核编程时,开发者需要仔细设计和优化程序,以提高并发性能并保证程序的正确性。 总的来说,Linux多核编程是一种利用多核处理器的并行计算能力,提高程序运行效率的技术。通过合理利用多线程、IPC和相关工具库,开发者可以更充分地利用计算机的硬件资源,提高程序的性能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值