---
title: 内存管理
description: "内存管理涉及的主要接口及功能如下："
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/hixlug/llmcdv2_42_29.html
sourcePath: /source/zh/canncommercial/900/API/hixlug/llmcdv2_42_29.html
indexId: efb12c14bf232137d5579f6f4a1bba994388ef78b744ee7dc805232a1d9e204959
---
# 内存管理

#### 功能介绍

内存管理涉及的主要接口及功能如下：

| 接口名称 | 功能 |
| --- | --- |
| RegisterMem | 注册内存。需要在建链前由Client和Server分别调用。 |
| DeregisterMem | 解注册内存。需要在断链后由Client和Server分别调用。 |
| TransferSync | 从远端地址读取内存到本地，或者将本地内存推送到远端地址对应的内存上。 |


#### 使用场景

主要用于分布式集群间的内存传输。


#### 功能示例

本示例介绍传输接口的使用，主要涉及内存的注册、注销、传输。如下将根据业务角色给出伪代码示例。

1. Client侧和Server侧根据  建链
章节的示例完成HIXL的初始化。
2. Client侧和Server侧为每个请求申请对应大小的内存并注册，若失败，则需要释放对应的资源。该操作需要在建链前进行。
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void OnError(Hixl &engine, const std::vector<MemHandle> &handles) { for (auto handle : handles) { (void) engine.DeregisterMem(handle); } engine.Finalize(); } MemDesc desc{}; desc.addr = reinterpret_cast<uintptr_t>(addr); desc.len = len; MemHandle handle = nullptr; auto ret = engine.RegisterMem(desc, MEM_HOST, handle); if (ret != SUCCESS) { printf("[ERROR] RegisterMem failed, ret = %u\n", ret); return -1; }


3. 内存传输，包含两种方式
  在Atlas A3 训练系列产品 / Atlas A3 推理系列产品
  需要使用HCCS进行D2RH、RH2D传输的场景。可以通过开启OPTION_ENABLE_USE_FABRIC_MEM配置选项来获得最佳的传输性能。
  - 在Client侧调用TransferSync接口，设置operation参数为READ，即从远端地址读取内存到本地，其中，本地地址和远端地址需在建链前分别在本地和远端完成注册。
    1 2 3 4 5 6 TransferOpDesc desc{reinterpret_cast<uintptr_t>(&local), reinterpret_cast<uintptr_t>(remote), size}; auto ret = engine.TransferSync(remote_engine, READ, {desc}); if (ret != SUCCESS) { printf("[ERROR] TransferSync read failed, ret = %u\n", ret); return -1; }


  - 在Client侧调用TransferSync接口，设置operation参数为WRITE，即将本地地址对应内存推送到远端，其中，本地地址和远端地址需在建链前分别在本地和远端完成注册。
    1 2 3 4 5 6 TransferOpDesc desc{reinterpret_cast<uintptr_t>(local), reinterpret_cast<uintptr_t>(remote), size}; auto ret = engine.TransferSync(remote_engine, WRITE, {desc}); if (ret != SUCCESS) { printf("[ERROR] TransferSync write failed, ret = %u\n", ret); return -1; }


4. 业务退出时，P侧和D侧根据  断链
章节的示例进行断链和调用finalize接口释放资源。


#### 异常处理

- 错误码TIMEOUT表示传输超时，说明链路出现问题，需要重新断链，再尝试建链。
- 错误码NOT_CONNECTED表示与远端没有建链。

更多异常处理请参考HIXL错误码。
