ElementWise

计算两个输入张量之间的逐元素二元运算,生成一个输出张量。如果适用,则使用广播(有关更多信息,请参阅形状信息)。

属性

operation ElementWise 操作可以是以下之一

  • SUM \(output=input1+input2\)

  • PROD \(output=input1*input2\)

  • MAX \(output=max(input1,input2)\)

  • MIN \(output=min(input1,input2)\)

  • SUB \(output=input1-input2\)

  • DIV \(output=\frac{input1}{input2}\)

  • POWER \(output=input1^{input2}\)

  • FLOOR_DIV \(output=\lfloor\frac{a}{b}\rfloor\)

  • AND \(output=and(input1,input2)\)

  • OR \(output=or(input1,input2)\)

  • XOR \(output=xor(input1,input2)\)

  • EQUAL \(output=(input1==input2)\)

  • GREATER \(output=(input1>input2)\)

  • LESS \(output=(input1<input2)\)

输入

input1: 类型为 T1 的张量

input2: 类型为 T1 的张量

输出

output: 类型为 T2 的张量

数据类型

如果未明确指定,则 T1==T2

操作

T1

T2

SUM

int8, int32, int64, float16, float32, bfloat16

PROD

int8, int32, int64, float16, float32, bfloat16

MAX

int8, int32, int64, float16, float32, bfloat16

MIN

int8, int32, int64, float16, float32, bfloat16

SUB

int8, int32, int64, float16, float32, bfloat16

DIV

int8, int32, int64, float16, float32, bfloat16

POWER

int8, float16, float32, bfloat16

FLOOR_DIV

int8, int32, int64, float16, float32, bfloat16

AND

bool

OR

bool

XOR

bool

EQUAL

int32, int64, float16, float32, bfloat16

bool

GREATER

int32, int64, float16, float32, bfloat16

bool

LESS

int32, int64, float16, float32, bfloat16

bool

形状信息

输入必须具有相同的秩。对于每个维度,它们的长度必须匹配,或者其中一个必须等于 1。在后一种情况下,张量会沿该轴广播。

输出与输入具有相同的秩。对于每个输出维度,如果对应的输入维度长度匹配,则其长度等于输入维度的长度;否则,等于不为 1 的长度。

DLA 支持

DLA 在特定条件下支持以下 operation 类型

  • POW 其中只有一个输入是常量

  • DIV 其中最多只有一个输入是常量

  • EQUAL 其中最多只有一个输入是常量

  • GREATER 其中最多只有一个输入是常量

  • LESS 其中最多只有一个输入是常量

比较操作(EQUALGREATERLESS)支持广播。但是,为了在 DLA 上被认为是广播兼容的,一个形状必须具有以下配置之一:NCHW(即形状相等)、NC11(即 N 和 C 相等,H 和 W 为 1)或 N111(即 N 相等,C、H 和 W 为 1)。

GREATER/LESSEQUAL 都具有相同的输入时,DLA 也支持“大于或等于”和“小于或等于”。

示例

ElementWise 广播示例
in1 = network.add_input("input1", dtype=trt.float32, shape=(2, 3))
in2 = network.add_input("input2", dtype=trt.float32, shape=(1, 3))
layer = network.add_elementwise(in1, in2, op=trt.ElementWiseOperation.PROD)
network.mark_output(layer.get_output(0))

inputs[in1.name] = np.array([[-3.0, -2.0, -1.0], [0.0, 1.0, 2.0]])
inputs[in2.name] = np.array([[4.0, 5.0, 6.0]])

outputs[layer.get_output(0).name] = layer.get_output(0).shape

expected[layer.get_output(0).name] = np.array([[-12.0, -10.0, -6.0], [0.0, 5.0, 12.0]])

C++ API

有关 C++ IElementWiseLayer 算子的更多信息,请参阅 C++ IElementWiseLayer 文档

Python API

有关 Python IElementWiseLayer 算子的更多信息,请参阅 Python IElementWiseLayer 文档