---
title: kupl_memcpy2d
description: "二维内存拷贝，将src位置的二维内存拷贝到dst位置，具体行为示例如下图所示："
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_075.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_075.html
indexId: afcc0b3ab85dbccdb2267f64bc008d94044854614768b530b84b1c22cad5a7d067
---
# kupl_memcpy2d

二维内存拷贝，将src位置的二维内存拷贝到dst位置，具体行为示例如下图所示：


#### 接口定义

int kupl_memcpy2d(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height);

- 当前kupl memcpy2d支持的最大宽、高、搬运间隔均不超过UINT32_MAX，即width、spitch-width、dpitch-width、height上限为UINT32_MAX。
- 需分别满足spitch*height小于 src 所指向内存的真实大小，且dpitch*height 小于 dst 所指向内存的真实大小。


#### 环境变量


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

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

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


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| dst | void \* | 指向存储复制内容的目标内存位置的指针 | 输入/输出 |
| dpitch | size\_t | 目标内存的间距，即每存储width数据的偏移量 | 输入 |
| src | const void \* | 指向要复制的源内存位置的指针 | 输入 |
| spitch | size\_t | 源内存的间距，即每取出width数据的偏移量 | 输入 |
| width | size\_t | 需要拷贝的内存的宽 | 输入 |
| height | size\_t | 需要拷贝的内存的高 | 输入 |


#### 返回值

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


#### 示例

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

int main() 
{ 
    int len = 65536; 
    double *src = (double *)kupl_malloc(KUPL_MEM_DEFAULT, len);
    double *dest = (double *)kupl_malloc(KUPL_MEM_DEFAULT, len);
    if (src == nullptr || dest == nullptr) {
        goto error;
    }
    for (int i = 0; i < len / sizeof(double); i++) {
        src[i] = i ;
        dest[i] = 0;
    }
    int height = 2, width = 200;
    int spitch = 300, dpitch = 400;
    int ret = kupl_memcpy2d(dest, dpitch, src, spitch, width, height);
    assert(ret == KUPL_OK);
error:
    kupl_free(KUPL_MEM_DEFAULT, src);
    kupl_free(KUPL_MEM_DEFAULT, dest); 
    return 0; 
}
```

- 上述示例演示了二维内存拷贝的流程。
- 上述kupl_memcpy2d函数将src数组中的内容复制到dest数组，其中src位置的数据每取出width数据的偏移量为300。
- dest位置的数据每存储width数据的偏移量为400。
- 拷贝数据的宽和高分别为200和2。
