炼数成金 门户 CUDA 查看内容

OpenMP多线程应用程序编程技术之循环并行化

2015-9-11 13:43| 发布者: 炼数成金_小数| 查看: 1224| 评论: 0|原作者: beck_zhou

摘要: 循环并行化是使用OpenMP并行化程序的最重要部分。由于大量科学计算程序将很大一部分的的时间用在处理循环计算上,而对于循环并行化处理来说,这一部分的应用非常关键,因此循环并行化在OpenMP应用程序中是一个相对独 ...

编程 C++ 科学计算 编程技术

2.3 OpenMP多线程应用程序编程技术
2.3.1循环并行化
循环并行化是使用OpenMP并行化程序的最重要部分。由于大量科学计算程序将很大一部分的的时间用在处理循环计算上,而对于循环并行化处理来说,这一部分的应用非常关键,因此循环并行化在OpenMP应用程序中是一个相对独立且非常重要的组成部分。在C/C++中,循环并行化语句的编译指导语句的格式为:
#pragma omp parallel for [clause[clause…]]
     for (index = first ; test_expression ; increment_expr) {body of the loop; }
使用这个编译指导语句能将for循环中工作分配到一个线程组中,而线程组中的每一个线程将完成循环中的一部分内容。
需要并行化的语句有一定的限制。首先,并行化的语句必须是for循环语句,且能够确定循环次数。其次,循环语句快应该是单出口单入口的。即在循环的过程中不允许没有执行完所有的循环就跳出循环,也不能从循环的外面跳到循环中。

由于多个线程同时执行循环语句中的功能指令,这就涉及到数据的作用域问题。这里所说的作用域是用来控制某一变量是否是在各个线程之间共享或者是某一个线程私有的。数据的作用域子句用shared来表示变量是在各个线程之间共享的,而用private来表示变量是一个线程私有的。在OpenMP中,如果没有指定变量的作用域,则默认的变量作用域是共享的。为了对一个循环进行并行化操作,必须要保证数据两次循环之间不存在数据相关性。数据相关性又称为竞争。当两个线程对一个数据进行操作,并且有一个操作为写操作时,就说明这两个线程存在数据竞争。此时读出的数据不一定就是前一次写操作写入的数据,而写入的数据也可能并不是程序所需要的。如下面这段代码必须使用private声明变量j是私有的,否则将发生数据竞争。
#pragma omp parallel for private(j)
    for(i=0; i
       j++;

鲜花

握手

雷人

路过

鸡蛋

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

热门文章

     

    GMT+8, 2020-1-29 00:40 , Processed in 0.142227 second(s), 23 queries .