- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 for 循环中有一个简单的数组操作,它针对不同大小(从 16 到非常大)的数组完成,其中包含 double 。我做了几次:
for(int i = 1; i < n-1; i++){
target[i] = (source[i-1]+source[i]+source[i+1])*0.5;
}
我用“-O3 -march=native”编译了它并测量了速度。然后,出于与此处无关的原因,我尝试添加“-rdynamic”以显着加快速度,正如您在图中看到的那样。图例中的“cmake”指的是“-rdynamic”的添加。这仅适用于 i7-4790 CPU。我根本无法在 AMD Phenom II X6 1045T 上重现它。
我当然不明白为什么 -rdynamic 会产生那么大的加速。 (GLOPS = #updates of the array cells per second in billions)。为什么我会获得加速?为什么不在 AMD CPU 上?
请注意,这些测量值是两种情况下各十次测量值的平均值。
另一个有趣的观察是,至少在开始时,当数组适合 L1 缓存时,我有这些性能下降。有趣的是,当我的数组大小是 2 的幂时,就会发生这种情况。我猜这与 L2 缓存有关,但我完全不知道是什么以及为什么。也许有些缓存冲突或对齐?
编辑:我现在已经正确地绘制了: g++ -O3 -march=本地程序.cpp -rdynamic标记为“cmake”的曲线与添加“-rdynamic”相同。
编辑 2:完全从问题中删除了 cmake 叙述。[Peter]
最佳答案
我不知道为什么 rdynamic 会导致加速。但是关于你的第二个问题,请查看 Agner Fog 的指南“在 C++ 中优化软件”http://www.agner.org/optimize/optimizing_cpp.pdf .看看第 9.2 节,他谈到了临界步幅。可能适用于这种情况。
关于c++ - 为什么大小为 2 的幂的数组速度较慢?为什么我会获得 -rdynamic 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26693982/
为什么 -rdynamic 不导出 .a 文件中的符号,而是导出 .o 文件中的符号? 我在 .so 文件中有一个应用程序和一个插件。主应用程序使用一系列目标文件和一个静态库进行链接,如下所示: CX
场景: 可执行文件在运行时通过 dlopen 加载共享对象。 共享对象引用了一些实际编译到主可执行文件中的符号(函数)。 如果我在链接可执行文件时将 -rdynamic 添加到 gcc,则效果很好。
我如何使用 -rdynamic 标志来确保 glibc 的回溯函数将报告回溯中的实际函数/符号名称? 我正在尝试使用 C's backtrace functions创建回溯。在我的 MacOS 机器上
-rdynamic(或链接器级别的--export-dynamic)究竟做了什么,它与 定义的符号可见性有何关系-fvisibility* 标志或可见性 pragma 和 __attribute__s
我正在用 C 语言构建一个共享库,该库由我没有源代码访问权限的程序动态加载。目标平台是 64 位 Linux 平台,我们使用 gcc 来构建。我能够在大约 100 行内构建该问题的重现,但它仍然有点难
在嵌入式设备(ARM、uClibc)上工作,我有一个静态可执行文件,它与不同的库静态链接,并具有使用 dlopen 的动态加载功能。 set(EXTERNAL_LIBS "-lpthread -lpc
我一直在一个大型 C++ 项目中工作,该项目有一个巨大的源代码,大小接近 300 MB,文件超过 800 个。我想在二进制崩溃时获取调用堆栈,所以我捕获了信号并将调用堆栈从 backtrace_sym
我正在开发一个 Android NDK 项目。当我尝试修改项目文件(Android.mk)时,我在阅读引用资料后发现了链接选项 -rdynamic,但我仍然不确定该标志的含义。 我正在从事的项目。它有
我有一个跨平台项目,需要在 gcc ( about -rdynamic ) 中使用 -rdynamic 编译 .so 文件。 MSVC 是否存在这样的选项? 最佳答案 不需要该标志,因为 Window
我正在编译 C++ 代码,我试图添加 -rdynamic 选项,这样我就可以打印出一个有意义的堆栈跟踪来调试我的 C++ 程序,但是 clang 返回一条警告,说“编译期间未使用的参数:” -rdyn
我找不到任何类似的选项可以将所有函数名称包含到最终发布的二进制文件中。还是 clang 默认执行此操作? 最佳答案 这道题的正确答案是-Wl,-export_dynamic 而不是 -Wl,--exp
查看this question和 this question我可以看到要使 backtrace_symbols() 正常工作,必须使用 -rdynamic 标志进行编译。 我已经在测试程序中尝试过它并
所以我想用 backtrace logging 分发我的 gcc 应用程序对于严重错误。然而,它是对性能非常关键的应用程序,所以我想知道 -g -rdynamic gcc 标志是否会减慢执行速度(特别
我遇到 gcc 编译错误: gcc-4.9: error: unrecognized command line option '-rdynamic' 并且我在某些环境中使用 -rdynamic 测试了
如果我想与 pthread 链接,我可以 -lpthread,对吗? 阅读手册后,我仍然不明白使用 -rdynamic 的原因.. 最佳答案 -pthread 是-D_REENTRANT -lpthr
这是一个非常直接的问题。之间是否有任何区别: -Xlinker --export-dynamic 和 -rdynamic 什么时候传递给 g++?阅读 GNU 文档似乎它们在功能上是相同的,但我想确定
我在 Windows 7 64 位的 Cygwin 下使用 GCC v4.9.2,但在尝试编译时遇到问题 uWSGI . 我收到的错误是 - gcc: error: unrecognized comm
我在 Solaris 10 上使用 gcc 构建 make 程序,并得到以下信息: gcc: unrecognized option `-rdynamic' 检查 rdynamic 后在 gcc 文档
我在 for 循环中有一个简单的数组操作,它针对不同大小(从 16 到非常大)的数组完成,其中包含 double 。我做了几次: for(int i = 1; i < n-1; i++){ t
我在 Windows 7 64 位的 Cygwin 下使用 GCC v4.9.2,但在尝试编译时遇到问题 uWSGI . 我收到的错误是 - gcc: error: unrecognized comm
我是一名优秀的程序员,十分优秀!