昇腾社区首页
中文
注册
开发者
下载

内存管理

功能介绍

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

接口名称

功能

RegisterMem

注册内存。需要在建链前由Client和Server分别调用。

DeregisterMem

解注册内存。需要在断链后由Client和Server分别调用。

TransferSync

从远端地址读取内存到本地,或者将本地内存推送到远端地址对应的内存上。

使用场景

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

功能示例

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

  1. Client侧和Server侧根据建链章节的示例完成AdxlEngine的初始化。
  2. Client侧和Server侧为每个请求申请对应大小的内存并注册,若失败,则需要释放对应的资源。该操作需要在建链前进行。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    void OnError(AdxlEngine &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;
    }
    
  1. 内存传输,有两种方式
    • 在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 = adxlEngine.TransferSync(remoteEngine, 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 = adxlEngine.TransferSync(remoteEngine, WRITE, {desc});
      if (ret != SUCCESS) {
          printf("[ERROR] TransferSync write failed, ret = %u\n", ret);
          return -1;
      }
      
  2. 业务退出时,P侧和D侧根据断链章节的示例进行断链和调用finalize接口释放资源。

异常处理

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

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