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


struct {  
        int start;  
        int end;  
    }value[] = {  
        {0 , NUMBER >> 1},  
        {NUMBER >> 1, NUMBER}  
    };  



以上代码是用于实现数据分解归约的数据结构。示例中此结构将数据分成两段分别取得首尾,方便函数调用。

  1. /* 自己手动分配任务(类似与划分与调度策略的static,轮转分配) 
  2. *  第一种是每个线程分配的块里的任务是连续的, id*(N/Nthrds)-->(id+1) * (N / Nthrds); 
  3. *  第二种每个线程分配的块里的任务是分散的,第id个,第id+Nthrrds个,第id+2*Nthrds。。。只到 
  4.  
  5. id+m*Nthrds>=N,。 
  6. *  这两种思想的区别值得借鉴。 
  7. */  
  8.       
  9. // 方法一  
  10.         printf("/n------------------------ 手动分配任务,方法一 ------------------  
  11.   
  12. --------/n");  
  13. #pragma omp parallel  
  14.     {  
  15.         int i, istart, iend;  
  16.         int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();  
  17.         if (N/Nthrds == 0)  
  18.         {  
  19.             istart = id * (N / Nthrds);    
  20. // 每个线程都完成N/Nthrds个任务,就是将N个任务平均分给Nthrds个线程,最后一个线程可能不足  
  21.   
  22. N/Nthrds个任务  
  23.             iend = (id+1) * (N / Nthrds);  
  24.         }  
  25.         else{  
  26.             istart = id * (N/Nthrds + 1);   
  27. // 每个线程都完成N/Nthrds + 1个任务,最后一个线程可能不足N/Nthrds + 1个任务。或者可以每个线  
  28.   
  29. 程完成N/Nthrds个,最后一个线程多完成剩余的  
  30.             iend = (id+1) * (N/Nthrds + 1);  
  31.         }  
  32.           
  33.         for(i=istart; i<iend && i<N; i++)  
  34.         {  
  35.             c[i] = a[i] + b[i];  
  36.             printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);  
  37.         }  
  38.     }  
  39.     for (int i=0;i<N;i++)  
  40.     {     
  41.         printf("c[%d]=%d/t", i, c[i]);  
  42.         c[i] = 0;  
  43.     }  
  44.    
  45.     printf("/n------------------------ 手动分配任务,方法二 -------------------------  
  46.   
  47. /n");  
  48. // 方法二  
  49. #pragma omp parallel  
  50.     {  
  51.         int i, istart, iend;  
  52.         int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();  
  53.         iend = N;  
  54.         for(i=id; i<iend; i+=Nthrds)   
  55. // 每个线程一次完成第id个任务,第id+Nthrrds个,第id+2*Nthrds。。。只到id+m*Nthrds>=N  
  56.         {  
  57.             c[i] = a[i] + b[i];  
  58.             printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);  
  59.         }  
  60.     }  
  61.   
  62.     for (int i=0;i<N;i++)  
  63.     {     
  64.         printf("c[%d]=%d/t", i, c[i]);  
  65.         c[i] = 0;  
  66.     }  
  67.   
  68.     return 0;  
  69. }  

 


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值