struct {
int start;
int end;
}value[] = {
{0 , NUMBER >> 1},
{NUMBER >> 1, NUMBER}
};
以上代码是用于实现数据分解归约的数据结构。示例中此结构将数据分成两段分别取得首尾,方便函数调用。
- /* 自己手动分配任务(类似与划分与调度策略的static,轮转分配)
- * 第一种是每个线程分配的块里的任务是连续的, id*(N/Nthrds)-->(id+1) * (N / Nthrds);
- * 第二种每个线程分配的块里的任务是分散的,第id个,第id+Nthrrds个,第id+2*Nthrds。。。只到
- id+m*Nthrds>=N,。
- * 这两种思想的区别值得借鉴。
- */
- // 方法一
- printf("/n------------------------ 手动分配任务,方法一 ------------------
- --------/n");
- #pragma omp parallel
- {
- int i, istart, iend;
- int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();
- if (N/Nthrds == 0)
- {
- istart = id * (N / Nthrds);
- // 每个线程都完成N/Nthrds个任务,就是将N个任务平均分给Nthrds个线程,最后一个线程可能不足
- N/Nthrds个任务
- iend = (id+1) * (N / Nthrds);
- }
- else{
- istart = id * (N/Nthrds + 1);
- // 每个线程都完成N/Nthrds + 1个任务,最后一个线程可能不足N/Nthrds + 1个任务。或者可以每个线
- 程完成N/Nthrds个,最后一个线程多完成剩余的
- iend = (id+1) * (N/Nthrds + 1);
- }
- for(i=istart; i<iend && i<N; i++)
- {
- c[i] = a[i] + b[i];
- printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);
- }
- }
- for (int i=0;i<N;i++)
- {
- printf("c[%d]=%d/t", i, c[i]);
- c[i] = 0;
- }
- printf("/n------------------------ 手动分配任务,方法二 -------------------------
- /n");
- // 方法二
- #pragma omp parallel
- {
- int i, istart, iend;
- int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();
- iend = N;
- for(i=id; i<iend; i+=Nthrds)
- // 每个线程一次完成第id个任务,第id+Nthrrds个,第id+2*Nthrds。。。只到id+m*Nthrds>=N
- {
- c[i] = a[i] + b[i];
- printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);
- }
- }
- for (int i=0;i<N;i++)
- {
- printf("c[%d]=%d/t", i, c[i]);
- c[i] = 0;
- }
- return 0;
- }