【问题标题】:R call to C code faster than c++ function call to C code? [closed]R 对 C 代码的调用比对 C 代码的 C++ 函数调用更快? [关闭]
【发布时间】:2015-11-24 16:50:29
【问题描述】:

对于我的项目,我有一个 R 程序,它多次调用 C 函数,使用 #include <R.h>#include <Rdefines.h> 实现。由于我想尽可能地加快整个算法的速度,所以我直接用 C++ 编写了 R 程序,这样就去掉了 C 和 R 之间的翻译层。 我从 C++ 中调用了以前编码的 C 函数,作为常规函数。我能够进行翻译并获得相同的输出。

查看运行时,我发现 R 的执行速度比 C++ 的快(2m 10 sec vs 2m 50 sec)。为了找出“问题”在哪里,我使用了两个分析器:gprof 和 Valgrind,它们都报告了 C 外部函数 99% 的运行时使用情况。这让我无法解释 30% 的运行时间差异,而 99% 的时间都花在执行相同的 C 代码上。对于 C++ 和 C 的集成,我尝试了 lo 链接 C 目标文件,并链接 C 的所有 .o 创建单个库 (libExternal.a)。您有什么建议可能是造成这种差异的原因吗?

我附上了 valgrind 报告的一部分。外部C函数有下划线。

谢谢!

这里是 C++ 程序上 perf stat -d 的结果: 这里是 R 程序上 perf stat -d 的结果:

我想提醒你,99% 的时间都花在了 C 函数上,这对两者来说都是一样的。在 C++ 代码中,我只是在传递给函数之前创建对象,因此数据应该在内存中并排。谢谢你的帮助

【问题讨论】:

  • 请包含您的代码。
  • 或包含 一些 代码,这些代码也会显示问题。甚至反例代码。这样做甚至可能足以让您自己找出问题...
  • 我无法添加代码,因为它太长而且没有帮助。我可以说解释算法的作用是我正在迭代输入中的数据矩阵,并根据索引创建一些数组来包含一些结果,然后将数组和数据矩阵传递给 c函数,它评估对它们的一些度量,返回一个数组。 R 做同样的事情,但传递的对象是 R 对象,由 c 代码转换为 c 数组。

标签: c++ c r performance


【解决方案1】:

显然,内存布局/内存访问在这里可能起决定性作用。基本上,如果 CPU 将 99% 的时间花在函数 X() 上,这并不意味着它真的在做任何事情。很可能 CPU 正在等待数据传送,而一种实现的等待时间少于(或多于)另一种。

我建议检查使用perf 套件、缓存命中和未命中等。

链接:http://www.bnikolic.co.uk/blog/hpc-prof-events.html

【讨论】:

  • CPU 没有在函数内部等待数据。 C++ 正在传递一个矩阵和一些数组作为指针,这些被函数使用。没错,它可能是缓存/内存问题,但我无法理解,因为数组是在传递时创建的,它们在内存中的位置应该是一个靠近另一个。
  • CPU is not waiting data inside the function - 嗯,CPU 几乎总是在等待数据,这就是现代野兽的本性,这就是为什么我们有多级缓存和访问时间层次结构的原因。唯一的问题是他们要等多久。你试过perf stat吗?
  • 我在这两种情况下都添加了 perf stat -d 结果。感谢您的帮助
  • 然而,多次调用 stat 给出了完全不同的结果
  • @Nadir 非常有趣!因此,在第一种情况下,它实际上是一个更好更快的代码,具有更多 IPC 的代码 - 2.36 指令/周期与 2.01 指令/周期。但!在第一种情况下,只有更多的指令要执行——~1320 trln vs ~860 trln。这就是它变慢的原因。我敢冒险这是由于不同的优化级别, -O1 与 -O3 ?无内联与激进内联?
猜你喜欢
  • 2012-09-05
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2015-06-12
  • 2018-02-10
  • 1970-01-01
相关资源
最近更新 更多