并行计算 VS2017+OpenMP环境配置

1、实验目标
(1) 利用visual studio 2017配置OpenMP环境;
打开VisualStudio 2017菜单栏->文件->新建->项目:新建Visual C++工程 :Windows控制台应用程序

这里写图片描述

Figure 1 新建Parallel_Lab1_Martrix-Vecter项目
打开菜单栏->项目->Parallel_Lab1_Martrix-Vecter(视自己新建项目名,最下面一栏)属性->配置属性->C/C++->语言->OpenMp 支持:选择是(/openmp)。(这一步是为了支持openmp。)点击“应用”。

打开项目的OpenMP支持

Figure 2 打开项目的OpenMP支持

打开菜单栏->项目->属性-> Parallel_Lab1_Martrix-Vecter(视自己新建项目名,最下面一栏)属性->配置属性->代码生成—>运行库:选择多线程调试(/Mtd)。(这一步是为了支持多线程。)点击“应用”。

打开项目的多线程支持

Figure 3 打开项目的多线程支持

打开菜单栏->项目->属性-> Parallel_Lab1_Martrix-Vecter(视自己新建项目名,最下面一栏)属性->配置属性->调试->命令参数: 在空白栏填入main函数的输入参数(argv[i]的值)。如需多个参数,用空格分隔每个参数,此处暂编辑输入“12”。

设置main函数的输入参数

Figure 4 设置main函数的输入参数

(2)对以下算法利用OpenMP实现并行化。
i. Martrix-Vecter 乘法;

ii梯形积分法;

梯形积分法示意图

Figure 5 梯形积分法示意图
iii奇偶变换排序

2、串行程序代码
Martrix-Vector乘法:
Function: Mat_vect_mult
Purpose: Multiply a matrix by a vector
In args: A: the matrix
x: the vector being multiplied by A
m: the number of rows in A and components in y
n: the number of columns in A components in x
Out args: y: the product vector Ax
/*------------------------------------------------------------------
void Mat_vect_mult(
                   double  A[]  /* in  */, 
                   double  x[]  /* in  */, 
                   double  y[]  /* out */,
                   int     m    /* in  */, 
                   int     n    /* in  */) {
   int i, j;

   for (i = 0; i < m; i++) {
      y[i] = 0.0;
      for (j = 0; j < n; j++)
         y[i] += A[i*n+j]*x[j];
   }
}  /* Mat_vect_mult */
*/

梯形积分法:
/*------------------------------------------------------------------
 * Function:    Trap
 * Purpose:     Estimate integral from a to b of f using trap rule and
 *              n trapezoids
 * Input args:  a, b, n, h
 * Return val:  Estimate of the integral 
 */
double Trap(double a, double b, int n, double h) {
   double integral;
   int k;

   integral = (f(a) + f(b))/2.0;
   for (k = 1; k <= n-1; k++) {
     integral += f(a+k*h);
   }
   integral = integral*h;

   return integral;
}  /* Trap */

/*------------------------------------------------------------------
 * Function:    f
 * Purpose:     Compute value of function to be integrated
 * Input args:  x
 */
double f(double x) {
   double return_val;

   return_val = x*x;
   return return_val;
}  /* f */


奇偶变换排序:
/*-----------------------------------------------------------------
 * Function:     Odd_even_sort
 * Purpose:      Sort list using odd-even transposition sort
 * In args:      n
 * In/out args:  a
 */
void Odd_even_sort(
      int  a[]  /* in/out */, 
      int  n    /* in     */) {
   int phase, i, temp;

   for (phase = 0; phase < n; phase++) 
      if (phase % 2 == 0) { /* Even phase */
         for (i = 1; i < n; i += 2) 
            if (a[i-1] > a[i]) {
               temp = a[i];
               a[i] = a[i-1];
               a[i-1] = temp;
            }
      } else { /* Odd phase */
         for (i = 1; i < n-1; i += 2)
            if (a[i] > a[i+1]) {
               temp = a[i];
               a[i] = a[i+1];
               a[i+1] = temp;
            }
      }
}  /* Odd_even_sort */
 

转:https://blog.csdn.net/qq_35012681/article/details/80004509

你可能感兴趣的:(openMP)