回 帖 发 新 帖 刷新版面

主题:如何提高速度!急,如何改下面的代码使其计算更快.

x=1.0/M
  do i=1,M
    pxmx(i)=x    
    aymx(i)=pxmx(i)/LceLL*pi
    axmx(i)=pi/LceLL
    x=x+1.0/M
  end do
  x=0.0
  do i=1,M+1
    pxtx(i)=x
    pxmt(i)=x    
    axtx(i)=pxtx(i)/LceLL*pi
    aytx(i)=axtx(i)*0
    axmt(i)=pi/LceLL-pxmt(i)/LceLL*pi
    aymt(i)=axmt(i)
    x=x+1.0/M
  end do
  do i=1,M+1
    arphx(i)=axtx(i)
    arphy(i)=aytx(i)
    px(i)=pxtx(i)*pi
  end do
  do i=1,M
    arphx(i+M+1)=axmx(i)
    arphy(i+m+1)=aymx(i)
    px(i+m+1)=pxmx(i)*pi+1*pi
  end do
  do i=1,m+1
    arphx(i+2*M+1)=axmt(i)
    arphy(i+2*M+1)=aymt(i)
    px(i+2*M+1)=pxmt(i)*2**0.5*pi+2*pi
  end do

回复列表 (共6个回复)

沙发

改成并行程序咋改!谢谢

板凳

刚刚看到你这个帖, 你的matlab是用并行写的吗? 为什么一定要并行?

不过话说回来,这个代码很不利于优化. 1.0/M 被反复使用,而且被那么简单地使用, 就没必要在循环里面.
只帮你优化第一个循环
  do i=1,M
    pxmx(i)=x    
    aymx(i)=pxmx(i)/LceLL*pi
    axmx(i)=pi/LceLL
    x=x+1.0/M
  end do
改成
  do i=1,M
    pxmx(i)=x*real(i)
  end do
  aymx(:)=pxmx(:)/LceLL*pi
  axmx(:)=pi/LceLL
其它有兴趣自己优化.

最后想问一点,你测试时间的时候是用release计算还是用原来的debug模式. 如果是后者那你还是先google一下编译优化相关的东西. 彭书也有说的. release有时候比debug快几倍甚至十多倍(看具体代码情况)

并行就算了吧, 虽然omp挺简单,但是要做得好还是要先看看书的.

3 楼

没看到有什么依赖,也不是很复杂的循环,开启了自动向量化/并行化就差不多了

4 楼


麻烦您具体说一下好吗?

5 楼


我是用的debug

6 楼

可以选release的, 如果是命令行编译请查看命令行的编译参数.
如dongyuanxun兄说, 看看设置里面开自动并行试试.

我来回复

您尚未登录,请登录后再回复。点此登录或注册