2017-08-26 13 views
0

我使用bash使用下面的代碼來檢索CUDA程序內核:猛砸if語句的一個案子,而不是爲了其他

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」==「{」]]出於某種原因,但我不明白爲什麼。先謝謝你!

+0

是的,你說得對,'if [[「$ l {ine}」==「{」]]'只需要'{'字符就行。嘗試'if [[「$ {line}」〜=「{」]]''。但是這將匹配線上任何地方的「{」。這將會更容易和高效地將其轉換爲awk,但看起來你已經投入了大量時間,所以對你的情況最好。祝你好運。 – shellter

回答

1

這裏有一些事情出錯了。

  1. 作爲@shellter指出的,[[ "$line" == "{" ]]測試如果整行都等於{,所以失敗上文件2的第3行:文件的{ int i, j;

  2. 甚至達到該點之前,空行2 2導致這些是真實的:

    if [[ $count == 0 ]] ; then flag=0 ; fi 
    if [[ $flag == 0 ]] ; then break ; fi 
    

爆發的funct_displaywhile在達到第3行之前循環。

也許您可以將您的問題重命名/重新構建爲:我如何使用命令行工具來提取CUDA內核C代碼,並給出您試圖從您的兩個輸入示例。

如果您正在尋找一個至少可以處理這兩個示例的快速修復,那麼您可以進行一些預處理,將每個花括號單獨放在其自己的行上,並刪除任何空白行或空白行:

sed 's/\(.*\)\([{}]\)\(.*\)/\1\n\2\n\3/' file.c | 
    grep -v '^\s*$' > file.preprocessed.c 
+0

嗯,事實證明它在語義上是正確的,但我們試圖處理的文件以某種方式「損壞」了。我們複製粘貼的內容在一個新的文件,它完美地工作。感謝所有的幫助。 :) – ReminiscientYeti

+0

我會小心。我在你的示例文件上運行了你的示例代碼,它不能在第二個文件上工作。它看起來可能適用於所有大括號都獨立於自己的行而沒有前導空格或尾隨空格的文件。雖然,不可否認,我不知道你想要的輸出是什麼,所以我不能肯定地說它沒有按照預期工作,只是它們的表現在不同的花括號上不是單獨的。 – webb