并行化访问文件的for循环

时间:2015-04-13 13:23:57

标签: loops gnu-parallel

这是完整的代码。在BER_SB中,传递给rand-sr​​c命令的K,SB的值和传递给发送命令的 sigama 的值正在main中计算。 BER_SB写入BER数组的线索正在主要进一步使用。

 BER_SB()
    {
    s=$1        
    mkdir "$1"
    cp ex-ldpc36-5000a.pchk ex-ldpc36-5000a.gen "$1"
    cd "$1"

    rand-src ex-ldpc36-5000a.src $s "$K"x"$SB"
    encode   ex-ldpc36-5000a.pchk ex-ldpc36-5000a.gen ex-ldpc36-5000a.src ex-ldpc36-5000a.enc
    transmit ex-ldpc36-5000a.enc ex-ldpc36-5000a.rec 1 awgn $sigma

    decode   ex-ldpc36-5000a.pchk ex-ldpc36-5000a.rec ex-ldpc36-5000a.dec awgn $sigma prprp 250

    BER="$(verify ex-ldpc36-5000a.pchk ex-ldpc36-5000a.dec ex-ldpc36-5000a.gen ex-ldpc36-5000a.src)"

    echo $BER 

  }
 export BER
 export -f BER_SB


 K=5000 # No of Message Bits
 N=10000 # No of encoded bits

 R=$(echo "scale=3; $K/$N" | bc) # Code Rate



 # Creation of Parity Check and Generator files
  make-ldpc ex-ldpc36-5000a.pchk $K $N 2 evenboth 3 no4cycle
  make-gen  ex-ldpc36-5000a.pchk ex-ldpc36-5000a.gen dense

 # Creation of file to write BER values
 echo>/media/BER/BER_LDPC36_5000_E.txt -n 

 S=1; # Variable to control no of blocks of source messages

 for Eb_No in 0.5 1.0

  do
    B=$(echo "10^($S+1)" | bc) 
    # No of Blocks are increased for higher Eb/No values
    S=$(($S+1))

    # As we have four cores in our PC so we will divide number of source blocks into four subblocks to process these in parallel        
    SB=$(echo "$B/4" | bc) 

    # Calculation of Noise Variance from Eb/No values
    tmp=$(echo "scale=3; e(($Eb_No/10)*l(10))" | bc -l)
        sigma=$(echo "scale=3; sqrt(1/(2*$R*$tmp))" | bc)

    # Calling of functions to process the each subbloc

    parallel BER_SB ::: 1 2 3 4

    BER_T= Here I want to process values of BER variables returned by BER_SB function

done 

1 个答案:

答案 0 :(得分:0)

你想要做什么并不是很清楚。从你写的东西看来,你想要同样的3行并行运行4次。这很容易做到:

runone() {
  mkdir "$1"
  cd "$1"
  rand-src ex-ldpc36-5000a.src 0 5000 1000
  encode ex-ldpc36-5000a.pchk ex-ldpc36-5000a.gen ex-ldpc36-5000a.src ex-ldpc36-5000a.enc
  transmit ex-ldpc36-5000a.enc ex-ldpc36-5000a.rec 1 awgn .80
}
export -f runone

parallel runone ::: 1 2 3 4

但是,这并没有使用'1 2 3 4'。如果你想要'1 2 3 4'用于任何事情,你需要更好地描述你真正想要的东西。

编辑:

目前还不清楚你是否有:

以及我是否可以认为你所知道的材料是你所了解的。

在您的代码中,您使用BER [1] .. BER [4],但它们未初始化。您还可以在函数中使用BER [x]。也许您忘了子shell不能将数组中的值传递回其父级?

如果我是你,我会移动函数中的所有计算并使用所有需要的参数调用函数,而不是将它们作为环境变量传递。类似的东西:

parallel BER_SB ::: 1 2 3 4 ::: 0.5 1.0 ::: $S > computed.out
post process computed.out >>/media/BER/BER_LDPC36_5000_E.txt

要将参数保存在computed.out中,您可以使用--tag。这可能会使后期处理变得更容易。