From 2c9d6e98683b1912ffa55ee9da7cb7820c2a98b4 Mon Sep 17 00:00:00 2001 From: zhaoshijie Date: Fri, 30 May 2025 12:32:26 +0800 Subject: [PATCH 1/4] spmv docs init --- infiniop/ops/spmv/README.md | 146 ++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 infiniop/ops/spmv/README.md diff --git a/infiniop/ops/spmv/README.md b/infiniop/ops/spmv/README.md new file mode 100644 index 0000000..b6b56cc --- /dev/null +++ b/infiniop/ops/spmv/README.md @@ -0,0 +1,146 @@ +# `SPMV` + +`SPMV`,即**稀疏矩阵向量乘法**算子。计算公式为: + +$$ y = A * x $$ + +其中: + +- `A` 为稀疏矩阵,通过CSR稀疏格式存储。 +- `x` 为输入向量。 +- `y` 为输出向量,结果由稀疏矩阵向量乘法规则确定。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopSpMV( + infiniopSpMVDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *y, + const void *x, + const void *values, + const void *row_ptr, + const void *col_indices, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSpMVDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `y`: + 计算输出向量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `x`: + 输入向量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `values`: + 稀疏矩阵的非零元素值。张量限制见[创建算子描述](#创建算子描述)部分。 +- `row_ptr`: + 稀疏矩阵的行偏移。张量限制见[创建算子描述](#创建算子描述)部分。 +- `col_indices`: + 稀疏矩阵的列索引。张量限制见[创建算子描述](#创建算子描述)部分。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateSpMVDescriptor( + infiniopHandle_t handle, + infiniopSpMVDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t y_desc, + infiniopTensorDescriptor_t x_desc, + infiniopTensorDescriptor_t values_desc, + infiniopTensorDescriptor_t row_ptr_desc, + infiniopTensorDescriptor_t col_indices_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`] +- `desc_ptr`: + 指向将被初始化的算子描述符地址; +- `y_desc` - { float32 | (M,) | (~) }: + 算子计算参数 `y` 的张量描述。 +- `x_desc` - { float32 | (N,) | (~) }: + 算子计算参数 `x` 的张量描述。 +- `values_desc` - { float32 | (nnz,) | (~) }: + 算子计算参数 `values` 的张量描述。 +- `row_ptr_desc` - { int32 | (M+1,) | (~) }: + 算子计算参数 `row_indices` 的张量描述。 +- `col_indices_desc` - { int32 | (nnz,) | (~) }: + 算子计算参数 `col_indices` 的张量描述。 + +
参数限制:
+ +参数限制: + +- `M`: M > 0(输出向量维度); +- `N`: N > 0(输入向量维度); +- `nnz`: nnz > 0(非零元素个数); + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetSpMVWorkspaceSize( + infiniopSpMVDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSpMVDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroySpMVDescriptor( + infiniopSpMVDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + + +[`InfiniopHandle_t`]: /handle/README.md + +[`INFINI_STATUS_SUCCESS`]:/common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]:/common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]:/common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From b28af6040a0eb6bf73d978bac235c20e8868429b Mon Sep 17 00:00:00 2001 From: zhaoshijie Date: Fri, 30 May 2025 12:34:35 +0800 Subject: [PATCH 2/4] update --- infiniop/ops/spmv/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infiniop/ops/spmv/README.md b/infiniop/ops/spmv/README.md index b6b56cc..5d0b001 100644 --- a/infiniop/ops/spmv/README.md +++ b/infiniop/ops/spmv/README.md @@ -80,7 +80,7 @@ infiniStatus_t infiniopCreateSpMVDescriptor( - `values_desc` - { float32 | (nnz,) | (~) }: 算子计算参数 `values` 的张量描述。 - `row_ptr_desc` - { int32 | (M+1,) | (~) }: - 算子计算参数 `row_indices` 的张量描述。 + 算子计算参数 `row_ptr` 的张量描述。 - `col_indices_desc` - { int32 | (nnz,) | (~) }: 算子计算参数 `col_indices` 的张量描述。 From e1110523370c1931ccee9c894df6e9cab67bf8e7 Mon Sep 17 00:00:00 2001 From: zhaoshijie Date: Wed, 25 Jun 2025 19:57:54 +0800 Subject: [PATCH 3/4] update spmv md --- infiniop/ops/spmv/README.md | 97 ++++++++++++------------------------- 1 file changed, 32 insertions(+), 65 deletions(-) diff --git a/infiniop/ops/spmv/README.md b/infiniop/ops/spmv/README.md index 5d0b001..f4484e1 100644 --- a/infiniop/ops/spmv/README.md +++ b/infiniop/ops/spmv/README.md @@ -6,9 +6,9 @@ $$ y = A * x $$ 其中: -- `A` 为稀疏矩阵,通过CSR稀疏格式存储。 -- `x` 为输入向量。 -- `y` 为输出向量,结果由稀疏矩阵向量乘法规则确定。 +- `A` 为稀疏矩阵。 +- `x` 为输入稠密向量。 +- `y` 为输出的稠密向量。 ## 接口 @@ -17,12 +17,10 @@ $$ y = A * x $$ ```c infiniStatus_t infiniopSpMV( infiniopSpMVDescriptor_t desc, - void *workspace, - size_t workspace_size, void *y, const void *x, const void *values, - const void *row_ptr, + const void *row_indices, const void *col_indices, void *stream ); @@ -32,26 +30,22 @@ infiniStatus_t infiniopSpMV( - `desc`: 已使用 `infiniopCreateSpMVDescriptor()` 初始化的算子描述符。 -- `workspace`: - 指向算子计算所需的额外工作空间。 -- `workspace_size`: - `workspace` 的大小,单位:字节。 - `y`: - 计算输出向量。张量限制见[创建算子描述](#创建算子描述)部分。 + 计算输出向量。 - `x`: - 输入向量。张量限制见[创建算子描述](#创建算子描述)部分。 + 输入向量。 - `values`: - 稀疏矩阵的非零元素值。张量限制见[创建算子描述](#创建算子描述)部分。 -- `row_ptr`: - 稀疏矩阵的行偏移。张量限制见[创建算子描述](#创建算子描述)部分。 + 稀疏矩阵的非零元素值数组。 +- `row_indices`: + 稀疏矩阵的行偏移数组。 - `col_indices`: - 稀疏矩阵的列索引。张量限制见[创建算子描述](#创建算子描述)部分。 + 稀疏矩阵的列索引数组。 - `stream`: 计算流/队列。
返回值:
-- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. ### 创建算子描述 @@ -59,11 +53,10 @@ infiniStatus_t infiniopSpMV( infiniStatus_t infiniopCreateSpMVDescriptor( infiniopHandle_t handle, infiniopSpMVDescriptor_t *desc_ptr, - infiniopTensorDescriptor_t y_desc, - infiniopTensorDescriptor_t x_desc, - infiniopTensorDescriptor_t values_desc, - infiniopTensorDescriptor_t row_ptr_desc, - infiniopTensorDescriptor_t col_indices_desc + size_t num_cols, + size_t num_rows, + size_t nnz, + infiniDtype_t dtype ); ``` @@ -72,49 +65,26 @@ infiniStatus_t infiniopCreateSpMVDescriptor( - `handle`: `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`] - `desc_ptr`: - 指向将被初始化的算子描述符地址; -- `y_desc` - { float32 | (M,) | (~) }: - 算子计算参数 `y` 的张量描述。 -- `x_desc` - { float32 | (N,) | (~) }: - 算子计算参数 `x` 的张量描述。 -- `values_desc` - { float32 | (nnz,) | (~) }: - 算子计算参数 `values` 的张量描述。 -- `row_ptr_desc` - { int32 | (M+1,) | (~) }: - 算子计算参数 `row_ptr` 的张量描述。 -- `col_indices_desc` - { int32 | (nnz,) | (~) }: - 算子计算参数 `col_indices` 的张量描述。 + 指向将被初始化的算子描述符地址。 +- `num_cols`: + 稀疏矩阵的列数。 +- `num_rows`: + 行偏移数组长度。 +- `nnz`: + 非零元素数量。 +- `dtype`: + 数据类型(当前仅支持 `Float32`)。
参数限制:
-参数限制: - -- `M`: M > 0(输出向量维度); -- `N`: N > 0(输入向量维度); -- `nnz`: nnz > 0(非零元素个数); - -
返回值:
- -- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. - -### 计算额外工作空间 - -```c -infiniStatus_t infiniopGetSpMVWorkspaceSize( - infiniopSpMVDescriptor_t desc, - size_t *size -); -``` - -
参数:
- -- `desc`: - 已使用 `infiniopCreateSpMVDescriptor()` 初始化的算子描述符。 -- `size`: - 额外空间大小的计算结果的写入地址; +- `num_cols` > 0; +- `num_rows` > 0; +- `nnz` > 0; +- `dtype`: 当前仅支持 `Float32`;
返回值:
-- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. ### 销毁算子描述符 @@ -127,20 +97,17 @@ infiniStatus_t infiniopDestroySpMVDescriptor(
参数:
- `desc`: - 输入。待销毁的算子描述符; + 输入。待销毁的算子描述符。
返回值:
- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. -[`InfiniopHandle_t`]: /handle/README.md +[`InfiniopHandle_t`]: /infiniop/handle/README.md [`INFINI_STATUS_SUCCESS`]:/common/status/README.md#INFINI_STATUS_SUCCESS [`INFINI_STATUS_BAD_PARAM`]:/common/status/README.md#INFINI_STATUS_BAD_PARAM -[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]:/common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED [`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR -[`INFINI_STATUS_BAD_TENSOR_SHAPE`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE -[`INFINI_STATUS_BAD_TENSOR_DTYPE`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE -[`INFINI_STATUS_BAD_TENSOR_STRIDES`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]:/common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE \ No newline at end of file From cd57f5ba61545348f3e5112c1514e0f49ce0af78 Mon Sep 17 00:00:00 2001 From: zhaoshijie Date: Wed, 25 Jun 2025 20:22:07 +0800 Subject: [PATCH 4/4] update spmv md --- infiniop/ops/spmv/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infiniop/ops/spmv/README.md b/infiniop/ops/spmv/README.md index f4484e1..91e70f2 100644 --- a/infiniop/ops/spmv/README.md +++ b/infiniop/ops/spmv/README.md @@ -20,7 +20,7 @@ infiniStatus_t infiniopSpMV( void *y, const void *x, const void *values, - const void *row_indices, + const void *row_ptr, const void *col_indices, void *stream ); @@ -36,7 +36,7 @@ infiniStatus_t infiniopSpMV( 输入向量。 - `values`: 稀疏矩阵的非零元素值数组。 -- `row_indices`: +- `row_ptr`: 稀疏矩阵的行偏移数组。 - `col_indices`: 稀疏矩阵的列索引数组。