欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

For parallel

程序员文章站 2022-07-12 19:58:37
...
// 循环并行化(loop parallelize)是指使用OpenMP的parallel for
// 指导语句将C/C++的for循环并行化,即将循环中的迭代(平均)
// 分配给线程组中的各个线程分别执行后在汇总。
// 格式#pragma omp parallel for[子句[子句...]](换行符)
// 限制,必须是for循环
// 循环并行化编译指导语句可以加载任意一个循环(包括嵌套循环)
// 之前,则对应的最近的循环语句(不是外嵌套循环)被并行化
// 子句可以是下列的语句;
// Schedule(type [,chunk])
// ordered
// private(list)
// firstprivate(list)
// lastprivate(list)
// shared(list)
// reduction(operator: list)
// nowait
// 其中的schedule子句描述如何将循环的迭代划分线程组中的线程
// 如果没有指定块(chunk)大小,迭代会尽可能的平均分配给每个
// 线程;type为static时,循环被分成大小为chunk的块,静态
// 分配给线程;type为dynam时,循环被动态划分为大小为chunk
// 的块,动态分配给线程

// 当N固定,每个线程执行的循环的大小不同,也会影响执行所需时间
const int N = 100000000;
const int ChunkSize = 10000;

long lStart = GetTickCount();
int i, chunk;
float *a = new float[N];
float *b = new float[N];
float *c = new float[N];
for(i = 0; i < N; i++)
    a[i] = b[i] = i * 1.0;
chunk = ChunkSize;
long lEnd = GetTickCount();
cout << "未并行化循环所用时间:" << lEnd - lStart << endl;

// 每个线程执行100个循环
lStart = GetTickCount();
#pragma omp parallel for shared(a, b, c, chunk) private(i) schedule(static, chunk)
for(i = 0; i < N; i++)
    a[i] = b[i] = i * 1.0;
    //c[i] = a[i] + b[i];
lEnd = GetTickCount();
cout << "并行化循环所用时间:" << lEnd - lStart << endl;
相关标签: openmp