Blues876 2023-03-13 21:39 采纳率: 38.5%
浏览 58
已结题

C语言问题求解,利用C语言求解

实验内容3. 进阶进程创建与控制
求数组长度为10000的浮点数(精确小数点右4位)计算值。
要求:
1.对于长度为10000的数组,随机生成10000个浮点数(父进程);
2.创建4个子进程,分别求2500个浮点数之和;
3.父进程完成10000个浮点数之和,并打印结果;
4.统计顺序计算的时间和多个进程采用多道程序设计完成计算的时间。

大家看看这个要怎么用C语言实现

  • 写回答

2条回答 默认 最新

  • weixin_46859822 2023-03-14 00:19
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/time.h>
    
    #define ARRAY_SIZE 10000
    #define CHILD_COUNT 4
    #define CHILD_ARRAY_SIZE (ARRAY_SIZE / CHILD_COUNT)
    
    double array[ARRAY_SIZE];
    
    double calculate_sum(int start, int end) {
        double sum = 0;
        for (int i = start; i < end; i++) {
            sum += array[i];
        }
        return sum;
    }
    
    int main() {
        // Generate random numbers
        for (int i = 0; i < ARRAY_SIZE; i++) {
            array[i] = (double)rand() / RAND_MAX;
        }
    
        // Sequential calculation
        struct timeval start_time, end_time;
        gettimeofday(&start_time, NULL);
    
        double sum = calculate_sum(0, ARRAY_SIZE);
    
        gettimeofday(&end_time, NULL);
        double seq_time = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec) / 1000000.0;
    
        printf("Sequential sum: %.4lf\n", sum);
    
        // Parallel calculation
        gettimeofday(&start_time, NULL);
    
        int pipefd[CHILD_COUNT][2];
        for (int i = 0; i < CHILD_COUNT; i++) {
            if (pipe(pipefd[i]) == -1) {
                perror("pipe");
                exit(EXIT_FAILURE);
            }
            pid_t pid = fork();
            if (pid == -1) {
                perror("fork");
                exit(EXIT_FAILURE);
            } else if (pid == 0) { // Child process
                close(pipefd[i][0]); // Close unused read end of pipe
                double sum = calculate_sum(i * CHILD_ARRAY_SIZE, (i + 1) * CHILD_ARRAY_SIZE);
                write(pipefd[i][1], &sum, sizeof(sum)); // Write sum to pipe
                close(pipefd[i][1]); // Close write end of pipe
                exit(EXIT_SUCCESS);
            } else { // Parent process
                close(pipefd[i][1]); // Close unused write end of pipe
            }
        }
    
        sum = 0;
        for (int i = 0; i < CHILD_COUNT; i++) {
            double child_sum;
            read(pipefd[i][0], &child_sum, sizeof(child_sum)); // Read sum from pipe
            sum += child_sum;
            close(pipefd[i][0]); // Close read end of pipe
        }
    
        gettimeofday(&end_time, NULL);
        double par_time = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec) / 1000000.0;
    
        printf("Parallel sum: %.4lf\n", sum);
    
        printf("Sequential time: %.6lf s\n", seq_time);
        printf("Parallel time: %.6lf s\n", par_time);
    
        return 0;
    }
    
    

    上述代码使用rand()函数生成10000个随机浮点数,并将它们存储在array数组中。然后,使用calculate_sum()函数计算数组的总和,该函数接受起始索引和结束索引作为参数。父进程首先计算整个数组的总和,然后使用fork()函数创建4个子进程,每个子进程都计算一个子数组的总和。每个子进程使用一个管道将其计算的总和写回父进程。最后,父进程从每个子进程的管道中读取它们的计算结果,并将所有子进程的总和相加以得到整个数组的总和。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: