小编lee*_*ker的帖子

如何提高memcpy的性能

摘要:

memcpy似乎无法在真实或测试应用程序中在我的系统上传输超过2GB /秒.我该怎么做才能获得更快的内存到内存副本?

详细信息:

作为数据捕获应用程序的一部分(使用一些专用硬件),我需要将大约3 GB /秒的临时缓冲区复制到主内存中.为了获取数据,我为硬件驱动程序提供了一系列缓冲区(每个2MB).硬件将数据DMA数据到每个缓冲区,然后在每个缓冲区已满时通知我的程序.我的程序清空缓冲区(memcpy到另一个更大的RAM块),并将处理后的缓冲区重新发送到卡中再次填充.我遇到了memcpy足够快地移动数据的问题.似乎内存到内存的副本应该足够快,以便在我运行的硬件上支持3GB /秒.Lavalys EVEREST给了我一个9337MB /秒的内存复制基准测试结果,但即使在一个简单的测试程序中,我也无法通过memcpy获得接近这些速度的任何数据.

我通过在缓冲区处理代码中添加/删除memcpy调用来隔离性能问题.没有memcpy,我可以运行全数据速率 - 大约3GB /秒.启用memcpy后,我被限制在大约550Mb /秒(使用当前编译器).

为了在我的系统上对memcpy进行基准测试,我编写了一个单独的测试程序,它只是在某些数据块上调用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基准带宽.虽然我不需要那么高的性能水平,但至少需要3GB /秒.当然,标准库的实现不会比EVEREST使用的更糟糕!

在这种情况下,如果有的话,我可以做些什么来更快地使用memcpy?


硬件细节:AMD Magny Cours-4x八核128 GB DDR3 Windows Server 2003 Enterprise X64

测试程序:

#include <windows.h>
#include <stdio.h>

const size_t NUM_ELEMENTS = 2*1024 * 1024;
const size_t ITERATIONS = 10000;

