请问:openmp 中sections的问题

qgdbr08 2009-05-14 11:06:48
我在双核的机子上使用sections想实现这么一个功能,两个线程并行执行void Change_values(int *Input,int *Output,int threadId)
之后 将执行结果进行交换,进行第二次迭代,源代码如下:

#include "stdio.h"
#include "omp.h"

#define degree 30



void Change_values(int *Input,int *Output,int threadId)
{
int i;
for(i=0;i<degree;i++)
Output[i]=threadId+Input[i];
}

int main()
{
int input1[degree]={0},input2[degree]={0};
int output1[degree],output2[degree];


int threadId=0;
int i,j;

double start,end;

start=omp_get_wtime();

for(j=0;j<2;j++)
{
printf_s("\nj:%d",j);

#pragma omp parallel sections private(threadId)
{

#pragma omp section
{

threadId=omp_get_thread_num();
printf_s("\nthreadId:%d",threadId);
Change_values(input1,output1,threadId);
}
#pragma omp section
{

threadId=omp_get_thread_num();
printf_s("\nthreadId:%d",threadId);
Change_values(input2,output2,threadId);
}


}//end of sections , an implied barrier?

#pragma omp barrier
for(i=0;i<degree;i++)
{
input1[i]=output2[i];
input2[i]=output1[i];
}
printf_s("\nInput1[]:");
for(i=0;i<degree;i++)
printf_s("%d",input1[i]);
printf_s("\nInput2[]:");
for(i=0;i<degree;i++)
printf_s("%d",input2[i]);

}

end=omp_get_wtime();
printf_s("\nneeds time:%f",end-start);
printf_s("\nOoutput1[]:");
for(i=0;i<degree;i++)
printf_s("%d",output1[i]);
printf_s("\nOoutput2[]:");
for(i=0;i<degree;i++)
printf_s("%d",output2[i]);

return 1;
}

可是,用 Intel thread profiler分析,却是串行执行,为什么呢?
...全文
131 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qgdbr08 2009-05-14
  • 打赏
  • 举报
回复
哦~ 我放大以后,发现是有并行部分的。
我用 Intel thread checker分析 显示 output[]和input[]数组读写冲突,为什么呢?难道这么用barrier不对??
qgdbr08 2009-05-14
  • 打赏
  • 举报
回复
如果没设置~ 那么线程数是不是默认等于核的个数??
caipeipeipp 2009-05-14
  • 打赏
  • 举报
回复
程序中怎么没设置线程数

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