小编xsl*_*ass的帖子

为什么在这个openmp代码中发生了分段错误?

主程序:

program main                                                                                                                                                    
  use omp_lib                                                                                                                                                   
  use my_module                                                                                                                                                 
  implicit none                                                                                                                                                 

  integer, parameter :: nmax = 202000                                                                                                                           
  real(8) :: e_in(nmax) = 0.D0                                                                                                                                  
  integer i                                                                                                                                                     

call omp_set_num_threads(2)                                                                                                                                     
!$omp parallel default(firstprivate)                                                                                                                            
!$omp do                                                                                                                                                        
  do i=1,2                                                                                                                                                      
     print *, e_in(i)                                                                                                                                           
     print *, eTDSE(i)                                                                                                                                          
  end do                                                                                                                                                        
!$omp end do                                                                                                                                                    
!$omp end parallel                                                                                                                                              
end program main
Run Code Online (Sandbox Code Playgroud)

模块:

module my_module                                                                                                                                                
  implicit none                                                                                                                                                 

  integer, parameter, private :: ntmax = 202000                                                                                                  
  double complex :: eTDSE(ntmax) = (0.D0,0.D0)                                                                                                                  
!$omp threadprivate(eTDSE)                                                                                                                                      

end module my_module
Run Code Online (Sandbox Code Playgroud)

编译使用:

ifort -openmp main.f90 my_module.f90
Run Code Online (Sandbox Code Playgroud)

它在执行时给出Segmentation故障.如果删除主程序中的一个打印命令,它运行正常.另外如果删除omp函数并在没有-openmp选项的情况下编译,它也运行正常.

fortran openmp

17
推荐指数
2
解决办法
2万
查看次数

如何在Matlab中生成插值平滑3d图

此图由Mathematica以下内容创建:

ls = Table[Sinc[x*y], {x, -5, 5, 0.2}, {y, -5, 5, 0.2}];
ListPlot3D[ls, InterpolationOrder -> 2, PlotRange -> All, 
 Mesh -> None]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何在MatLab中创建这样的情节?

到目前为止,这是我的尝试:

>> x=linspace(-5.,5.,51);
>> y=linspace(-5.,5.,51);
>> [x,y]=meshgrid(x,y);
>> z=sinc(x.*y);
>> surf(x,y,z)
>> shading interp
Run Code Online (Sandbox Code Playgroud)

它看起来非常不同,尤其是涟漪的细节.是否可以制作像Mathematica一样的情节,特别是光滑度,阴影?

在此输入图像描述

matlab

9
推荐指数
1
解决办法
2万
查看次数

Fortran矩阵乘法在不同优化中的表现

我正在阅读"使用Fortran进行科学软件开发"一书,其中有一个练习,我认为非常有趣:

"创建一个名为MatrixMultiplyModule的Fortran模块.为它添加三个子程序,称为LoopMatrixMultiply,IntrinsicMatrixMultiply和MixMatrixMultiply.每个例程应该采用两个实矩阵作为参数,执行矩阵乘法,并通过第三个参数返回结果.SpringMatrixMultiply应该完全写入使用do循环,没有数组操作或内部过程; IntrinsicMatrixMultiply应该使用matmul内部函数编写;而MixMatrixMultiply应该使用一些do循环和内部函数dot_product编写.编写一个小程序来测试这三种不同方式的性能为不同大小的矩阵执行矩阵乘法."

我做了一些两个秩2矩阵乘法的测试,这里是不同优化标志下的结果:

在此输入图像描述 在此输入图像描述 在此输入图像描述

compiler:ifort version 13.0.0 on Mac 
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

为什么在-O0下它们具有相同的性能,但是当使用-O3时matmul具有巨大的性能提升,而显式循环和点产品的性能提升较少?另外,为什么dot_product与显式do循环相比似乎具有相同的性能?

我使用的代码如下:

module MatrixMultiplyModule

contains
    subroutine LoopMatrixMultiply(mtx1,mtx2,mtx3)
        real,intent(in)                 ::  mtx1(:,:),mtx2(:,:)
        real,intent(out),allocatable    ::  mtx3(:,:)
        integer                         ::  m,n
        integer                         ::  i,j
        if(size(mtx1,dim=2) /= size(mtx2,dim=1)) stop "input array size not match"
        m=size(mtx1,dim=1)
        n=size(mtx2,dim=2)
        allocate(mtx3(m,n))
        mtx3=0.

        do i=1,m
            do j=1,n
                do k=1,size(mtx1,dim=2)
                    mtx3(i,j)=mtx3(i,j)+mtx1(i,k)*mtx2(k,j)
                end do      
            end do
        end do
    end subroutine

    subroutine IntrinsicMatrixMultiply(mtx1,mtx2,mtx3)
        real,intent(in)                 ::  mtx1(:,:),mtx2(:,:)
        real,intent(out),allocatable    ::  mtx3(:,:)
        integer                         ::  m,n
        integer                         ::  i,j
        if(size(mtx1,dim=2) /= size(mtx2,dim=1)) stop "input array size not match" …
Run Code Online (Sandbox Code Playgroud)

performance fortran matrix-multiplication

6
推荐指数
1
解决办法
1万
查看次数

运行时如何隐藏自动机应用程序图标

我创建了一个自动化应用程序并将其设置为在登录时运行,然后我选中了“隐藏”框,但它仍然显示在状态栏中(齿轮图标)。我怎样才能隐藏它?

我在这里选中“隐藏”框:

在此处输入图片说明

但齿轮图标仍然显示(更糟糕的是它永远不会停止旋转!)

在此处输入图片说明

是否可以隐藏此图标,或让它停止旋转?

sourceforge-appscript

5
推荐指数
1
解决办法
4593
查看次数

为什么代码似乎没有执行没有输出相关?

考虑这个Fortran计划:

program main
implicit none

double complex :: a(51,51),b(51,51)
Integer::i,j
real(8)::ht=0.01
real(8) T1,T2

do i=1,51
   do j=1,51
      a(i,j)=cmplx(Sin(0.01*i),Cos(0.01*j))
   end do
end do

call cpu_time(T1)

do i=1,23497
   b(:,:)=(0.,1.)*ht/2.*a(:,:)
end do

call cpu_time(T2)

write(*,*) sum(b)
print '("Time = ",f12.9," seconds.")', T2-T1

end program main
Run Code Online (Sandbox Code Playgroud)

输出是

 (-12.4321907340245,3.30723047182099)
Time =  0.052991000 seconds.
Run Code Online (Sandbox Code Playgroud)

如果我们注释掉write(*,*) sum(b),那么输出就是

Time =  0.000000000 seconds.
Run Code Online (Sandbox Code Playgroud)

似乎循环没有执行,为什么会发生这种情况?

performance fortran

3
推荐指数
1
解决办法
65
查看次数

有没有办法在Fortran的代码文件中包含数据?

我的Fortran代码需要从文件中读取初始化数据(大约24000个实数).有没有办法将数据放入代码中,以便我可以避免访问文件系统?

我试图使用一个模块,并将所有数据放入一个变量初始化,如下所示:

 real(kind=8) :: a(24000)=(/&
 & 1. ,&
 & 2. ,&
 ...
 &/)
Run Code Online (Sandbox Code Playgroud)

但由于源文件有24000行,我不断收到编译错误"Too many continuation lines".这有什么解决方案吗?

fortran

1
推荐指数
1
解决办法
470
查看次数