我正在使用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”==“{”]由于某种原因,但我不明白为什么。先感谢您!
答案 0 :(得分:1)
这里有一些问题。
正如@shellter指出的那样,[[ "$line" == "{" ]]
测试整行是否等于{
,因此在文件2的第3行失败:{ int i, j;
在达到该点之前,文件2的空白行2导致这些为真:
if [[ $count == 0 ]] ; then flag=0 ; fi
if [[ $flag == 0 ]] ; then break ; fi
在到达第3行之前突破funct_display
的{{1}}循环。
也许您可以将问题重命名/重构为:我如何使用命令行工具提取CUDA内核C代码,并举例说明您尝试从两个输入示例中获得的输出。< / p>
如果您正在寻找至少可以处理这两个示例的快速修复,您可以进行一些预处理,将每个花括号单独放在它自己的行上,并删除任何空白行或只有空白的行:
while