您的位置:首页 > 理论基础 > 数据结构算法

并行编程中用来分解数据的数据结构以及手动分配任务方法

2012-03-08 23:06 302 查看

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