---
title: 函数：malloc_host
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/runtimeapi/aclpythondevg_01_0116.html
sourcePath: /source/zh/canncommercial/900/API/runtimeapi/aclpythondevg_01_0116.html
indexId: c124ea52c281260c5a75c859fbd0e2cccba14e1e45d73a632a7975cb4e8c447671
---
# 函数：malloc_host

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |
| Atlas 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | √ |


#### 功能说明

应用程序在Host上运行时，调用该接口申请的是Host内存（该内存是锁页内存），由系统保证内存首地址64字节对齐。

针对以下产品形态，调用该接口申请的是Device内存，且Device上的内存按普通页申请，如需首地址64字节对齐，需要用户自行处理对齐。

- Ascend RC形态


#### 函数原型

- C函数原型
  1 aclError aclrtMallocHost(void **hostPtr, size_t size)

- python函数
  1 host_ptr, ret= acl.rt.malloc_host(size)


#### 参数说明

| 参数名 | 说明 |
| --- | --- |
| size | int，申请内存的大小，单位Byte。size不能为0。 |


#### 返回值说明

| 返回值 | 说明 |
| --- | --- |
| host\_ptr | int，指向Host上已分配内存的指针地址。 |
| ret | int，错误码，返回0表示成功，返回其它值表示失败。 |


#### 约束说明

- 本接口分配的内存不会对内容进行初始化，建议在使用内存前先调用  acl.rt.memset
接口先初始化内存，清除内存中的随机数。
- 本接口内部不会进行隐式的Device同步或流同步。如果申请内存成功或申请内存失败会立刻返回结果。
- 使用acl.rt.malloc_host接口申请的内存，需要通过  acl.rt.free_host
接口释放内存。
- 使用acl.rt.malloc_host接口分配过多的锁页内存，将导致操作系统用于分页的物理内存变少，从而降低系统整体的性能。
- 频繁调用acl.rt.malloc_host接口申请内存、调用  acl.rt.free_host
接口释放内存，会损耗性能，建议用户提前做内存预先分配或二次管理，避免频繁申请/释放内存。
- 针对Ascend RC形态、Control CPU开放形态，Host与Device是合一的，所以申请Host内存也等同于申请Device内存。此外，申请内存时，按普通页申请。如果需要64字节对齐的首地址，用户需自行处理对齐问题。
- 针对Ascend RC形态和Control CPU开放形态，若用户使用本接口申请大块内存并自行划分、管理内存时，每段内存需同时满足以下需求，其中，len表示某段内存的大小，ALIGN_UP[len,k]表示向上按k字节对齐：((len-1)/k+1)*k：

  - 内存大小向上对齐成32整数倍加32字节（m = ALIGN_UP[len, 32] + 32字节）。
  - 内存起始地址需满足64字节对齐（ALIGN_UP[m, 64]）。
