标签: subroutine

更新:我应该将MPI放在模块或模块的子程序中吗?

更新:我有问题,我不知道它是什么.我有一个MPI_INIT和MPI_FINALIZE测试程序.我有一个包含5个子程序的模块:3个子程序是相关的,独立于2个其他子程序.我想将测试程序中的MPI代码放入此模块中.我将MPI_INIT放在声明变量的模块中以及子例程之前.我使用相同的错误消息获取了一系列错误:

This statement must not appear in the specification part of a module
Run Code Online (Sandbox Code Playgroud)

"MPI_INIT和MPI_FINALIZE应该只调用一次"如何影响Fortran程序,模块和子程序?如果有多个独立的程序,每个调用该模块的子程序多次,我应该把MPI函数和变量放在哪里?

~~~~~~~~~我有一个包含一系列子程序的模块,其中包含我希望并行化的do循环.子例程是公共的,其他程序使用.我应该在子程序之外定义MPI:

module ...
call MPI_INIT
subroutine 1
... (MPI code)
subroutine 2
subroutine 3
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

或者在每个子程序里面?

module ...
subroutine 1
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 2
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 3
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

我认为遵循粗粒原理的优点是解决方案1.如果一个程序调用子程序1,它还会在子程序之外执行MPI代码吗?

fortran mpi modulo subroutine

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

在KSH中将变量从子项传递给父项

我必须和KSH一起工作(是的,地狱贝壳).我需要使用fork,子程序如下:

    #!/bin/ksh

    PIPE=PIPE_$$
    PIPE_ERR=PIPE_ERR_$$

    export TEST_FILS

    $(. ./LanceFils.ksh 2>${PIPE_ERR} 1>${PIPE}) &
    PID_CHILD=$!
    echo "Nom du fichier PIPE: ${PIPE}"
    echo "Processus fils : " $!
    wait ${PID_CHILD}

    echo "Code retour: " $?
    echo "Sortie standard de PROC_FILS : " $(cat ${PIPE})
    echo "Sortie d'erreur(s) de PROC_FILS : " $(cat ${PIPE_ERR})

    echo "Contenu de TEST_FILS: ${TEST_FILS}"
    rm -rf ${PIPE}
Run Code Online (Sandbox Code Playgroud)

LanceFils.ksh的内容

    #!/bin/ksh

    TIMEOUT=5

    export TEST_FILS

    echo "Je suis le script fils et j'attends ${TIMEOUT} secondes" 
    echo "Nom du pipe du pere ${PIPE}"
    sleep …
Run Code Online (Sandbox Code Playgroud)

variables ksh fork subroutine

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

在子例程中使用MPI

我正在处理可多次调用子例程(依次执行迭代)的代码。我希望并行化子例程中的迭代。mpi的问题是只允许我初始化一次。因此,我无法在子例程中对其进行初始化,该子例程被多次调用。有人可以提出解决方案吗?

我的问题大致如下:

program p

...

do i=1,10000
    call subroutine s(i)
end do

end program p

subroutine s(j)  

...

do i=1,10000
    ...
end do

end subroutine s
Run Code Online (Sandbox Code Playgroud)

我希望将这一过程并行化。

非常感谢。有帮助!但是,让我重新思考一下问题:在主程序的迭代中,连同子例程s,我必须调用另一个子例程s2(不需要并行化)。我以为可以这样做:

  !initialize mpi

  do i=1:1000

  if rank!=0

  call s

  else call s2

  end if

  end do

  !finalize mpi
Run Code Online (Sandbox Code Playgroud)

但是这里的主要问题是,尽管其余进程缓慢进行,但进程0将快速进行。因此,是否有可能让进程0在每次迭代之后等待,直到另一个进程完成其迭代呢?

fortran mpi subroutine

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

在Perl子例程中查询

我将使用perl作为实习的一部分,我遇到了这段代码,无法理解这可能意味着什么.

$val->ReadSim($first_sim, \&DataProcessing); 
Run Code Online (Sandbox Code Playgroud)

在脚本中,定义了子例程DataProcessing,但找不到ReadSim.我尝试在我们的基础设施中搜索,但无法进行搜索.这是在一周前让我理解的,我不能在没有丢失学分的情况下问导游......

请帮忙...

perl subroutine

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

麻烦将哈希和变量传递给子例程

我想将哈希和变量传递给子例程:

%HoA = {'1'=>'2'};
my $group_size = 10;

&delete_unwanted(\%HoA,$group_size);

sub delete_unwanted {
    my (%HoA,$group_size) = @_;
    print "'$group_size'\n"
}
Run Code Online (Sandbox Code Playgroud)

