openMP并不是只能对循环来并行的,循环并行化单独拿出来说是因为它在科学计算中非常有用,比如向量、矩阵的计算。所以我单独拿出这一部分给大家讲讲。这里主要讲解的是for循环。
编译指导语句:
一般格式:
#pragma omp parallel for [clause[clause…]]
for(index = first; qualification; index_expr)
{…}
第一句中[]的部分是可选的,由自己的程序并行特点而定。大家先不要把精力放到这里面。后面的文章中会继续讲解的。
并行化for的编写规则
1、index的值必须是整数,一个简单的for形式:for(int i = start; i < end; i++){…} 。
2、start和end可以是任意的数值表达式,但是它在并行化的执行过程中值不能改变,也就是说在for并行化执行之前,编译器必须事先知道你的程序执行多少次,因为编译器要把这些计算分配到不同的线程中执行。
3、循环语句只能是单入口但出口的。这里只要你避免使用跳转语句就行了。具体说就是不能使用goto、break、return。但是可以使用continue,因为它并不会减少循环次数。另外exit语句也是可以用的,因为它的能力太大,他一来,程序就结束了。
例子讲解
例1、for循环并行
#include
#include "omp.h"
int main(int argc, char* argv[])
{
int i;
#pragma omp parallel for
for (i = 0; i < 12; i++)
{ printf("i = %d %d/n", i, omp_get_thread_num()); }
return 0;
}
例1的执行结果如图1所示:
图1、例1的执行结果