int main (int argc, char *argv[])
{
    LARGE_INTEGER start, stop, frequency;

    QueryPerformanceFrequency(&frequency);

    unsigned short * src = …
Run Code Online (Sandbox Code Playgroud)

c cvi memcpy visual-studio memory-bandwidth

48
推荐指数
4
解决办法
4万
查看次数

如何在Python中找到列表中最短的字符串

这似乎是一个非常简单的问题,但我正在寻找一种简短而又甜蜜的方式,这仍然是可以理解的(这不是代码高尔夫).

给定一个字符串列表,找到最短字符串的最简单方法是什么?

对我来说最明显的方式大致是:

l = [...some strings...]
lens = map(l, len)
minlen, minind = min(lens)
shortest = l[minind]
Run Code Online (Sandbox Code Playgroud)

但这似乎是这个问题的很多代码(至少在python中).

python

36
推荐指数
1
解决办法
3万
查看次数

如何设置gdb的默认选项?

我每次打开GDB时都会设置几个选项,例如:

set print thread-events off
Run Code Online (Sandbox Code Playgroud)

有没有办法默认设置这些选项,也许像.gdb_rc文件?

gdb

14
推荐指数
1
解决办法
5037
查看次数

boost :: string_ref和boost :: string_view之间的区别

Boost提供了两种不同的实现string_view,它们将成为C++ 17的一部分:

  • boost::string_refutility/string_ref.hpp
  • boost::string_viewcore/string_view.hpp

这些之间有什么重大差异吗?哪个应该是首选的?

注意:我注意到在Boost 1.61中,boost :: log已经弃用了string_ref而支持string_view; 也许这是一个指标?(http://www.boost.org/users/history/version_1_61_0.html)

boost string-view

12
推荐指数
2
解决办法
5879
查看次数

CGFloat:圆形,底部,abs和32/64位精度

TLDR:如何在没有警告的情况下编译32位和64位CGFloats的方式调用标准浮点代码?


CGFloat定义为double或float,具体取决于编译器设置和平台.我正在尝试编写在两种情况下都能正常工作的代码,而不会产生很多警告.

当我使用floor,abs,ceil和其他简单浮点运算之类的函数时,我会收到关于值被截断的警告.例如:

警告:隐式转换将64位值缩短为32位值

我不关心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本(floor而不是floorf等); 但是,我必须容忍这些错误.

有没有办法干净地编写支持32位和64位浮点数的代码,而不必使用大量的#ifdef __ LP64 __,或者为所有标准浮点函数编写包装函数?

objective-c cgfloat

11
推荐指数
1
解决办法
8176
查看次数

如何在NSMenuItem的右侧添加图标

我正在尝试在菜单项旁边的菜单右侧添加一些图标,理想情况下可以正确对齐.我知道NSMenuItem允许您添加菜单项(例如,请参阅MenuMadness示例).我真的在寻找OS X Wifi菜单中的安全/信号强度指示器.

我见过的一种方法是在菜单中添加项目,并使用setView为每个项目提供NSView.然而,这似乎比它应该更复杂.有没有办法只在菜单中添加一个图标/多个图标?

cocoa objective-c nsmenuitem

9
推荐指数
1
解决办法
1567
查看次数

不赞成提升精神标题

我正在关注boost :: spirit的快速入门指南,当我包含时,我收到此编译器警告:"此标头已弃用.请使用:boost/spirit/include/classic_core.hpp"我应该担心这个吗?

(快速入门指南:http://spirit.sourceforge.net/distrib/spirit_1_8_5/libs/spirit/doc/quick_start.html,与节目我试图编译这里的全部源:HTTP://spirit.sourceforge. net/distrib/spirit_1_8_5/libs/spirit/example/fundamental/number_list.cpp)

编辑:此外,当我尝试使用推荐的classic_core.hpp和classic_push_back_actor.hpp标头编译时,我得到以下编译器错误:

test7.cpp: In function 'bool parse_numbers(const char*, __gnu_debug_def::vector<double, std::allocator<double> >&)':
test7.cpp:18: error: 'real_p' was not declared in this scope
test7.cpp:18: error: 'push_back_a' was not declared in this scope
test7.cpp:23: error: 'space_p' was not declared in this scope
test7.cpp:23: error: 'parse' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit

6
推荐指数
1
解决办法
2909
查看次数

Mac App Store收据验证,用于测试:我从未收到收据

我一直在使用Apple的代码和互联网上的一些指南进行收据验证.此时,我已设法签署代码,并开始验证以验证收据.此时,如果您不熟悉Apple文档的这一部分,将会很有帮助:

验证App Store收据#在开发过程中验证

当我在XCode中启动应用程序时,应用程序按预期退出代码173(没有要验证的收据).当我在XCode之外启动应用程序(双击查找程序)时,应用程序启动一瞬间,关闭,并弹出登录对话框(如预期的那样).我在iTunes Connect中创建了一个测试帐户,并使用此帐户登录.点击登录按钮后,进度指示器会旋转几秒钟,然后登录框消失.据我所知,此后没有任何事情发生.据我所知,App Store应该自动生成/拉取收据并在此时启动应用程序,但事实并非如此.

我试着更好地观察应用程序启动过程.我在收据检查过程的每个点都放了一些printf,但我无法弄清楚这些打印的位置.(使用'open'在终端中启动应用程序根本不显示任何输出.)我尝试使用NSRunAlertPanel生成对话框,但我认为当收据检查发生时,应用程序的加载不够他们适当地来.

在这一点上,我不确定如何进一步调试问题,因为无法真正观察到正在发生的事情.

mac-app-store receipt

6
推荐指数
1
解决办法
2993
查看次数

XCode Instruments:命名线程

对于分析多线程应用程序,为每个线程设置一个名称对我来说非常有用.

初始谷歌搜索会显示pthread_setname_np()(请参阅此处),但在使用时,它似乎不会出现在Instruments中.

有没有办法从C应用程序执行此操作?

pthreads xcode-instruments

6
推荐指数
0
解决办法
784
查看次数

每次运行时,XCode都会编译整个项目

在我开始的一个新项目中,XCode决定每次运行它时都会编译项目中的每个文件,而不仅仅是编译更改的文件(以及依赖于这些文件的文件).随着项目中越来越多的文件越来越多,这在时间和电池寿命方面都会变得越来越大.

我可能在某个地方更改了影响此设置的设置; 或者可能不是.我应该关注哪些项目设置?

xcode4

5
推荐指数
2
解决办法
2959
查看次数