99├── CMakeLists.txt # 顶层:include 宏 + add_subdirectory
1010├── common/
1111│ ├── CMakeLists.txt # header-only interface library
12- │ ├── test_macros.cmake # CMake 宏:infini_train_add_test / infini_train_add_test_suite
1312│ └── test_utils.h # C++ 基类、skip 宏、填充工具函数
1413├── tensor/ # Tensor 创建 / 拷贝 / 销毁 / 算子
1514├── optimizer/ # Optimizer 创建 / step
1817├── lora/ # LoRA 相关
1918├── dtype/ # Scalar / dtype dispatch + 编译期负面测试
2019└── transformer/ # Transformer 架构测试
20+
21+ cmake/
22+ └── test_macros.cmake # CMake 宏:infini_train_add_test / infini_train_add_test_suite
2123```
2224
2325### 核心设计:设备参数化
@@ -32,14 +34,15 @@ tests/
3234
3335| 基类 | 用途 | 提供的能力 |
3436| ------| ------| -----------|
35- | ` InfiniTrainTest ` | 通用参数化测试 | ` GetDevice() ` , ` createTensor(shape, dtype, requires_grad) ` |
36- | ` AutogradTestBase ` | Autograd 测试 | ` createTensor(shape, value) ` 自动 ` requires_grad=true ` + 顺序填充 |
37+ | ` InfiniTrainTest ` | 通用参数化测试 | ` GetDevice() ` (当前参数化的 ` Device ` ) |
3738
38- ** 为什么需要 AutogradTestBase? **
39+ 测试中的张量直接通过 ` Tensor ` 构造接口创建:
3940
40- - 所有 autograd 测试都需要 ` requires_grad=true `
41- - 所有 autograd 测试都需要填充数据
42- - 前向/反向传播测试必须有输入数据才能验证结果。` AutogradTestBase ` 把 ` FillSequentialTensor ` 内置了,避免每个测试都手动调用
41+ ``` cpp
42+ auto t = std::make_shared<Tensor>(shape, DataType::kFLOAT32 , GetDevice());
43+ auto g = std::make_shared<Tensor>(shape, DataType::kFLOAT32 , GetDevice(), /* requires_grad=*/ true );
44+ t->Fill (1.0f); // 常量填充(framework 内置 API)
45+ ```
4346
4447### 跳过特定平台
4548
@@ -110,14 +113,14 @@ mkdir tests/foo
110113// tests/foo/test_foo_basic.cc
111114#include < gtest/gtest.h>
112115#include " infini_train/include/tensor.h"
113- #include " test_utils.h"
116+ #include " tests/common/ test_utils.h"
114117
115118using namespace infini_train ;
116119
117120class FooBasicTest : public infini_train ::test::InfiniTrainTest {};
118121
119122TEST_P(FooBasicTest, CreateTensor) {
120- auto tensor = createTensor( {2, 3});
123+ auto tensor = std::make_shared< Tensor >(std::vector<int64_t> {2, 3}, DataType::kFLOAT32, GetDevice() );
121124 EXPECT_NE(tensor, nullptr);
122125}
123126
@@ -129,12 +132,9 @@ TEST_P(FooBasicTest, CUDAOnlyFeature) {
129132INFINI_TRAIN_REGISTER_TEST(FooBasicTest);
130133```
131134
132- **基类选择(或创建) :**
135+ **基类选择:**
133136
134- | 场景 | 基类 |
135- |------|------|
136- | 通用测试 | `InfiniTrainTest`(提供 `createTensor(shape, dtype, requires_grad)`) |
137- | 需要 autograd | `AutogradTestBase`(提供 `createTensor(shape, value)`,自动 `requires_grad=true` + 顺序填充) |
137+ 所有测试类都继承 `InfiniTrainTest`。需要梯度时,给 `Tensor` 构造传 `requires_grad=true`;需要填充数据时用 `Tensor::Fill`。
138138
139139**Step 2: 写 CMakeLists.txt**
140140
@@ -176,8 +176,6 @@ add_subdirectory(foo)
176176| 函数 / 宏 | 用途 |
177177| -----------| ------|
178178| ` GetDevice() ` | 返回当前参数化的 ` Device ` (基类方法) |
179- | ` createTensor(shape, dtype, requires_grad) ` | 在当前设备创建 tensor(` InfiniTrainTest ` 基类方法) |
180- | ` FillSequentialTensor(tensor, start) ` | 填充递增值,自动处理 Device tensor(先填 CPU 再 copy) |
181179| ` SKIP_CPU() ` | 跳过 CPU 实例 |
182180| ` ONLY_CPU() ` | 只在 CPU 实例运行 |
183181| ` ONLY_CUDA() ` | 只在 CUDA 实例运行 |
@@ -201,23 +199,12 @@ enum class DeviceType : int8_t {
201199
202200### 4.2 测试工具层:`test_utils.h`
203201
204- 1. 新增运行时检测函数和 `CudaDeviceTypes` 的对称版本 :
202+ 1. 新增 MACA 头文件的编译期引入(和 CUDA 对称) :
205203
206204```cpp
207- #ifdef USE_MACA
208- inline int GetMacaDeviceCount() { /* macaGetDeviceCount ... */ }
209- #else
210- inline int GetMacaDeviceCount() { return 0; }
205+ #if defined(USE_MACA)
206+ #include <maca_runtime_api.h>
211207#endif
212- inline bool HasMacaRuntime() { return GetMacaDeviceCount() > 0; }
213-
214- inline std::vector<Device::DeviceType> MacaDeviceTypes() {
215- if (HasMacaRuntime()) {
216- return {Device::DeviceType::kMACA};
217- }
218- LOG(INFO) << "No MACA runtime found, skipping MACA tests.";
219- return {};
220- }
221208```
222209
2232102 . 新增 ` ONLY_MACA() ` 宏:
@@ -227,18 +214,36 @@ inline std::vector<Device::DeviceType> MacaDeviceTypes() {
227214 do { if (GetParam() != infini_train::Device::DeviceType::kMACA) { GTEST_SKIP() << "MACA-only test"; } } while (0)
228215```
229216
217+ 如果希望有类似 `REQUIRE_MIN_DEVICES(n)` 但针对 MACA 的语义,可以按 `USE_CUDA` 分支的写法增加一个新的宏;同理 `USE_MACA` 不开时该宏直接 skip 即可。
218+
230219### 4.3 注册宏:新增 MACA 实例
231220
221+ 沿用 `USE_CUDA` 的做法,未开启编译开关时不注册对应实例:
222+
232223```cpp
224+ #if defined(USE_CUDA) && defined(USE_MACA)
233225#define INFINI_TRAIN_REGISTER_TEST(TestName) \
234226 INSTANTIATE_TEST_SUITE_P(CPU, TestName, \
235227 ::testing::Values(infini_train::Device::DeviceType::kCPU)); \
236228 INSTANTIATE_TEST_SUITE_P(CUDA, TestName, \
237- ::testing::ValuesIn (infini_train::test::CudaDeviceTypes() )); \
229+ ::testing::Values (infini_train::Device::DeviceType::kCUDA )); \
238230 INSTANTIATE_TEST_SUITE_P(MACA, TestName, \
239- ::testing::ValuesIn(infini_train::test::MacaDeviceTypes()))
231+ ::testing::Values(infini_train::Device::DeviceType::kMACA))
232+ #elif defined(USE_CUDA)
233+ #define INFINI_TRAIN_REGISTER_TEST(TestName) /* CPU + CUDA, 同现状 */
234+ #elif defined(USE_MACA)
235+ #define INFINI_TRAIN_REGISTER_TEST(TestName) \
236+ INSTANTIATE_TEST_SUITE_P(CPU, TestName, \
237+ ::testing::Values(infini_train::Device::DeviceType::kCPU)); \
238+ INSTANTIATE_TEST_SUITE_P(MACA, TestName, \
239+ ::testing::Values(infini_train::Device::DeviceType::kMACA))
240+ #else
241+ #define INFINI_TRAIN_REGISTER_TEST(TestName) /* 仅 CPU */
242+ #endif
240243```
241244
245+ 运行时如果机器上没有对应设备(例如 `USE_MACA` 编译但无 MACA 硬件),让测试直接报错而不是静默跳过。
246+
242247### 4.4 CMake 层:`test_macros.cmake`
243248
244249将默认 label 列表从 `cpu cuda` 扩展为 `cpu cuda maca`
@@ -248,7 +253,7 @@ inline std::vector<Device::DeviceType> MacaDeviceTypes() {
248253| 步骤 | 文件 | 改动 |
249254|------|------|------|
250255| 1 | `device.h` | `DeviceType` 枚举新增 `kMACA ` |
251- | 2 | `test_utils.h` | 新增 `GetMacaDeviceCount()` / `HasMacaRuntime()` / `MacaDeviceTypes()` / ` ONLY_MACA()` |
252- | 3 | `test_utils.h` | `INFINI_TRAIN_REGISTER_TEST` 新增 MACA 实例 |
256+ | 2 | `test_utils.h` | 新增 `USE_MACA` 下的 `<maca_runtime_api.h>` 引入、` ONLY_MACA()` 宏 |
257+ | 3 | `test_utils.h` | `INFINI_TRAIN_REGISTER_TEST` 按 `USE_MACA` 条件新增 MACA 实例 |
253258| 4 | `test_macros.cmake` | 将默认 label 列表扩展为 `cpu cuda maca` |
254259| 5 | `CMakeLists.txt`(根) | 新增 `USE_MACA` option + MACA SDK 查找 + kernel 编译 |
0 commit comments