主程序:
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选项的情况下编译,它也运行正常.
此图由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一样的情节,特别是光滑度,阴影?
我正在阅读"使用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) 我创建了一个自动化应用程序并将其设置为在登录时运行,然后我选中了“隐藏”框,但它仍然显示在状态栏中(齿轮图标)。我怎样才能隐藏它?
我在这里选中“隐藏”框:
但齿轮图标仍然显示(更糟糕的是它永远不会停止旋转!)
是否可以隐藏此图标,或让它停止旋转?
考虑这个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)
似乎循环没有执行,为什么会发生这种情况?
我的Fortran代码需要从文件中读取初始化数据(大约24000个实数).有没有办法将数据放入代码中,以便我可以避免访问文件系统?
我试图使用一个模块,并将所有数据放入一个变量初始化,如下所示:
real(kind=8) :: a(24000)=(/&
& 1. ,&
& 2. ,&
...
&/)
Run Code Online (Sandbox Code Playgroud)
但由于源文件有24000行,我不断收到编译错误"Too many continuation lines".这有什么解决方案吗?