cwenzi/neuroflow-cpp
1
1/**2 * NeuroFlow 内存泄漏检测测试3 * 4 * 使用简单的方法检测内存泄漏:5 * 1. 运行大量迭代测试6 * 2. 检查内存使用变化7 * 3. 验证对象生命周期8 */9 10#include <iostream>11#include <chrono>12#include <vector>13#include "../include/neuroflow/model.hpp"14#include "../include/neuroflow/memory.hpp"15 16using namespace neuroflow;17 18// 内存统计19size_t get_current_memory_mb() {20 // 使用简单方法估算21 FILE* f = fopen("/proc/self/status", "r");22 if (!f) return 0;23 24 char line[256];25 size_t vmrss = 0;26 while (fgets(line, 256, f)) {27 if (strncmp(line, "VmRSS:", 6) == 0) {28 sscanf(line + 6, "%zu", &vmrss);29 break;30 }31 }32 fclose(f);33 return vmrss; // KB34}35 36void test_tensor_memory_leak() {37 std::cout << "\n=== Tensor Memory Leak Test ===\n";38 39 size_t mem_before = get_current_memory_mb();40 41 // 创建和销毁大量Tensor42 for (int i = 0; i < 10000; ++i) {43 Tensor t({256, 512}, QuantType::FP32);44 Tensor t2 = t.clone();45 Tensor t3 = t.reshape({128, 1024});46 }47 48 size_t mem_after = get_current_memory_mb();49 50 ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);51 52 std::cout << " Memory before: " << mem_before << " KB\n";53 std::cout << " Memory after: " << mem_after << " KB\n";54 std::cout << " Memory change: " << mem_change << " KB\n";55 56 // 内存变化应该很小(< 1MB),因为对象都被正确释放57 if (mem_after - mem_before < 1024) {58 std::cout << " [PASS] No significant memory leak detected\n";59 } else {60 std::cout << " [WARN] Possible memory leak\n";61 }62}63 64void test_model_memory_leak() {65 std::cout << "\n=== Model Memory Leak Test ===\n";66 67 size_t mem_before = get_current_memory_mb();68 69 // 创建和销毁大量模型70 for (int i = 0; i < 100; ++i) {71 NeuroFlowModel::Config cfg;72 cfg.input_dim = 128;73 cfg.hidden_dim = 64;74 cfg.output_dim = 5;75 76 NeuroFlowModel model(cfg);77 78 // 执行forward79 Tensor input({2, 128});80 auto output = model.forward(input);81 82 // 执行manifold trajectory83 auto trajectory = model.get_manifold_trajectory(input, 5);84 }85 86 size_t mem_after = get_current_memory_mb();87 88 ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);89 90 std::cout << " Memory before: " << mem_before << " KB\n";91 std::cout << " Memory after: " << mem_after << " KB\n";92 std::cout << " Memory change: " << mem_change << " KB\n";93 94 if (mem_after - mem_before < 2048) {95 std::cout << " [PASS] No significant memory leak detected\n";96 } else {97 std::cout << " [WARN] Possible memory leak\n";98 }99}100 101void test_mla_cache_memory() {102 std::cout << "\n=== MLA Cache Memory Test ===\n";103 104 size_t mem_before = get_current_memory_mb();105 106 // 测试MLA cache107 LatentKVCache mla(64, 4, 16, 128);108 109 for (int i = 0; i < 1000; ++i) {110 Tensor input({1, 64});111 float* data = input.as_fp32();112 for (size_t j = 0; j < 64; ++j) data[j] = 0.1f * j;113 114 mla.forward(input, true);115 116 if (i % 100 == 0) {117 mla.clear_cache();118 }119 }120 121 size_t mem_after = get_current_memory_mb();122 123 ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);124 125 std::cout << " Memory before: " << mem_before << " KB\n";126 std::cout << " Memory after: " << mem_after << " KB\n";127 std::cout << " Memory change: " << mem_change << " KB\n";128 129 if (mem_after - mem_before < 512) {130 std::cout << " [PASS] MLA cache memory management OK\n";131 } else {132 std::cout << " [WARN] MLA cache may have memory issues\n";133 }134}135 136void test_memory_consolidation() {137 std::cout << "\n=== Memory Consolidation Test ===\n";138 139 size_t mem_before = get_current_memory_mb();140 141 MemoryConsolidationModule memory(64, 16, 32);142 143 for (int i = 0; i < 1000; ++i) {144 Tensor input({1, 64});145 memory.consolidate(input);146 147 auto result = memory.retrieve(input);148 }149 150 size_t mem_after = get_current_memory_mb();151 152 ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);153 154 std::cout << " Memory before: " << mem_before << " KB\n";155 std::cout << " Memory after: " << mem_after << " KB\n";156 std::cout << " Memory change: " << mem_change << " KB\n";157 158 if (mem_after - mem_before < 256) {159 std::cout << " [PASS] Memory consolidation OK\n";160 } else {161 std::cout << " [WARN] Memory consolidation may leak\n";162 }163}164 165void test_shared_ptr_cycle() {166 std::cout << "\n=== Shared Pointer Cycle Test ===\n";167 168 size_t mem_before = get_current_memory_mb();169 170 // 测试shared_ptr是否有循环引用171 for (int i = 0; i < 1000; ++i) {172 NeuroFlowModel::Config cfg;173 NeuroFlowModel model(cfg);174 175 // 内部的shared_ptr应该正确管理176 auto stats = model.get_stats();177 }178 179 size_t mem_after = get_current_memory_mb();180 181 ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);182 183 std::cout << " Memory before: " << mem_before << " KB\n";184 std::cout << " Memory after: " << mem_after << " KB\n";185 std::cout << " Memory change: " << mem_change << " KB\n";186 187 if (std::abs(mem_change) < 512) {188 std::cout << " [PASS] No shared_ptr cycle detected\n";189 } else if (mem_change > 0) {190 std::cout << " [WARN] Possible shared_ptr cycle\n";191 } else {192 std::cout << " [PASS] Memory properly released\n";193 }194}195 196int main() {197 std::cout << "========================================\n";198 std::cout << "NeuroFlow Memory Leak Detection Tests\n";199 std::cout << "========================================\n";200 201 test_tensor_memory_leak();202 test_model_memory_leak();203 test_mla_cache_memory();204 test_memory_consolidation();205 test_shared_ptr_cycle();206 207 std::cout << "\n========================================\n";208 std::cout << "Memory Leak Tests Complete!\n";209 std::cout << "========================================\n";210 211 return 0;212}