VS2010中Parallel并行-MARK

本文详细介绍了如何通过OpenMP实现单线程的并行化,包括开启OpenMP支持、引入头文件、并行化for循环的基本操作及原理,通过实例展示了并行化后的执行效果和CPU使用率的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://tech.it168.com/a2010/0318/862/000000862631.shtml

http://baike.baidu.com/view/1687659.htm


单线程的并行机制,可以并行for循环,也可以并行两个方法。需注意公共参数的使用。

只要将 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%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值