0%

C语言使用并行执行的for循环

C语言使用并行执行的for循环

头文件

#include <omp.h>

编译指令

g++ test111.cpp -o paraCpp111 -fopenmp
  • 注意要添加-fopenmp选项

设置线程数量

#pragma omp parallel
omp_set_num_threads(2); //参数为线程的数量

使用parallel的for循环

#pragma omp parallel for
for(int i = 0;i<max;++i)
{
printf("%d\n", i);
}
  • 注意#pragma omp parallel for这句必须和for循环紧邻,中间不能有其他语句,否则会出错

执行效果

不进行线程设置和线程设置为2的效果对比:

    printf("1线程\n");
before = clock();

for(int i = 0;i<max;++i)
{
printf("%d\n", i);
}
timePeriod = clock()-before;
cout<<timePeriod<<'!'<<endl;
printf("2线程\n");
// 此处设置了2线程
#pragma omp parallel
omp_set_num_threads(2);

before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
printf("%d\n", i);
}
timePeriod = clock()-before;
cout<<timePeriod<<'!'<<endl;

输出对比:

  • image-20220622153605823

  • 注意到没有开启并行for循环的输出是按照顺序的,开启的输出是乱序的

  • 同时经过尝试发现,假如开启了并行for循环的输出但是指定线程为1的,输出仍然是乱序的,暂时还不清楚原因

对比大量计算和多组计算:

#include <iostream>
#include <omp.h>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
int max = 1e8;
int before, timePeriod;
int array1[100];
int array2[100];
int array4[100];
int array8[100];
for(int count = 0;count<100;++count)
{
#pragma omp parallel
omp_set_num_threads(1);
// printf("1线程\n");
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("2线程\n");
array1[count] = timePeriod;
#pragma omp parallel
omp_set_num_threads(2);
// printf("2线程\n");
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("4线程\n");
array2[count] = timePeriod;
#pragma omp parallel

omp_set_num_threads(4);
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("8线程\n");
array4[count] = timePeriod;
#pragma omp parallel

omp_set_num_threads(8);
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock() - before;
// cout<<timePeriod<<'!'<<endl;
array8[count] = timePeriod;
}

ofstream out;
out.open("data.csv", ios::out);

for(int cnt = 0;cnt<100;++cnt)
{
out<<array1[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array2[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array4[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array8[cnt]<<',';
}
out<<endl;

out.close();
system("python3 showData.py");
}

  • 其中分别开启1、2、4、8线程,进行for循环的计算,对比所需时间(通过clock()进行测量),最后调用命令行脚本system,开启另外撰写的python脚本进行数据折线图的显示

  • image-20220622154102661

    • 上图是分别开启1、2、4、8线程的计算结果
  • 对于代码进行简单修改,在1线程的时候取消对于parallel的使用,实验结果如下图

  • image-20220622154349763

    • 可见结果在1线程的时候,某些情况下会占用很长的时间
#include <iostream>
#include <omp.h>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
int max = 1e8;
int before, timePeriod;
int array1[100];
int array2[100];
int array4[100];
int array8[100];
for(int count = 0;count<100;++count)
{
// #pragma omp parallel
// omp_set_num_threads(1);
// printf("1线程\n");
before = clock();
// #pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("2线程\n");
array1[count] = timePeriod;
#pragma omp parallel
omp_set_num_threads(2);
// printf("2线程\n");
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("4线程\n");
array2[count] = timePeriod;
#pragma omp parallel

omp_set_num_threads(4);
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock()-before;
// cout<<timePeriod<<'!'<<endl;
// printf("8线程\n");
array4[count] = timePeriod;
#pragma omp parallel

omp_set_num_threads(8);
before = clock();
#pragma omp parallel for
for(int i = 0;i<max;++i)
{
// cout<<i<<endl;
}
timePeriod = clock() - before;
// cout<<timePeriod<<'!'<<endl;
array8[count] = timePeriod;
}

ofstream out;
out.open("data.csv", ios::out);

for(int cnt = 0;cnt<100;++cnt)
{
out<<array1[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array2[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array4[cnt]<<',';
}
out<<endl;

for(int cnt = 0;cnt<100;++cnt)
{
out<<array8[cnt]<<',';
}
out<<endl;

out.close();
system("python3 showData.py");
}