问一个icc编译openMP时出现的问题

peaokelvin 2009-10-25 04:21:13
为了验证openMP的效果,我对一个二重循环应用openMP
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#include <math.h>
#define T 2
#define L 432400
#define N 100
#define P 100
float p,q;
int main()
{
int j,i,k,s1[L],s2[L];
float acc;
clock_t t1=clock();
for(k=0;k<N;k++){
#pragma omp parallel for private(i) schedule(static,1) num_threads(T)
for(i=0;i<L;i++)
{
s1[i] = sqrt(i)*(i-5)+ sin(i)*20+cos(i)*(i+pow(i,0.7))+sqrt(pow(i,0.9));
}
}
clock_t t2=clock();
p =(double)((t2-t1)/(double)CLOCKS_PER_SEC);
printf(" parallelized time is %fs\n",(double)(t2-t1)/(double)CLOCKS_PER_SEC);

clock_t t3=clock();
for(k=0;k<P;k++){
for(i=0;i<L;i++)
{
s2[i] = sqrt(i)*(i-5)+ sin(i)*20+cos(i)*(i+pow(i,0.7))+sqrt(pow(i,0.9));
}
}
clock_t t4=clock();
q = (double)((t4-t3)/(double)CLOCKS_PER_SEC);
printf("no parallelized time is %fs\n",(double)((t4-t3)/(double)CLOCKS_PER_SEC));
acc=q/p;
printf("accelerate ratio is %f\n",(N*acc)/P);
return (0);
}

我是用icc -openmp -c a.c -o a.o
icc -openmp a.o -o a 编译的
运行结果:
parallelized time is 4.030000s
no parallelized time is 0.000000s
accelerate ratio is 0.000000

怎么会出现这样的结果?是我编译选项没选对吗?
...全文
303 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
intel_jeff 2009-10-26
  • 打赏
  • 举报
回复
第2个2重循环(非并行的)有个明显的问题,外层循环并没有实质作用,因此icc把外层循环优化掉了。
for(k=0;k <P;k++){
for(i=0;i <L;i++)
{
s2[i] = sqrt(i)*(i-5)+ sin(i)*20+cos(i)*(i+pow(i,0.7))+sqrt(pow(i,0.9));
}
}

另一个建议是把omp的pragma放在外层循环,而不是内层循环。这样可以减少进出并行区的次数,也就是减小多线程开销。
peaokelvin 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fanbin23 的回复:]我之前只知道icc有优化功能,但不清楚它是如何优化的,感谢您的赐教,学习了。。。
1楼正解,因为第二个循环中的s2[i]在后面并没有引用,所以一般编译器都能聪明到把s2得计算当做无用代码删除掉了。

一般我的方法是写一个空函数
void foo (int *a){}
然后在循环结束后call一下foo(s2),只要优化级别不太高(不做ipo),都能使这个循环不被删掉的。icc应该向你这样用就可以了,或者写个-O,反正能支持omp pragma最低级别就行。

fanbin23 2009-10-26
  • 打赏
  • 举报
回复
1楼正解,因为第二个循环中的s2[i]在后面并没有引用,所以一般编译器都能聪明到把s2得计算当做无用代码删除掉了。

一般我的方法是写一个空函数
void foo (int *a){}
然后在循环结束后call一下foo(s2),只要优化级别不太高(不做ipo),都能使这个循环不被删掉的。icc应该向你这样用就可以了,或者写个-O,反正能支持omp pragma最低级别就行。

[Quote=引用楼主 peaokelvin 的回复:]
为了验证openMP的效果,我对一个二重循环应用openMP
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#include <math.h>
#define  T 2
#define L 432400
#define N 100
#define P 100
float p,q;
int main()
{
  int j,i,k,s1[L],s2[L];
  float acc;
  clock_t t1=clock();
for(k=0;k <N;k++){
#pragma omp parallel for private(i) schedule(static,1) num_threads(T)
    for(i=0;i <L;i++)
      {
      s1[i] = sqrt(i)*(i-5)+ sin(i)*20+cos(i)*(i+pow(i,0.7))+sqrt(pow(i,0.9));
    }
  }
  clock_t t2=clock();
  p =(double)((t2-t1)/(double)CLOCKS_PER_SEC);
  printf(" parallelized time is %fs\n",(double)(t2-t1)/(double)CLOCKS_PER_SEC);

  clock_t t3=clock();
  for(k=0;k <P;k++){
    for(i=0;i <L;i++)
      {
      s2[i] = sqrt(i)*(i-5)+ sin(i)*20+cos(i)*(i+pow(i,0.7))+sqrt(pow(i,0.9));
      }
  }
  clock_t t4=clock();
  q = (double)((t4-t3)/(double)CLOCKS_PER_SEC);
  printf("no parallelized time is %fs\n",(double)((t4-t3)/(double)CLOCKS_PER_SEC));
  acc=q/p;
  printf("accelerate ratio is %f\n",(N*acc)/P);
  return (0);
}

我是用icc -openmp -c a.c -o a.o
      icc -openmp a.o -o a  编译的
运行结果:
parallelized time is 4.030000s
no parallelized time is 0.000000s
accelerate ratio is 0.000000

怎么会出现这样的结果?是我编译选项没选对吗?

[/Quote]

567

社区成员

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

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