Tag: 内存带宽

如何提高memcpy的性能

概要: memcpy似乎无法在真实或testing应用程序中在我的系统上传输超过2GB /秒。 我能做些什么来获得更快的内存到内存拷贝? 全部细节: 作为数据采集应用程序的一部分(使用一些专用硬件),我需要将大约3 GB /秒的临时缓冲区拷贝到主内存中。 为了获取数据,我给硬件驱动程序提供了一系列缓冲区(每个2MB)。 硬件DMA将数据发送到每个缓冲区,然后在每个缓冲区满时通知我的程序。 我的程序清空缓冲区(memcpy到另一个较大的RAM块),并将处理后的缓冲区重新发送到卡再次填充。 我有memcpy移动数据足够快的问题。 看起来内存到内存的拷贝速度应该足够快,可以在我运行的硬件上支持3GB /秒的速度。 Lavalys EVEREST给我提供了9337MB / sec的内存复制基准testing结果,但是即使在一个简单的testing程序中,我也无法使用memcpy获得接近这些速度的任何地方。 我通过添加/删除缓冲区处理代码中的memcpy调用来隔离性能问题。 没有memcpy,我可以运行完整的数据速率 – 约3GB /秒。 在启用memcpy的情况下,我仅限于550Mb / sec(使用当前的编译器)。 为了在我的系统上对memcpy进行基准testing,我已经编写了一个单独的testing程序,在一些数据块上调用memcpy。 (我已经发布了下面的代码)我已经在我使用的编译器/ IDE(National Instruments CVI)以及Visual Studio 2010中运行了这个。虽然我目前没有使用Visual Studio,但我愿意如果能够产生必要的性能,就可以进行切换。 但是,在盲目转移之前,我想确保它能解决我的memcpy性能问题。 Visual C ++ 2010:1900 MB /秒 NI CVI 2009:550 MB /秒 虽然我并不感到奇怪CVI比Visual Studio慢很多,但是我对memcpy的性能这么低感到惊讶。 虽然我不确定这是否可以直接比较,但这比EVEREST基准带宽要低得多。 虽然我不需要相当的性能水平,但至less需要3GB /秒。 标准库的实现肯定不会比EVEREST所使用的更糟糕! 在这种情况下,我能做些什么来加快memcpy的速度? 硬件细节:AMD Magny […]