但是,这没有任何打印.

perl subroutine

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

为什么这些代码块的行为有所不同?

我是Perl的新手,我无法弄清楚这一点.我有两组看似相同的代码,但是一个子程序更新了值而另一个没有.在第一组代码中,我的理解是传递对数组的引用,然后更新该引用指向的值.然后在离开子例程时,值已更改.但是,在第二个中,我希望发生同样的事情.它会更新数组,但在离开子程序后会忘记它.有人可以用第二套代码向我解释幕后发生的事情吗?

第一套代码:

#!/usr/bin/perl -w

use strict;

{
    my @array = (1, 2, 3);
    removeSecondElement(\@array);
    print @array;  #output: 13
    print("\n");
}

sub removeSecondElement{
    my ($arrayReference) = @_;
    splice(@$arrayReference, 1, 1);
    print @$arrayReference;  #output: 13
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

第二代码集:

#!/usr/bin/perl -w

use strict;

{
    my @array = (1, 2, 3);
    removeSecondElement(\@array);
    print @array;  #output: 123
    print("\n");
}

sub removeSecondElement{
    my ($arrayReference) = @_;
    my @array = @$arrayReference;
    splice(@array, 1, 1);
    print @array;  #output: 13
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

perl pass-by-reference pass-by-value subroutine pass-by-pointer

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

使用Perl的原型有什么缺点吗?

我想在参数列表周围不使用括号来调用我的潜艇.例如,我想使用

mypush \@list, $item;
Run Code Online (Sandbox Code Playgroud)

代替

mypush(\@list, $item);
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我已经用原型声明了我的子.

sub mypush (+@) { push shift, @_ }
Run Code Online (Sandbox Code Playgroud)

事实上,这也允许我进行以下操作,但这只是一个奖励:

mypush @list, $item;
Run Code Online (Sandbox Code Playgroud)

除了在代码中的任何地方使用它们之前必须使用原型声明子例程之外,在Perl中使用原型是否有任何严重的缺点?

代码看起来对我来说绝对清晰.但一般情况下原型出错的地方?我什么时候后悔呢?

perl prototype subroutine

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

将参数传递给子例程的名称

有没有办法通过传递给另一个子程序的参数来选择子程序?像这样的东西:

sub foo1 {
    # does stuff to @_
}

sub foo2 {
    # does other stuff to @_
}

sub foo3 {
    # does other stuff to @_
}

sub foo {
    my $whichsub = shift;
    my @fooed = foo.$whichsub @_;
    # does stuff to @fooed
}
Run Code Online (Sandbox Code Playgroud)

foo.$whichsub应该在哪里foo1等.除了那当然不起作用.

perl subroutine perl5

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

如何在perl中取消引用此哈希?

#!/usr/bin/perl
use Data::Dumper;

sub giveMeARef {
    my %hash = %{$_[0]};

    print "arg: ", Dumper($_[0]);
    print "deref: ", Dumper(%hash);
}

my %hash = ( "a" => (1,2,3), "b" => (3,4,5));

giveMeARef(\%hash);
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

arg: $VAR1 = {
          '2' => 3,
          '4' => 5,
          'a' => 1,
          'b' => 3
        };
deref: $VAR1 = 'b';
$VAR2 = 3;
$VAR3 = '2';
$VAR4 = 3;
$VAR5 = 'a';
$VAR6 = 1;
$VAR7 = '4';
$VAR8 = 5;
Run Code Online (Sandbox Code Playgroud)

我试着按照如何取消引用已传递给子例程的Perl哈希引用中的示例

但我相信因为我的哈希更复杂,所以对我来说不合适.我如何回到我传入的原始结构?

perl hash reference subroutine

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

VBA函数打印数组导致活动单元格

我想编写一个函数,其结果应该在一系列单元格中打印/写入数组.

活动单元应该是第一个元素,下面的下一个单元格是第二个元素(依此类推).因此,例如,如果我当前的活动单元格是B2,则所需结果应如下图所示.

我的代码仅适用于Debug.Pring,但我无法弄清楚如何在excel表上实际使用它.

Function ShowResult()

Dim strArray() As String
Dim result As String
result = "Maybe I think too much but something's wrong"
strArray = Split(result, " ")

Dim StartRow, i As Integer
StartRow = 1

For i = 0 To UBound(strArray)
    Debug.Print strArray(i)
    'Range("A" & i + StartRow).Value = strArray(i) <--I tried even with this, didn't work!
Next
End Function
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

excel vba function excel-vba subroutine

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