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 与dpitch*height 需要分别小于 src 和 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方法的选取。
参数
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
dst |
void * |
指向存储复制内容的目标内存位置的指针 |
输入/输出 |
dpitch |
size_t |
目标内存的间距,即每存储width数据的偏移量 |
输入 |
src |
const void * |
指向要复制的源内存位置的指针 |
输入 |
spitch |
size_t |
源内存的间距,即每取出width数据的偏移量 |
输入 |
width |
size_t |
需要拷贝的内存的宽 |
输入 |
height |
size_t |
需要拷贝的内存的高 |
输入 |
返回值
- 成功:返回KUPL_OK
- 失败:返回KUPL_ERROR
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "kupl.h" int main() { int len = 65536; double *src = (double *)kupl_malloc(len); double *dest = (double *)kupl_malloc(len); 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); kupl_free(src); kupl_free(dest); return 0; } |

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