[普通]OpenMP

作者(passion) 阅读(1328次) 评论(0) 分类( c++)

要在Visual C++2015 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。

而要将 for 循环并行化处理,该怎么做呢?非常简单,只要在前面加上一行

#pragma omp parallel for

就够了!

也可以实际用一段简单的程序,来弄清楚它的运作方式。

#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 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~

而要怎么确定真的有跑多执行绪呢?如果本来有多处理器多核心处理器或有 Hyper Thread 的话,一个单执行绪程序,最多只会把一颗核心的使用量吃完;像比如说在 Pentium 4 HT 上跑,单一执行绪的程序,在工作管理员中看到的 CPU使用率最多就是 50%。而利用 OpenMP 把回圈进行平行化处理后,就可以在执行回圈时,把两颗核心的 CPU 都榨光了!也就是CPU使用率是100%。


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:互斥锁、读写锁 、 自旋锁和RCU锁
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img