Fortran Coder

标题: 询问一个关于fortran调用批处理文件的问题 [打印本页]

作者: 白夜IX    时间: 2019-2-24 13:38
标题: 询问一个关于fortran调用批处理文件的问题
本帖最后由 白夜IX 于 2019-2-24 13:45 编辑

①现有一个他人编写的exe程序,程序功能为:用户准备好一组参数文件,将这组参数文件和exe程序放在一个目录下,执行cmd文件,程序自动读取并经过若干次迭代计算,得出结果并输出结果文件,结果文件会生成在同一目录下。
②我想实现的目标:我的电脑是4核心8线程的,我手上有8组参数文件,我想让8组参数文件在8个线程内同时计算(并行),输出结果文件,并记录并行计算过程的总时间。
③关于cmd文件的内容是这样的结构:program(他人编写的exe程序名字)  abc.iter(参数文件中的起始文件) m > m.log (程序运行过程会输出到这个m.log文件中)
④我所做出的尝试:将两组参数文件、exe程序和cmd程序放在两个文件夹内(D:\test_al\inv1和D:\test_al\inv2),编写fortran程序,使用openmp建立两个子线程,两个线程内分别调用各自的批处理程序,并计算时间。
出现的问题:"program"(他人编写的exe程序名字)不是内部或外部命令,也不是可运行的程序或批处理文件
做出的改进:我将参数文件全放到我编写的fortran代码的“console2”文件夹内,并去掉D:\test_al\inv1这个路径,程序正常运行。 (也就是说,我的程序调用的指定路径D:\test_al\inv1的run.cmd,这个cmd识别不了D:\test_al\inv1下的program.exe,只能识别console2文件夹内的program.exe)
但是问题是:这8组参数文件及结果文件难免有重复的名字(尤其是结果文件,迭代计算过程会生成0.iter,1.iter等等),都放在console2里面不仅乱也互相影响,该怎么办呢,能不能满足我最初的尝试,即8组参数文件和程序在各自的文件夹内互不影响的运行?
[Fortran] 纯文本查看 复制代码
program main
    use omp_lib
    integer maxthreads
    real omp_begin,omp_end,section_begin1,section_end1,section_begin2,section_end2
    maxthreads=omp_get_max_threads()
    print*,"你正在使用的计算机CPU个数=",maxthreads
    call omp_set_num_threads(2)
    !$omp parallel
    omp_begin=omp_get_wtime()
        !$omp sections
            !$omp section
                section_begin1=omp_get_wtime()
                call system('D:\test_al\inv1\run.cmd')
                section_end1=omp_get_wtime()
            !$omp section
                section_begin2=omp_get_wtime()
                call system('D:\test_al\inv2\run.cmd')
                section_end2=omp_get_wtime()
        !$omp end sections
    omp_end=omp_get_wtime()
    !$omp end parallel
    print*,"总时间=",omp_end-omp_begin
    print*,"线程1时间=",section_end1-section_begin1
    print*,"线程2时间=",section_end2-section_begin2
    pause
end program main





作者: vvt    时间: 2019-2-24 22:34
本帖最后由 vvt 于 2019-2-24 22:37 编辑

楼主的问题描述得非常好、详细、清晰,这一点赞美一下。
所涉及的问题是:
1. 虽然你的程序用到了多线程,但独立运行的 call system() 是单独的“进程”,而非线程。
2. 多进程的并行,由操作系统负责,对于您的程序,OpenMP并行并不能起到加速的作用。(因为call system只是唤醒命令,而唤醒是非常快的。)
(你可以想象,写一篇文章很消耗时间,但“命令别人写一篇文章”,则很容易。你在并行的命令别人写文章,没多大意义。)
(program.exe并不是由并行代码构成的,所以起不到并行的作用)
3. run.cmd 这个东西完全没必要。你可以直接
call system("program abc.iter m > m.log")
4. 你可以分别切换到不同的目录下,执行 call system,这样,输入输出文件就是当前的文件夹了。
5. 实际上,你根本不需要写fortran代码,直接用windows的 bat 批处理更简单。
6. 如果你确实要用 Fortran来做,那么可能类似这样的程序

首先,把 program.exe 放在 D:\test_al 文件夹。(不需要每个文件夹放一个)
[Fortran] 纯文本查看 复制代码
use IFPORT
character(len=3) :: cDir
Do i = 1 , 8
  write( cDir , '(i3)' ) i
  k = ChangeDirQQ("D:\test_al\inv"\\adjustl(cDir))
  call system("start D:\test_al\program.exe abc.iter m > m.log")
End Do






欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2