markdown 计算和减少使用元组输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 计算和减少使用元组输入相关的知识,希望对你有一定的参考价值。

# Compute和Reduction使用元组输入

我们通常希望在单个循环内计算具有相同维度的多个输出,或者,执行涉及argmax等多个值的缩减。

在这篇教程,我们将介绍在TVM中元组输入。

```python
from __future__ import absolute_import, print_function

import tvm
import numpy as np
```

## batch计算

对于具有相同维度的运算符,如果我们希望它们在下一个策略程序中一起调度,我们可以将它们放在一起作为tvm.compute的输入。

```python
n = tvm.var("n")
m = tvm.var("m")
A0 = tvm.placeholder((m,n),name='A0')
A1 = tvm.placeholder((m,n),name='A1')
B0, B1 = tvm.compute((m,n),lambda i,j:(A0[i,j]+2,A1[i,j]*3),name='B')
#生成IR中间表示代码
s = tvm.create_schedule(B0.op)
print(tvm.lower(s, [A0,A1,B0,B1],simple_mode=True))
```

## Reduction使用协同输入

有时,我们需要多个输入来表示一些Reduction算子,输入将协同工作,例如argmax。在Reduction过程中,argmax需要比较操作数的值,也需要去保存操作数的索引。这能使用comm_reducer来表示:

```python
# xy是Reduction的操作数,他们是索引和值的元组
def fcombine(x,y):
    lhs = tvm.expr.Select((x[1]>=y[1]),x[0],y[0])
    rhs = tvm.expr.Select((x[1]>=y[1]),x[1],y[1])
    return lhs,rhs
# 标识元素也需要是一个元组,所以‘fidentity’接受两种类型数据作为输入
def fidentity(t0,t1):#t0,t1为类型dtype
    return tvm.const(-1,t0), tvm.min_value(t1)
argmax = tvm.comm_reducer(fcombine, fidentity, name='argmax')

#描述Reduction计算
m = tvm.var('m')
n = tvm.var('n')
idx = tvm.placeholder((m,n),name='idx',dtype='int32')
val = tvm.placeholder((m,n),name='val',dtype='int32')
k = tvm.reduce_axis((0,n), 'k')
T0, T1 = tvm.compute((m, ), lambda i: argmax(idx[i,k], val(i,k), axis=k),name='T')

#生成IR代码
s = tvm.create_schedule(T0.op)
print(tvm.lower(s, [idx, val, T0, T1], simple_mode=True))
```

## 总结

教程介绍元组输入算子的使用:

- 描述标准batch计算
- 描述Reduction算子使用元组输入
- 注意,只能使用操作而不是张量来计划计算

以上是关于markdown 计算和减少使用元组输入的主要内容,如果未能解决你的问题,请参考以下文章

Swift 减少元组数组自定义数据模型

如何减少推力的元组(也返回一个元组)?

markdown 3. Python - 元组

欢迎使用CSDN-markdown编辑器

gpu上的并行减少和计算错误的opencl

Pandas`agc`列表,“AttributeError / ValueError:函数不减少”