C/C++ 中是不是有类似极其优化的 memcpy2d 的东西?
Posted
技术标签:
【中文标题】C/C++ 中是不是有类似极其优化的 memcpy2d 的东西?【英文标题】:Is there something like extremely optimized memcpy2d in C/C++?C/C++ 中是否有类似极其优化的 memcpy2d 的东西? 【发布时间】:2014-02-27 02:40:44 【问题描述】:我正在寻找可以使用 SSD/MMX/3DNow/SIMD(随便)以极快的速度将 2D 阵列复制到另一个(更大)2D 阵列的东西。我不想自己实现,只是寻找一个高度优化的支持和维护的解决方案。我在 Linux 上使用 Clang(++)。
memcyp2Di(int *src, int *dest, int srcw, int srch, int destw, int desth, int destx, int desty)
【问题讨论】:
您应该能够循环执行memcpy
并获得可接受的性能。
std::copy
en.cppreference.com/w/cpp/algorithm/copy
我认为正确的方法是使用 linux 直接渲染基础设施中可用的 blitting 功能。他们将使用一些快速实现,可能会卸载到图形卡或某些 DMA 引擎。如果由于 NVIDIA 专有驱动程序缺乏支持而无法使用 DRI,则使用 cairo 表面或 OpenGL 将是一种独立于硬件(甚至是跨平台)的解决方案。我没有这方面的经验,所以我不能直接回答,但我希望这会有所帮助。
@hdante,将数据发送到您的视频板很慢,将其发送回您的主内存更慢。在这种情况下,这不会给你带来任何好处。
【参考方案1】:
看看 Agner Fog 的 Asmlib,它提供了一个极其优化的 memcpy 版本和其他用汇编编写的常用 libc 函数,并使用 CPU 中可用的最佳 SIMD 指令集,从基本的 SSE 一直到例如,在 Haswell 处理器中发现的最新 AVX2 和 FMA3 指令。
【讨论】:
他还做了一个表格比较例如memcpy 用于不同的编译器和操作系统。来自 glib 的 GCC 的 memcpy 很慢。内在的 memcpy 更糟糕。我不知道它是否有所改善。 ***.com/questions/855895/intrinsic-memcmp/… @Zboson 你是指第 4 页中的表格here 吗?它清楚地表明 asmlib 击败了所有人;不过,比较中使用的编译器和库确实有点过时了。 @asamarin,是的,我同意你的看法。我所说的内在 memcpy 是指 GCC 中内置的内在 memcpy,它甚至比 glib 中的更糟糕。 @Zboson 哦,对不起!我以为您的意思是 this 内在函数(即围绕汇编指令和数据类型的 C/C++ 包装器)。令人困惑的名字,哈哈:D【参考方案2】:有Intel IPP library。它用于在大型矩阵上进行数学计算等事情,但我很确定也有复制功能。该库会根据您的处理器进行自我初始化以利用每个函数的最快版本,并且它们会保持最新版本,因此当新处理器问世时,它们最终会使用新指令实现这些函数,以使事情变得更快。
【讨论】:
以上是关于C/C++ 中是不是有类似极其优化的 memcpy2d 的东西?的主要内容,如果未能解决你的问题,请参考以下文章
[C/C++笔面试]自己实现memcpy,小结strcpy与memcpy区别
[C/C++]详解STL容器2--vector的功能和模拟实现(迭代器失效,memcpy拷贝问题)