更新:我有问题,我不知道它是什么.我有一个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代码吗?
我必须和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) 我正在处理可多次调用子例程(依次执行迭代)的代码。我希望并行化子例程中的迭代。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在每次迭代之后等待,直到另一个进程完成其迭代呢?
我将使用perl作为实习的一部分,我遇到了这段代码,无法理解这可能意味着什么.
$val->ReadSim($first_sim, \&DataProcessing);
Run Code Online (Sandbox Code Playgroud)
在脚本中,定义了子例程DataProcessing,但找不到ReadSim.我尝试在我们的基础设施中搜索,但无法进行搜索.这是在一周前让我理解的,我不能在没有丢失学分的情况下问导游......
请帮忙...
我想将哈希和变量传递给子例程:
%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的新手,我无法弄清楚这一点.我有两组看似相同的代码,但是一个子程序更新了值而另一个没有.在第一组代码中,我的理解是传递对数组的引用,然后更新该引用指向的值.然后在离开子例程时,值已更改.但是,在第二个中,我希望发生同样的事情.它会更新数组,但在离开子程序后会忘记它.有人可以用第二套代码向我解释幕后发生的事情吗?
第一套代码:
#!/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
我想在参数列表周围不使用括号来调用我的潜艇.例如,我想使用
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中使用原型是否有任何严重的缺点?
代码看起来对我来说绝对清晰.但一般情况下原型出错的地方?我什么时候后悔呢?
有没有办法通过传递给另一个子程序的参数来选择子程序?像这样的东西:
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等.除了那当然不起作用.
#!/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哈希引用中的示例?
但我相信因为我的哈希更复杂,所以对我来说不合适.我如何回到我传入的原始结构?
我想编写一个函数,其结果应该在一系列单元格中打印/写入数组.
活动单元应该是第一个元素,下面的下一个单元格是第二个元素(依此类推).因此,例如,如果我当前的活动单元格是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)