diff --git a/doc/allocator.md b/doc/allocator.md new file mode 100644 index 0000000..9810311 --- /dev/null +++ b/doc/allocator.md @@ -0,0 +1,131 @@ +##### Allocator.h 头文件 API 兼容情况 + + +##### Allocator.h 头文件 API 兼容性 + +✅ 表示已经支持 +🚧 表示正在支持 +❌ 表示不准备支持 +🔧 表示部分支持(有功能限制) + +**按照功能分类排序** + +--- + +### 类型定义 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `DeleterFnPtr` | ✅ | ✅ | P0 | 删除器函数指针类型 | + +--- + +### DataPtr 类 + +#### 构造与赋值 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `DataPtr()` | ✅ | ✅ | P0 | 默认构造函数 | +| `DataPtr(void*, Device)` | ✅ | ✅ | P0 | 数据指针+设备构造 | +| `DataPtr(void*, void*, DeleterFnPtr, Device)` | ✅ | ✅ | P0 | 完整构造函数 | +| `DataPtr(const DataPtr&)` | ✅ | ✅ | P0 | 拷贝构造函数 | +| `DataPtr(DataPtr&&)` | ✅ | ✅ | P0 | 移动构造函数 | +| `operator=(const DataPtr&)` | ✅ | ✅ | P0 | 拷贝赋值运算符 | +| `operator=(DataPtr&&)` | ✅ | ✅ | P0 | 移动赋值运算符 | + +#### 数据访问 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `get()` | ✅ | ✅ | P0 | 获取原始指针 | +| `operator->()` | ✅ | ✅ | P0 | 指针访问运算符 | +| `operator bool()` | ✅ | ✅ | P0 | 布尔转换 | +| `device()` | ✅ | ✅ | P0 | 获取设备 | +| `get_deleter()` | ✅ | ✅ | P1 | 获取删除器 | +| `get_context()` | ✅ | ✅ | P1 | 获取上下文 | +| `clear()` | ✅ | ✅ | P1 | 清空数据 | +| `mutable_get()` | - [ ] | - [ ] | P2 | 获取可变指针 | +| `release_context()` | - [ ] | - [ ] | P2 | 释放上下文 | +| `move_context()` | - [ ] | - [ ] | P2 | 移动上下文 | +| `compare_exchange_deleter()` | - [ ] | - [ ] | P3 | 比较交换删除器 | +| `unsafe_set_device()` | - [ ] | - [ ] | P3 | 不安全设置设备 | + +#### 比较运算符 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `operator==(DataPtr, nullptr_t)` | ✅ | ✅ | P0 | | +| `operator==(nullptr_t, DataPtr)` | ✅ | ✅ | P0 | | +| `operator!=(DataPtr, nullptr_t)` | ✅ | ✅ | P0 | | +| `operator!=(nullptr_t, DataPtr)` | ✅ | ✅ | P0 | | + +--- + +### Allocator 基类 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `allocate(size_t)` | - [ ] | - [ ] | P2 | 分配内存 | +| `clone(void*, size_t)` | - [ ] | - [ ] | P3 | 克隆分配 | +| `is_simple_data_ptr()` | - [ ] | - [ ] | P3 | | +| `raw_deleter()` | - [ ] | - [ ] | P2 | 获取原始删除器 | +| `raw_allocate(size_t)` | - [ ] | - [ ] | P2 | 原始分配 | +| `raw_deallocate(void*)` | - [ ] | - [ ] | P2 | 原始释放 | +| `copy_data()` | - [ ] | - [ ] | P3 | 复制数据 | + +--- + +### 全局函数 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `SetAllocator()` | - [ ] | - [ ] | P3 | 设置分配器 | +| `GetAllocator()` | - [ ] | - [ ] | P3 | 获取分配器 | + +--- + +### InefficientStdFunctionContext + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `makeDataPtr()` | - [ ] | - [ ] | P3 | 创建带自定义删除器的 DataPtr | + +--- + +### Paddle 兼容层特有 API + +| API | 说明 | +|------------------------------|------| +| `DataPtr(shared_ptr)` | 从 Paddle Allocation 构造 | +| `allocation()` | 获取底层 phi::Allocation | + +--- + +### 兼容性统计 + +| 状态 | 数量 | +|------|------| +| ✅ 已完全支持 | 18 | +| 🚧 正在支持 | 0 | +| 🔧 部分支持 | 0 | +| - [ ] 未实现 | 12 | + +--- + +### 备注 + +1. **优先级说明**: + - P0: 核心功能,必须支持 + - P1: 常用功能,高优先级 + - P2: 进阶功能,中优先级 + - P3: 边缘功能,低优先级 + +2. **实现说明**: + - Paddle 兼容层的 `DataPtr` 基于 `phi::Allocation` 实现 + - 设备类型使用 `phi::Place` 而非 `c10::Device` + - `Allocator` 基类暂未实现,使用 Paddle 原生的 `phi::Allocator` + +3. **命名空间**: + - `c10::DataPtr` - 主命名空间 + - `at::DataPtr` - 别名 diff --git a/doc/layout.md b/doc/layout.md new file mode 100644 index 0000000..fac5f41 --- /dev/null +++ b/doc/layout.md @@ -0,0 +1,91 @@ +##### Layout.h 头文件 API 兼容情况 + + +##### Layout.h 头文件 API 兼容性 + +✅ 表示已经支持 +🚧 表示正在支持 +❌ 表示不准备支持 +🔧 表示部分支持(有功能限制) + +**按照功能分类排序** + +--- + +### Layout 枚举类型 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `Layout::Strided` | ✅ | ✅ | P0 | 标准密集布局 | +| `Layout::Sparse` | ✅ | ✅ | P2 | COO 稀疏布局 | +| `Layout::SparseCsr` | ✅ | ✅ | P2 | CSR 稀疏布局 | +| `Layout::Mkldnn` | ✅ | ✅ | P3 | MKLDNN 布局 | +| `Layout::SparseCsc` | ✅ | ✅ | P3 | CSC 稀疏布局 | +| `Layout::SparseBsr` | ✅ | ✅ | P3 | BSR 稀疏布局 | +| `Layout::SparseBsc` | ✅ | ✅ | P3 | BSC 稀疏布局 | +| `Layout::Jagged` | ✅ | ✅ | P3 | 不规则布局 | +| `Layout::NumOptions` | ✅ | ✅ | P3 | 布局选项数量 | + +--- + +### 布局常量 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `kStrided` | ✅ | ✅ | P0 | = Layout::Strided | +| `kSparse` | ✅ | ✅ | P2 | = Layout::Sparse | +| `kSparseCsr` | ✅ | ✅ | P2 | = Layout::SparseCsr | +| `kMkldnn` | ✅ | ✅ | P3 | = Layout::Mkldnn | +| `kSparseCsc` | ✅ | ✅ | P3 | = Layout::SparseCsc | +| `kSparseBsr` | ✅ | ✅ | P3 | = Layout::SparseBsr | +| `kSparseBsc` | ✅ | ✅ | P3 | = Layout::SparseBsc | +| `kJagged` | ✅ | ✅ | P3 | = Layout::Jagged | + +--- + +### 辅助函数 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `operator<<(ostream, Layout)` | ✅ | ✅ | P1 | 输出流运算符 | +| `layout_from_backend()` | - [ ] | - [ ] | P3 | 从后端推断布局 | + +--- + +### 命名空间导出 + +| 命名空间 | 导出内容 | 状态 | +|---------|---------|------| +| `c10` | Layout 枚举、所有常量 | ✅ | +| `at` | Layout 枚举、所有常量 | ✅ | +| `torch` | Layout 枚举、所有常量 | ✅ | + +--- + +### 兼容性统计 + +| 状态 | 数量 | +|------|------| +| ✅ 已完全支持 | 18 | +| 🚧 正在支持 | 0 | +| 🔧 部分支持 | 0 | +| - [ ] 未实现 | 1 | + +--- + +### 备注 + +1. **优先级说明**: + - P0: 核心功能,必须支持 + - P1: 常用功能,高优先级 + - P2: 进阶功能,中优先级 + - P3: 边缘功能,低优先级 + +2. **实现说明**: + - Layout 枚举与 LibTorch 完全一致 + - 输出流运算符支持所有布局类型的字符串表示 + - `layout_from_backend()` 未实现,因为 Paddle 使用不同的后端抽象 + +3. **使用建议**: + - 大多数场景使用 `kStrided`(默认密集布局) + - 稀疏张量相关布局需要配合稀疏张量 API 使用 diff --git a/doc/storage.md b/doc/storage.md new file mode 100644 index 0000000..a125f25 --- /dev/null +++ b/doc/storage.md @@ -0,0 +1,186 @@ +##### Storage.h 头文件 API 兼容情况 + + +##### Storage.h 头文件 API 兼容性 + +✅ 表示已经支持 +🚧 表示正在支持 +❌ 表示不准备支持 +🔧 表示部分支持(有功能限制) + +**按照功能分类排序** + +--- + +### 标签类型 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `Storage::use_byte_size_t` | ✅ | ✅ | P0 | 构造函数标签 | +| `Storage::unsafe_borrow_t` | ✅ | ✅ | P2 | 借用构造标签 | + +--- + +### 构造与赋值 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `Storage()` | ✅ | ✅ | P0 | 默认构造函数 | +| `Storage(const Storage&)` | ✅ | ✅ | P0 | 拷贝构造函数 | +| `Storage(Storage&&)` | ✅ | ✅ | P0 | 移动构造函数 | +| `operator=(const Storage&)` | ✅ | ✅ | P0 | 拷贝赋值运算符 | +| `operator=(Storage&&)` | ✅ | ✅ | P0 | 移动赋值运算符 | +| `Storage(intrusive_ptr)` | 🔧 | 🔧 | P1 | 使用 shared_ptr | +| `Storage(use_byte_size_t, SymInt, Allocator*, bool)` | 🔧 | 🔧 | P1 | 不支持 SymInt | +| `Storage(use_byte_size_t, size_t, DataPtr, Allocator*, bool)` | ✅ | ✅ | P1 | 预分配内存构造 | + +--- + +### 状态查询 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `operator bool()` | ✅ | ✅ | P0 | 有效性检查 | +| `nbytes()` | ✅ | ✅ | P0 | 获取字节数 | +| `sym_nbytes()` | - [ ] | - [ ] | P3 | 符号化字节数 | +| `resizable()` | ✅ | ✅ | P1 | 是否可调整大小 | +| `unique()` | ✅ | ✅ | P1 | 是否唯一持有 | +| `use_count()` | ✅ | ✅ | P1 | 引用计数 | + +--- + +### 数据访问 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `data()` | ✅ | ✅ | P0 | 获取 const 数据指针 | +| `mutable_data()` | ✅ | ✅ | P0 | 获取可变数据指针 | +| `data_ptr()` | ✅ | ✅ | P0 | 获取 DataPtr | +| `mutable_data_ptr()` | ✅ | ✅ | P0 | 获取可变 DataPtr | + +--- + +### 设备相关 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `device()` | ✅ | ✅ | P0 | 获取设备 | +| `device_type()` | ✅ | ✅ | P0 | 获取设备类型 | +| `allocator()` | ✅ | ✅ | P1 | 获取分配器 | + +--- + +### 数据修改 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `set_nbytes(size_t)` | ✅ | ✅ | P1 | 设置字节数 | +| `set_nbytes(SymInt)` | - [ ] | - [ ] | P3 | 符号化设置字节数 | +| `set_data_ptr(DataPtr&&)` | ✅ | ✅ | P1 | 设置数据指针(交换) | +| `set_data_ptr_noswap(DataPtr&&)` | ✅ | ✅ | P1 | 设置数据指针(不交换) | + +--- + +### 别名检测 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `is_alias_of(Storage)` | ✅ | ✅ | P1 | 检查是否为别名 | +| `isSharedStorageAlias()` | ✅ | ✅ | P1 | 全局别名检测函数 | + +--- + +### 内部访问 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `unsafeGetStorageImpl()` | 🔧 | 🔧 | P2 | 返回 phi::Allocation* | +| `unsafeReleaseStorageImpl()` | 🔧 | 🔧 | P2 | 返回 phi::Allocation* | +| `getWeakStorageImpl()` | - [ ] | - [ ] | P3 | 弱引用 | + +--- + +### 静态工厂方法 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `create_legacy(Device)` | - [ ] | - [ ] | P3 | 创建遗留存储 | +| `reset_legacy()` | - [ ] | - [ ] | P3 | 重置遗留存储 | + +--- + +### 外部指针共享 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `UniqueStorageShareExternalPointer(void*, size_t, DeleterFnPtr)` | - [ ] | - [ ] | P2 | | +| `UniqueStorageShareExternalPointer(DataPtr&&, size_t)` | - [ ] | - [ ] | P2 | | + +--- + +### MaybeOwnedTraits 特化 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `createBorrow()` | ✅ | ✅ | P2 | 创建借用 | +| `assignBorrow()` | ✅ | ✅ | P2 | 赋值借用 | +| `destroyBorrow()` | ✅ | ✅ | P2 | 销毁借用 | +| `referenceFromBorrow()` | ✅ | ✅ | P2 | 从借用获取引用 | +| `pointerFromBorrow()` | ✅ | ✅ | P2 | 从借用获取指针 | +| `debugBorrowIsValid()` | ✅ | ✅ | P3 | 调试检查 | + +--- + +### ExclusivelyOwnedTraits 特化 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `nullRepr()` | ✅ | ✅ | P2 | 空表示 | +| `createInPlace()` | ✅ | ✅ | P2 | 就地创建 | +| `moveToRepr()` | ✅ | ✅ | P2 | 移动到表示 | +| `take()` | ✅ | ✅ | P2 | 取走所有权 | +| `getImpl()` | ✅ | ✅ | P2 | 获取实现指针 | + +--- + +### Paddle 兼容层特有 API + +| API | 说明 | +|------------------------------|------| +| `valid()` | 检查存储是否有效(有分配) | +| `allocation()` | 获取底层 phi::Allocation | +| `unsafeGetAllocation()` | 不安全获取 phi::Allocation 指针 | +| `unsafeReleaseAllocation()` | 不安全释放 phi::Allocation | + +--- + +### 兼容性统计 + +| 状态 | 数量 | +|------|------| +| ✅ 已完全支持 | 35 | +| 🚧 正在支持 | 0 | +| 🔧 部分支持 | 4 | +| - [ ] 未实现 | 8 | + +--- + +### 备注 + +1. **优先级说明**: + - P0: 核心功能,必须支持 + - P1: 常用功能,高优先级 + - P2: 进阶功能,中优先级 + - P3: 边缘功能,低优先级 + +2. **实现说明**: + - Paddle 兼容层的 `Storage` 基于 `phi::Allocation` 实现,而非 `StorageImpl` + - 分配器使用 `phi::Allocator*` 而非 `c10::Allocator*` + - 设备类型使用 `phi::Place` 和 `phi::AllocationType` + +3. **部分支持说明**: + - `Storage(intrusive_ptr)`: 使用 `shared_ptr` 替代 + - `Storage(use_byte_size_t, SymInt, ...)`: 不支持符号化整数,仅支持 `size_t` + - `unsafeGetStorageImpl()` / `unsafeReleaseStorageImpl()`: 返回 `phi::Allocation*` 而非 `StorageImpl*` + +4. **符号化 API** (`sym_*`): 用于动态形状场景,目前均未支持 diff --git a/doc/tensor_base.md b/doc/tensor_base.md new file mode 100644 index 0000000..8f57fde --- /dev/null +++ b/doc/tensor_base.md @@ -0,0 +1,297 @@ +##### TensorBase.h 头文件 API 兼容情况 + + +##### TensorBase.h 头文件 API 兼容性 + +✅ 表示已经支持 +🚧 表示正在支持 +❌ 表示不准备支持 +🔧 表示部分支持(有功能限制) + +**按照功能分类排序** + +--- + +### 构造与赋值 + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `TensorBase()` | ✅ | ✅ | P0 | 默认构造函数 | +| `TensorBase(const TensorBase&)` | ✅ | ✅ | P0 | 拷贝构造函数 | +| `TensorBase(TensorBase&&)` | ✅ | ✅ | P0 | 移动构造函数 | +| `operator=(const TensorBase&)` | ✅ | ✅ | P0 | 拷贝赋值运算符 | +| `operator=(TensorBase&&)` | ✅ | ✅ | P0 | 移动赋值运算符 | + +--- + +### 数据访问 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `data_ptr()` | ✅ | ✅ | P0 | 返回 `void*` | +| `data_ptr()` | ✅ | ✅ | P0 | 返回类型化指针 | +| `const_data_ptr()` | ✅ | ✅ | P0 | 返回 `const void*` | +| `const_data_ptr()` | ✅ | ✅ | P0 | 返回类型化 const 指针 | +| `mutable_data_ptr()` | ✅ | ✅ | P0 | 返回可变 `void*` | +| `mutable_data_ptr()` | ✅ | ✅ | P0 | 返回可变类型化指针 | +| `accessor()` | ✅ | ✅ | P1 | TensorAccessor | +| `generic_packed_accessor()` | 🚧 | 🚧 | P2 | CUDA PackedTensorAccessor | +| `packed_accessor32()` | 🚧 | 🚧 | P2 | 32位索引 PackedAccessor | +| `packed_accessor64()` | 🚧 | 🚧 | P2 | 64位索引 PackedAccessor | + +--- + +### 维度与形状 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `dim()` | ✅ | ✅ | P0 | 返回维度数 | +| `ndimension()` | ✅ | ✅ | P0 | 同 `dim()` | +| `size(dim)` | ✅ | ✅ | P0 | 支持负索引 | +| `sizes()` | ✅ | ✅ | P0 | 返回 IntArrayRef | +| `stride(dim)` | ✅ | ✅ | P0 | 支持负索引 | +| `strides()` | ✅ | ✅ | P0 | 返回 IntArrayRef | +| `numel()` | ✅ | ✅ | P0 | 元素总数 | +| `storage_offset()` | 🚧 | 🚧 | P2 | | +| `sym_size(dim)` | 🚧 | 🚧 | P3 | 符号化 size | +| `sym_stride(dim)` | 🚧 | 🚧 | P3 | 符号化 stride | +| `sym_sizes()` | 🚧 | 🚧 | P3 | 符号化 sizes | +| `sym_strides()` | 🚧 | 🚧 | P3 | 符号化 strides | +| `sym_numel()` | 🚧 | 🚧 | P3 | 符号化 numel | +| `sym_storage_offset()` | 🚧 | 🚧 | P3 | 符号化 storage_offset | + +--- + +### 内存与字节 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `nbytes()` | ✅ | ✅ | P0 | 总字节数 | +| `itemsize()` | ✅ | ✅ | P0 | 单元素字节数 | +| `element_size()` | ✅ | ✅ | P0 | 同 `itemsize()` | + +--- + +### 类型与设备 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `dtype()` | ✅ | ✅ | P0 | 返回 ScalarType | +| `scalar_type()` | ✅ | ✅ | P0 | 同 `dtype()` | +| `device()` | ✅ | ✅ | P0 | 返回 Device | +| `get_device()` | ✅ | ✅ | P0 | 返回设备索引 | +| `options()` | ✅ | ✅ | P0 | 返回 TensorOptions | +| `layout()` | ✅ | 🚧 | P2 | 返回 Layout | +| `key_set()` | - [ ] | - [ ] | P3 | DispatchKeySet | + +--- + +### 设备类型检查 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `is_cpu()` | ✅ | ✅ | P0 | CPU 后端检查 | +| `is_cuda()` | ✅ | ✅ | P0 | CUDA 后端检查 | +| `is_xpu()` | - [ ] | - [ ] | P2 | XPU 后端检查 | +| `is_ipu()` | - [ ] | - [ ] | P3 | IPU 后端检查 | +| `is_xla()` | - [ ] | - [ ] | P3 | XLA 后端检查 | +| `is_mtia()` | - [ ] | - [ ] | P3 | MTIA 后端检查 | +| `is_hpu()` | - [ ] | - [ ] | P3 | HPU 后端检查 | +| `is_lazy()` | - [ ] | - [ ] | P3 | Lazy 后端检查 | +| `is_hip()` | - [ ] | - [ ] | P3 | HIP 后端检查 | +| `is_ve()` | - [ ] | - [ ] | P3 | VE 后端检查 | +| `is_privateuseone()` | - [ ] | - [ ] | P3 | PrivateUse1 后端检查 | +| `is_meta()` | - [ ] | - [ ] | P3 | Meta tensor 检查 | + +--- + +### 张量属性检查 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `defined()` | ✅ | ✅ | P0 | 是否已定义 | +| `is_contiguous()` | ✅ | ✅ | P0 | 连续性检查 | +| `sym_is_contiguous()` | - [ ] | - [ ] | P3 | 符号化连续性检查 | +| `is_contiguous_or_false()` | 🚧 | 🚧 | P3 | | +| `is_non_overlapping_and_dense()` | 🚧 | 🚧 | P3 | | +| `is_complex()` | 🚧 | 🚧 | P2 | 是否复数类型 | +| `is_floating_point()` | 🚧 | 🚧 | P2 | 是否浮点类型 | +| `is_signed()` | 🚧 | 🚧 | P2 | 是否有符号类型 | +| `is_sparse()` | 🚧 | 🚧 | P3 | 是否稀疏张量 | +| `is_sparse_csr()` | 🚧 | 🚧 | P3 | 是否 CSR 稀疏张量 | +| `is_mkldnn()` | - [ ] | - [ ] | P3 | 是否 MKLDNN 张量 | +| `is_mps()` | - [ ] | - [ ] | P3 | 是否 MPS 张量 | +| `is_vulkan()` | - [ ] | - [ ] | P3 | 是否 Vulkan 张量 | +| `is_metal()` | - [ ] | - [ ] | P3 | 是否 Metal 张量 | +| `is_quantized()` | - [ ] | - [ ] | P3 | 是否量化张量 | +| `is_inference()` | - [ ] | - [ ] | P3 | 是否推理张量 | +| `is_nested()` | - [ ] | - [ ] | P3 | 是否嵌套张量 | + +--- + +### 内存格式与连续性 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `contiguous()` | 🔧 | ✅ | P0 | 仅支持 Contiguous 格式 | +| `expect_contiguous()` | - [ ] | - [ ] | P2 | MaybeOwned 版本 | +| `suggest_memory_format()` | - [ ] | - [ ] | P2 | | + +--- + +### 就地修改操作 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `fill_(scalar)` | ✅ | ✅ | P0 | 填充标量值 | +| `zero_()` | ✅ | ✅ | P0 | 置零 | +| `copy_(src, non_blocking)` | ✅ | ✅ | P0 | 复制数据 | + +--- + +### 形状变换 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `reshape(shape)` | ✅ | ✅ | P0 | | +| `view(size)` | ✅ | ✅ | P0 | 形状 view | +| `view(dtype)` | ✅ | ✅ | P1 | 类型 view | + +--- + +### 类型转换 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `to(options, ...)` | 🔧 | ✅ | P1 | 仅支持 dtype 转换,不支持 device/memory_format | + +--- + +### 存储相关 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `has_storage()` | 🚧 | 🚧 | P2 | | +| `storage()` | 🚧 | 🚧 | P2 | | +| `is_alias_of(other)` | 🚧 | 🚧 | P2 | | +| `share_memory_()` | - [ ] | - [ ] | P3 | | + +--- + +### 内部状态 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `is_same(other)` | 🚧 | 🚧 | P2 | 是否同一张量 | +| `use_count()` | 🚧 | 🚧 | P3 | 引用计数 | +| `weak_use_count()` | 🚧 | 🚧 | P3 | 弱引用计数 | +| `reset()` | ✅ | 🚧 | P2 | 重置张量 | +| `_is_zerotensor()` | - [ ] | - [ ] | P3 | | +| `_set_zero(zero)` | - [ ] | - [ ] | P3 | | +| `is_conj()` | - [ ] | - [ ] | P3 | 共轭标记 | +| `_set_conj(conjugate)` | - [ ] | - [ ] | P3 | | +| `is_neg()` | - [ ] | - [ ] | P3 | 负号标记 | +| `_set_neg(negative)` | - [ ] | - [ ] | P3 | | + +--- + +### TensorImpl 访问 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `unsafeGetTensorImpl()` | - [ ] | - [ ] | P3 | 内部使用 | +| `unsafeReleaseTensorImpl()` | - [ ] | - [ ] | P3 | 内部使用 | +| `getIntrusivePtr()` | - [ ] | - [ ] | P3 | 内部使用 | +| `unsafeReleaseIntrusivePtr()` | - [ ] | - [ ] | P3 | 内部使用 | + +--- + +### 命名张量 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `has_names()` | 🚧 | 🚧 | P3 | | +| `opt_names()` | - [ ] | - [ ] | P3 | | +| `names()` | - [ ] | - [ ] | P3 | | +| `get_named_tensor_meta()` | - [ ] | - [ ] | P3 | | + +--- + +### 自动求导 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `requires_grad()` | - [ ] | - [ ] | P1 | | +| `set_requires_grad(bool)` | - [ ] | - [ ] | P1 | | +| `requires_grad_(bool)` | - [ ] | - [ ] | P1 | | +| `is_leaf()` | - [ ] | - [ ] | P2 | | +| `grad_fn()` | - [ ] | - [ ] | P2 | | +| `retain_grad()` | - [ ] | - [ ] | P2 | | +| `retains_grad()` | - [ ] | - [ ] | P2 | | +| `_fw_grad(level)` | - [ ] | - [ ] | P3 | Forward AD | +| `_set_fw_grad(...)` | - [ ] | - [ ] | P3 | Forward AD | +| `register_hook(hook)` | - [ ] | - [ ] | P2 | | +| `remove_hook(pos)` | - [ ] | - [ ] | P2 | | +| `output_nr()` | - [ ] | - [ ] | P3 | | +| `set_data(new_data)` | - [ ] | - [ ] | P2 | | +| `data()` | - [ ] | - [ ] | P2 | | +| `_version()` | - [ ] | - [ ] | P3 | | +| `tensor_data()` | - [ ] | - [ ] | P3 | | +| `variable_data()` | - [ ] | - [ ] | P3 | | + +--- + +### 视图相关 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `is_view()` | - [ ] | - [ ] | P2 | | +| `_base()` | - [ ] | - [ ] | P2 | | + +--- + +### 杂项 API + +| torch API | paddle API 兼容性 | 测试用例状态 | 优先级 | 备注 | +|------------------------------|------------------|------------|-------|------| +| `toString()` | 🚧 | 🚧 | P3 | | +| `print()` | 🚧 | 🚧 | P3 | | +| `name()` | - [ ] | - [ ] | P3 | | +| `quantizer()` | - [ ] | - [ ] | P3 | 量化器 | + +--- + +### Paddle 兼容层特有 API + +| API | 说明 | +|------------------------------|------| +| `_PD_GetInner()` | 获取内部 PaddleTensor 引用 | + +--- + +### 兼容性统计 + +| 状态 | 数量 | +|------|------| +| ✅ 已完全支持 | 35 | +| 🚧 正在支持 | 7 | +| 🔧 部分支持 | 2 | +| - [ ] 未实现 | 63+ | + +--- + +### 备注 + +1. **优先级说明**: + - P0: 核心功能,必须支持 + - P1: 常用功能,高优先级 + - P2: 进阶功能,中优先级 + - P3: 边缘功能,低优先级 + +2. **部分支持说明**: + - `contiguous()`: 目前仅支持 `MemoryFormat::Contiguous`,不支持 ChannelsLast 等格式 + - `to()`: 目前仅支持 dtype 转换,不支持 device 和 memory_format 选项 + +3. **符号化 API** (`sym_*`): 用于动态形状场景,目前均未支持 + +4. **自动求导 API**: 需要与 Paddle 的自动求导机制对接,待后续实现