(一)初步了解并行计算、OpenMP

(1) 什么是HPC?

High performance computing高性能计算,特点是使用多处理器

(2) 什么是并行计算?

并行计算是相对串行计算来说的,它是一种一次可执行多个指令的算法,目的是提高计算速度,解决大型而复杂的计算问题。

(3) 什么是OpenMp?

用于“共享内存并行系统的多处理器程序设计”的一套指导性的编译处理方案

(4) OpemMP支持的语言?

C/C++、Fortran

(5) OpenMP能干什么?

程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。

(6) 在Visual C++中使用OpenMP?

  1. Project->Properties->C/C++中的Language->OpenMP Support开启,编译器就支持OpenMP的语法了;
  2. 编写使用OpenMP的程序时,需要包含OpenMP的头文件:#include<omp.h>

(7) 将for循环并行处理?

在前面加上一行:#pragma omp parallel for

(8) 简单代码,理解运作方式?

#include <stdio.h>
#include <stdlib.h>
void Test(int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
for(int i = 0; i < 10; ++i)
Test(i);
system("pause");
}

上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void Test (int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
#pragma omp parallel for
for(int i = 0; i < 10; ++i)
Test( i );
system("pause");
}

够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!
0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~

参考:百度百科

猜你喜欢

转载自blog.csdn.net/lemon4869/article/details/53355574