BoyWithCode

Just a boy writes a code.

 

OpenMP:实现矩阵向量乘法

1.设矩阵为m行n列的矩阵,以时间为种子生成1-10内的随机数作为矩阵的元素
void Gen_Matrix(){
    srand(time(NULL));
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            mat[i][j] = rand() % 10 + 1;
        }
    }
}
2.生成一个长度为n的向量,以时间为种子生成1-10内的随机数作为向量的元素
void Gen_Vector(){
    srand(time(NULL));
    for (int i = 0; i < n; i++){
        vec[i] = rand() % 10 + 1;
    }
}
3.矩阵向量乘法函数:
void fun_mv(int a[], int cur){
    for (int i = 0; i < n; i++){
        ans[cur] += a[i] * vec[i];
    }
}
4.使用OpenMP实现并行计算:
void omp_mv(){
    int i;
    #pragma omp parallel 
    {
        int id = omp_get_thread_num();
        #pragma omp parallel for
        for (i = id; i < m; i += NUM_THREADS){
            fun_mv(mat[i], i);
        }
    }
}
5.完整程序:
#include <stdio.h>
#include <omp.h>
#include <stdlib.h>
#include <time.h>

const int NUM_THREADS = 2;
typedef long long ll;
const int m = 10, n = 10;
int mat[10][10];
int vec[10], ans[10];

void Gen_Matrix(){
    srand(time(NULL));
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            mat[i][j] = rand() % 10 + 1;
        }
    }
}

void Gen_Vector(){
    srand(time(NULL));
    for (int i = 0; i < n; i++){
        vec[i] = rand() % 10 + 1;
    }
}

void fun_mv(int a[], int cur){
    for (int i = 0; i < n; i++){
        ans[cur] += a[i] * vec[i];
    }
}

void omp_mv(){
    int i;
    #pragma omp parallel 
    {
        int id = omp_get_thread_num();
        #pragma omp parallel for
        for (i = id; i < m; i += NUM_THREADS){
            fun_mv(mat[i], i);
        }
    }
}

int main()
{
    printf("Makeing matrix(%d*%d) & vector(%d*1)...\n", m,n,n);
    Gen_Matrix();
    printf("matrix is: ");
    for (int i = 0; i < m; i++){
	printf("\n");
        for (int j = 0; j < n; j++){
            printf("%d  ", mat[i][j]);
        }
    }
    Gen_Vector();
    printf("\nvector is: \n");
    for (int i = 0; i < m; i ++){
        printf("%d  ", vec[i]);
    }
    omp_mv();
    printf("\nans is: \n");
    for (int i = 0; i < m; i ++){
        printf("%d  ", ans[i]);
    }
    printf("\n");
    return 0;
}
6.运行结果与计算器运算结果一致:

posted on 2023-05-11 16:26  chaodahao  阅读(233)  评论(0编辑  收藏  举报

导航