题目描述

如何通过两个线程实现并行加速下方循环体

1
2
for (i = 2; i < 20; i++)
a[i] = a[i-2]+4;

提示:通过将循环分解为多个循环,使各循环间不存在这样的依赖关系。

做题分析

可以将该循环按奇偶数转化为两个循环:

// 偶数
a[2]=a[0]+4
a[4]=a[2]+4
a[6]=a[4]+4
......

// 奇数
a[3]=a[1]+4
a[5]=a[3]+4
a[7]=a[5]+4
......

于是就拆解成了如下两个循环:

1
2
3
4
5
for (i = 2; i < 20; i = i+2)
a[i] = a[i-2]+4;

for (i = 3; i < 20; i = i+2)
a[i] = a[i-2]+4;

最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include"omp.h"
#include"stdio.h"
#define n 20

main()
{
int a[n], i;
for(i=0; i<n; i++)
a[i]=i;
omp_set_num_threads(4);
#pragma omp parallel num_threads(2)
#pragma omp for schedule(static,1)
for(i=2; i<n; i++)
a[i]=a[i-2]+4;

#pragma omp parallel
{
printf("\n");
#pragma omp critical
{
printf("%d:\n",omp_get_thread_num());
for(i=2; i<n; i++)
printf("%d",a[i]-a[i-2]);
}
printf("\n");
}
}

头文件中:

<stdio.h>时搜索的顺序:系统目录–>环境变量目录–>用户自定义目录

"stdio.h"时搜索的顺序:用户自定义目录–>系统目录–>环境变量目录

至于这区别带来的影响就是效率问题。如果一个你自己定义的头文件,你用<>来包含,那么搜索这个头文件时,将会先从系统目录查找。其实这个头文件可能就在你的工程目录下,但是还是要把系统目录搜索一遍,这样,自然就降低效率了。