Bash if语句适用于一个案例而不适用于其他案例

时间:2017-08-26 13:43:57

标签: linux bash if-statement

我正在使用bash使用以下代码从cuda程序中检索内核:

kername="kernelnames"
loop="loop"
filecp="filecp"
funct="funct"
truncate -s 0 $kername
truncate -s 0 $loop
truncate -s 0 $funct
counter=1

funct_display(){
    count=0
    flag=1
    while read line ; do
        echo "$line"
        if [[ "$line" == "{" ]] ; then echo "$line"; count=$(( count+1 )) ; echo "$counter $count incre" ;fi
        if [[ "$line" == "}" ]] ; then count=$(( count-1 )) ; echo "$counter $count decre" ;fi      
        if [[ $count > 0 ]] ; then echo "$line" >> $funct ;fi
        if [[ $count == 0 ]] ; then flag=0 ; fi 
        if [[ $flag == 0 ]] ; then break ; fi   
        #if [[ $count == 0 ]] ; then counter=$(( counter+1 )); fi
        counter=$(( counter+1 ))        
    done < $filecp
    echo "}" >> $funct
    echo "" >>$funct
}
file_copy(){
    truncate -s 0 $filecp
    while read line; do
        echo "$line" >> $filecp
    done < $filename
}

read -p "Enter the name of the file to be scanned: " filename
var=$( grep "__global__" < $filename | wc -l )
echo "kernels" >> $kername
for((i=1;i<=$var;i++))
do
    temp1=$( grep -m$i "__global__" < $filename | tail -n1 )
    a=$( grep -n -m$i "__global__" < $filename | cut -d : -f 1 | tail -n1 )
    j=$(( i+1 ))
    temp2=$( grep -m$j "__global__" < $filename | tail -n1 )
    b=$( grep -n -m$j "__global__" < $filename | cut -d : -f 1 | tail -n1 )
    echo "$i $temp1 $a $b" >> $kername
    temp5=$( sed -n " $a , $b p" $filename )
    echo "$temp5" >> $loop
    #echo "$a"
    while read line ; do
        if [[ "$line" == "$temp1" ]] ; then 
            echo "$line " >> $funct
            echo "$line"
            file_copy
            for((k=$a;k>0;k--))
            do
                echo "$k"
                sed -i "${k}d" $filecp 
            done
            funct_display 
        fi
    done < $filename
    #echo "$temp1"
done

上面的shell脚本适用于具有以下内核的程序:

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

__global__ void subKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] - b[i];
}

但是对于具有以下内核的程序它不起作用:

__global__ void Vec_Mat_mul(float *gV, float*gM, float *gR, int Vecsize, int Matcols)

{   int i, j;
    float sum=0.0;
    i=(blockIdx.x*blockDim.x)+threadIdx.x; //For each block access
    if(i<Matcols)
{
        for(j=0;j<Vecsize;j++)
            sum=sum+(gV[j]*gM[j+(i*Vecsize)]);

        __syncthreads(); //Synchronization Barrier
        gR[i]=sum;
}
}

我认为它没有输入if语句:if [[“$ line”==“{”]由于某种原因,但我不明白为什么。先感谢您!

1 个答案:

答案 0 :(得分:1)

这里有一些问题。

  1. 正如@shellter指出的那样,[[ "$line" == "{" ]]测试整行是否等于{,因此在文件2的第3行失败:{ int i, j;

    < / LI>
  2. 在达到该点之前,文件2的空白行2导致这些为真:

    if [[ $count == 0 ]] ; then flag=0 ; fi
    if [[ $flag == 0 ]] ; then break ; fi
    
  3. 在到达第3行之前突破funct_display的{​​{1}}循环。

    也许您可以将问题重命名/重构为:我如何使用命令行工具提取CUDA内核C代码,并举例说明您尝试从两个输入示例中获得的输出。< / p>

    如果您正在寻找至少可以处理这两个示例的快速修复,您可以进行一些预处理,将每个花括号单独放在它自己的行上,并删除任何空白行或只有空白的行:

    while
相关问题