多核程序设计(曲冠南)并行区域之间工作共享实验.docxVIP

多核程序设计(曲冠南)并行区域之间工作共享实验.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行区域间共享(1)工作队列基本工作过程即维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止。实验环境CPU为4核。线程数为手动创建。程序如下:#includestdafx.h#includeomp.h#define TASK_NUM 1000#define NUM_THREAD 4int nextTask=0;int counter=0;#pragma omp threadprivate(counter)int get_next_task()// get next task from task queue{int currentTask;#pragma omp critical {if(nextTask=TASK_NUM){currentTask = nextTask;nextTask++;}else{currentTask = -1;}} counter++;return currentTask;}void get_my_task_done(int task){int threadId;threadId = omp_get_thread_num();printf(thread %d get the task %d done!\n, threadId, task);}int _tmain(int argc, _TCHAR* argv[]){int myTask;omp_set_num_threads(NUM_THREAD);#pragma omp parallel private(myTask) {myTask = get_next_task();while(myTask!=-1){get_my_task_done(myTask);myTask = get_next_task();}}#pragma omp parallelprintf(this is thread %d, and I have done %d tasks\n, omp_get_thread_num(), counter);return 0;}实验结果其中:每行第一个数为线程号,第二个数为该线程完成的任务数。任务数线程数=2线程数=410结果很随机,出现过:9,1;2,8;2019,1;6,14;1,195044,6;46,4;49,110073,27;77,23;6488331,169364,1361000588,412431,569818,18210000512439434169,5831(2)根据线程号分配(3)循环分配基本工作过程一共有TASK_NUM个任务,循环分配给THREAD_NUM个线程。实验环境CPU为4核。线程数为手动创建。程序:#includestdafx.h#includeomp.h#define TASK_NUM 100#define THREAD_NUM 4int counter=0;#pragma omp threadprivate(counter)int _tmain(int argc, _TCHAR* argv[]){int i;#pragma omp parallel//开始并行执行{printf(outside loop thread=%d\n,omp_get_thread_num());#pragma omp forfor(i=0;iTASK_NUM;i++){printf(inside loop i=%d thread=%d\n,i,omp_get_thread_num());counter++;}}#pragma omp parallel//开始并行执行printf(%d, %d\n,omp_get_thread_num(), counter);return 0;}实验结果任务数线程数=2线程数=4102050100500100010000执行结果,几乎是均分,不整除时以小号线程为主。也就是小号线程最多多1.(4)工作分区编码#includestdafx.h#includewindows.h#includeomp.h#define THREAD_NUM 2int _tmain(int argc, _TCHAR* argv[]){omp_set_num_threads(THREAD_NUM);#pragma omp parallel sections{#pragma omp sectionprintf(section 1 thread=%d\n,omp_get_thread_num());#pragma omp sectionprintf(section 2 thread=%d\n,omp_get_thread_num());#pra

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档