---
title: kupl_memcpy_async
description: "异步内存拷贝，异步地将src位置的内存拷贝到dst位置。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_076.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_076.html
indexId: 484b8584e9bb70905c32b69d724240714b65f97da465339f7a8e898fdade70c067
---
# kupl_memcpy_async

异步内存拷贝，异步地将src位置的内存拷贝到dst位置。

#### 接口定义

int kupl_memcpy_async(void *dst, const void *src, size_t count, kupl_queue_h queue, kupl_event_h event);


- 当前kupl memcpy_async支持的最大拷贝长度为UINT32_MAX，即count值不超过UINT32_MAX。
- count 需要小于 src 和 dst 所指向内存的真实大小。


#### 环境变量

KUPL通过环境变量KUPL_MEMCPY_MT_THRESHOLD与KUPL_SDMA_MEMCPY_THRESHOLD来确认多线程memcpy能力的包大小阈值以及sdma memcpy能力的包大小阈值。多线程memcpy阈值默认为512KB，sdma memcpy阈值默认为2MB。

kupl异步memcpy共实现3种memcpy方法：单线程glibc memcpy方法、sdma memcpy方法及多线程memcpy方法；当环境中使能sdma时，默认选取sdma memcpy方法；当环境中没有sdma时，通过KUPL_MEMCPY_MT_THRESHOLD阈值选取memcpy方法，即拷贝的数据包长小于阈值时，进行glibc memcpy，否则进行多线程memcpy。

用户可以通过配置KUPL_MEMCPY_MT_THRESHOLD来设置多线程memcpy的阈值；kupl_memcpy2d_async接口也采用上述环境变量配置方式控制memcpy方法的选取。


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| dst | void \* | 指向存储复制内容的目标内存位置的指针 | 输入/输出 |
| src | const void \* | 指向要复制的源内存位置的指针 | 输入 |
| count | size\_t | 需要复制的内存大小 | 输入 |
| queue | kupl\_queue\_h | 需要将memcpy任务提交到的队列 | 输入 |
| event | kupl\_event\_h | 传递event任务的参数，用于后续同步 | 输入/输出 |


#### 返回值

- 成功：返回KUPL_OK
- 失败：返回KUPL_ERROR


#### 示例

```
#include <stdio.h> 
#include <stdlib.h>
#include <assert.h>
#include "kupl.h" 

int main() 
{ 
    int len = 1024; 
    char *src = (char *)kupl_malloc(KUPL_MEM_DEFAULT, len);
    char *dest = (char *)kupl_malloc(KUPL_MEM_DEFAULT, len);
    if (src == nullptr || dest == nullptr) {
        goto malloc_error;
    }
    for (int i = 0; i < len / sizeof(char); i++) {
        src[i] = i ;
        dest[i] = 0;
    }
    kupl_queue_h queue = kupl_queue_create();
    kupl_event_h event = kupl_event_create();
    if (queue == nullptr || event == nullptr) {
        goto queue_event_error;
    }
    int ret = kupl_memcpy_async(dest, src, len, queue, event);
    assert(ret == KUPL_OK);
    kupl_event_wait(event);
queue_event_error:
    kupl_event_destroy(event);
    kupl_queue_destroy(queue);
malloc_error:
    kupl_free(KUPL_MEM_DEFAULT, src);
    kupl_free(KUPL_MEM_DEFAULT, dest); 
    return 0; 
}
```


- 上述示例演示了异步内存拷贝的流程。
- 上述kupl_memcpy_async函数将src数组中的内容异步地复制到dest数组，其中复制的内存大小为len，其中event用于异步拷贝、后续的同步。
- 由于实际上只有sdma memcpy实现了真正的异步memcpy，因此在执行其余memcpy方法时，将打印warning信息。
