同步课 / 并行计算

创建了 #并行计算# 任务:

任务一:计算矩阵课堂实验
10*10矩阵,大家结组计算: 第一组,1个人算; 第二组,2个人算;A按列划分2部分,B划分2部分; 第三组,5个人算;A按行划分5部分,B不划分; 第四组,5个人算;A按列划分5部分,B...

创建了 #并行计算# 任务:

任务四:用程序实现1000*1000的矩阵相乘
1.用程序实现两个1000*1000的矩阵A和B相乘得到矩阵C(串行程序) 2.找到计算点,描述应如何进行并行化分解

创建了 #并行计算# 任务:

任务三:一个进程组,用非阻塞通信循环发送接收数据
前提:包含三个进程的通信组, 用非阻塞通信循环发送接收count=60000个整型数据。 输出:要求打印每个进程接收缓冲里第50000个数据即recvbuf[50000],并检查收到的数据是否正确

创建了 #并行计算# 任务:

任务二:用C++多线程技术实现10个缓冲区的生产者消费者的问题
现在有10个缓冲区,每个是一个整型空间。 用C++编写一个程序,生产者负责向缓冲区里放数据,消费者取缓冲区的数据,满则不能放,空则不能取,不能同时对一个区进行存取。 每次存取打印一句话即可。 提示,四个类:缓冲区、生产者、消费者、调度者main。 ...

 #include <stdio.h>

#include <stdlib.h>

#include <string.h>

void product_matrix(int m, int n);

void dynamic_arr(int*** arr, int m, int n);

 void input_arr(int*** arr, int m, int n);

 void free_arr(int*** arr, int x);int main(){ 

               int m, n;

               printf("请输入m,n:\n"); 

              scanf("%d,%d", &m, &n);

              product_matrix(m, n);

                          return 0;

}

void product_matrix(int m, int n{

    int i, x, y, sum;

    int** arr_a;    int** arr_b;

    int** arr_res;

    input_arr(&arr_a, m, n);

    input_arr(&arr_b, n, m);

    dynamic_arr(&arr_res, m, m);

    printf("矩阵相乘的结果为:\n");

    for(x = 0; x < m; x++)

    {

        for(y = 0; y < m; y++)

        {

            sum = 0; 

           for(i = 0; i < n; i++) 

           {

                sum = sum + arr_a[x][i] * arr_b[i][y];

            }

            arr_res[x][y] = sum; 

           printf("%5d", arr_res[x][y]); 

       }

        printf("\n");

    }

    free_arr(&arr_a, m);

    free_arr(&arr_b, n);

    free_arr(&arr_res, m);}void dynamic_arr(int*** arr, int m, int n)

                          //申请动态数组{

         int i;

    *arr = (int **)malloc(sizeof(int *) * m);

         for(i = 0; i < m; i++){

        (*arr)[i] = (int *)malloc(sizeof(int) * n);

        memset((*arr)[i], 0, sizeof(int) * n);

    }

     }

void input_arr(int*** arr, int m, int n)

                            //输入数组{

    int i, j;    dynamic_arr(arr, m, n);

     printf("请输入%d个整数:\n", m * n);

    for(i = 0; i < m; i++)

    {

        for(j = 0; j < n; j++){

            scanf("%d", &(*arr)[i][j]);

    }    printf("输出数组:\n");

    for(i = 0; i < m; i++)

    {

        for(j = 0; j < n; j++)

            printf("%5d", (*arr)[i][j]);

        printf("\n");

    }

    printf("\n");

}

void free_arr(int*** arr, int x)                                      //释放占用的内存{

    int i;    for(i = 0; i < x; i++)

     {

        free((*arr)[i]);

        (*arr)[i] = 0;

    }

    free(*arr);

          *arr = 0;

}

(1). 将A和C按行分为np块,将B按列分为np块(B可以按列存储);(2). 进程号为 id 的进程读取 A 和 B 的第id个分块;(3). 循环np次:<1>. 各个进程用各自的A、B分块求解C的分块;<2>. 轮换B的分块(例如:id 号进程发送自己当前的B的分块到 id+1号进程)

课程学员
3班-王占健
3班-马星
3班-周钰凯
7班-霍赛赛
8班-申佳媚
201407王振儒
201403wanglin
4班-王天雷
8班-李晓莹