printf

功能说明

打印Scalar、Expr、ScalarArray或Tensor值。支持功能调试环境上的打印。

函数原型

def printf(format_string, *arg)

参数说明

参数名称

输入/输出

含义

format_string

输入

待打印的字符串,包括字符和格式字符。

支持的数据类型:立即数(string)

注意:该字段不能为空。

字符串最大长度不能超过128个字符,如果在printf之前使用了set_printf_params接口,还需满足长度不能超过single_print_length-32。

示例:

"scalar is: %d\n"

上例中格式字符为:%d。

格式字符配置格式为:%[flag][width][.precision]type

  • flag:可选。取值参见表1
  • width: 长度修饰符,可选。如果实际值的长度比长度修饰符小,默认在前面补空格;如果实际值的长度大于长度修饰符,按照实际值的位数输出。只支持数字1到128。
  • precision:精度,可选。只针对%f, 指定精度位数,如果实际的精度位数多于指定的精度位数,则通过4舍5入后截断。可选。只支持数字1到128 。默认是6,表示6位精度。
  • type:格式字符,必选。取值参见表2

*arg

输入

参数值,参数个数可变,最多支持6个参数。

每个参数支持如下几种数据类型:

  • Scalar(int8/uint8/int16/uint16/float16/ int32/uint32/float32/int64/uint64)
  • Expr(int8/uint8/int16/uint16/float16/ int32/uint32/float32/int64/uint64)
  • ScalarArray(int8/uint8/int16/uint16/float16/ int32/uint32/float32/int64/uint64)
  • Tensor(int8/uint8/int16/uint16/float16/ int32/uint32/float32/int64/uint64)

    tensor支持的scope如下:

    1)scope_gm: Global Memory空间。

    2)scope_cbuf: L1 Buffer

    3)scope_ubuf: UB Buffer

    4 ) scope_cc : L1_out Buffer

表1 Flag含义表

Flag

含义

'#'

针对%o,添加0o。

针对%x,添加0x。

注意:其他格式字符不起作用。

'0'

和width域配合,当实际输出的字符数小于width时,用0填充,例如下例中打印结果是010:

s1 = tik.scalar("int32", init_value=10);
printf("%03d", s1)

注意:默认用空格填充,当实际输出的字符大于size时,按照实际输出。

表2 支持的格式字符

格式字符

含义

%d

有符号十进制整数

%o

有符号的八进制数,不可打印float数据

%x

有符号十六进制数,不可打印float数据

%f

浮点数十进制格式

%s

输出字符串

%c

输出单个字符, 数据范围在[0, 255], 否则会解析出错,不可打印float数据

%%

输出一个 '%' 字符

支持的芯片型号

Atlas 200/300/500 推理产品

Atlas 训练系列产品

返回值

注意事项

调用示例

1. 打印一个Scalar值。

from tbe import tik
tik_instance = tik.Tik()
scalar = tik_instance.Scalar("int8", init_value=-128)
// 需要的空间为 32B 头空间 + 32B 字符串空间 + 32<每个参数的TL占用空间>*1 +32B<每个数据需要向上补齐到32B>
tik_instance.printf("scalar is: %d\n", scalar)
tik_instance.BuildCCE(inputs=[], outputs=[], kernel_name="print_scalar")
tik_instance.tikdb.start_debug({})
输入
[]
输出
scalar is: -128

2.打印某个UB Buffer的值。

tik_instance = tik.Tik()
ub_tensor = tik_instance.Tensor("int16", [16, 16], tik.scope_ubuf, 'ub_tensor')
scalar = tik_instance.Scalar(dtype="int16",init_value=6)
ub_tensor[15].set_as(scalar)
tik_instance.printf("ubtensor[15:16] is: %d\n", ub_tensor[15:16])
tik_instance.BuildCCE(inputs=[], outputs=[], kernel_name="printf_ub")
tik_instance.tikdb.start_debug({})
输入
[]
输出
ubtensor[15:16] is: 6

3. 打印一段Global Memory的值。

tik_instance = tik.Tik()
gm_tensor = tik_instance.Tensor("float16", [256, ], tik.scope_gm, "gm_tensor")
tik_instance.printf("%f\n", gm_tensor[0:32])
tik_instance.BuildCCE(inputs=[gm_tensor], outputs=[], kernel_name="printf_gm")
data = np.random.uniform(-65504, 65504, [256, ]).astype(np.float16)
tik_instance.tikdb.start_debug(feed_dict={'gm_tensor': data})
输入
[-13288 46208 52448 -6488 -3364 55264 49376 3840 ...]
输出
-13288.000000 46208.000000 52448.000000 -6488.000000 -3364.000000 55264.000000 49376.000000 3840.000000 ...