aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominic Symes <dominic.symes@arm.com>2020-11-10 11:50:19 +0000
committerDominic Symes <dominic.symes@arm.com>2020-11-10 19:05:16 +0000
commit4ee64650102977d2a6962b4ee5924e418da024cf (patch)
treed36da71bbed9d9d7481bf2ddee85def32d9a0615
parent23418f7246acee8f1fd475c118e663c8dc9fc7db (diff)
downloadspecification-4ee64650102977d2a6962b4ee5924e418da024cf.tar.gz
SCATTER: Add operation
Add the scatter operation to the gather/scatter section. Signed-off-by: Dominic Symes <dominic.symes@arm.com> Change-Id: I9baaef91bf70eae3b13e6e585df6c4821a0c1a93
-rw-r--r--chapters/scatter_gather.adoc51
1 files changed, 50 insertions, 1 deletions
diff --git a/chapters/scatter_gather.adoc b/chapters/scatter_gather.adoc
index cfee60b..e1be77f 100644
--- a/chapters/scatter_gather.adoc
+++ b/chapters/scatter_gather.adoc
@@ -36,7 +36,7 @@ for_each(0<=n<N, 0<=w<W, 0<=c<C) {
index_t k = tensor_read<index_t>(indices, [N,W], [n,w])
assert(0<=k && k<K)
value_t value = tensor_read<value_t>(values, [N,K,C], [n, k, c])
- tensor_write<value_t>(output, [N,W,C], [n,w,c])
+ tensor_write<value_t>(output, [N,W,C], [n,w,c], value)
}
----
@@ -51,3 +51,52 @@ for_each(0<=n<N, 0<=w<W, 0<=c<C) {
|MI,MT|float|int32|float
|===
+==== SCATTER
+
+The values_out tensor is set to the values_in tensor with data modified as follows: data from the input tensor is inserted at the positions specified by the indices tensor.
+N is the number of batches, W the number of indices in each batch, K the range of each index and C the number data channels for each index.
+
+*Arguments:*
+
+|===
+|Argument|Type|Name|Shape|Description
+
+|Input|value_t*|values_in|[N,K,C]|3D values in tensor
+|Input|index_t*|indices|[N,W]|2D index tensor
+|Input|value_t*|input|[N,W,C]|3D input tensor
+|Output|value_t*|values_out|[N,K,C]|3D values out tensor
+|===
+
+*Quantization Parameters:*
+
+None
+
+*Operation Function:*
+
+[source,c]
+----
+// Copy the values_in tensor to the values_out tensor.
+// Values not written by the scatter operation are unchanged in the output.
+for_each(0<=n<N, 0<=k<K, 0<=c<C) {
+ value_t value = tensor_read<value_t>(values_in, [N,K,C], [n,k,c])
+ tensor_write<value_t>(values_out, [N,K,C], [n, k, c], value)
+}
+// Now perform the SCATTER operation, writing to the positions from the indices tensor
+for_each(0<=n<N, 0<=w<W, 0<=c<C) {
+ index_t k = tensor_read<index_t>(indices, [N,W], [n,w])
+ assert(0<=k && k<K)
+ value_t value = tensor_read<value_t>(input, [N,W,C], [n,w,c])
+ tensor_write<value_t>(values_out, [N,K,C], [n, k, c], value)
+}
+----
+
+*Supported Data Types:*
+
+|===
+|Profile|Mode|index_t|value_t
+
+|Any|signed 8|int32|aint8
+|Any|signed 16|int32|int16
+|Any|signed 32|int32|int32
+|MI,MT|float|int32|float
+|===