3

我正在编写一个很大程度上依赖于复杂的加法和乘法的程序。我想知道是否应该使用gsl_complexstd::complex

我似乎没有在网上找到 GSL 复数算法与std::complex. 一个基本的谷歌搜索也没有帮助我找到 GSL 复合体的基准页面。

我编写了一个 20 行的程序,它生成两个随机复数数组(其中 1e7 个),然后使用clock()from检查加法和乘法需要多长时间<ctime>。使用这种方法(没有编译器优化)我了解了这一点gsl_complex_add,并且几乎分别是's和's 的gsl_complex_mul两倍。但是我以前从来没有做过这种事情,所以这就是你检查哪个更快的方式吗?std::complex<double>+*

任何链接或建议都会有所帮助。谢谢!

编辑:

好的,所以我再次尝试使用 -O3 标志,现在结果非常不同!std::complex<float>::operator+是 的两倍多gsl_complex_add,而 gsl_complex_mul是 的 1.25 倍std::complex<float>::operator*。如果我使用 double,gsl_complex_add则比 . 快约 30%,std::complex<double>::operator+std::complex<double>::operator*gsl_complex_mul. 我只需要浮点级精度,但我听说double 更快(而且内存对我来说不是问题)!所以现在我真的很困惑!

4

2 回答 2

4

打开优化。

您链接的任何库或函数集都将通过优化编译(除非开发人员的名字是Kermit、Swedish Chef、Miss Peggy(项目经理)和 Cookie Monster(测试员)——换句话说,开发团队是一堆布偶)。

由于std::complex使用模板,它是由您提供的编译器设置编译的,因此代码将未优化。所以你的问题真的是“为什么函数 X 比做同样事情的函数 Y 快,当函数 X 是用优化编译的而 Y 是在没有优化的情况下编译的?” - 这应该很明显回答:“优化几乎一直有效!” (如果大多数时候优化都不起作用,编译器开发人员会更轻松)

编辑:所以我的上述观点刚刚被证明。请注意,由于模板可以内联代码,它通常比外部库更有效(因为编译器可以直接将指令插入流中,而不是调用另一个函数)。

至于floatvs. double,唯一比只有硬件可用时float慢的时间,在和之间添加了“缩短”和“延长”两个功能。我不知道有任何这样的硬件。有更多的位,所以应该需要更长的时间。doubledoublefloatdoubledouble

编辑2:

在选择“一种解决方案而不是另一种解决方案”时,有很多因素。性能是其中之一(在某些情况下是最重要的,在其他情况下不是)。其他方面是“易用性”、“可用性”、“适合项目”等。

如果您只看性能,您有时可以运行简单的基准测试来确定一种解决方案比另一种解决方案更好或更差,但对于复杂的库 [不是“实数和虚数”类型的复数,而是“复杂”],有时会有优化处理大量数据,如果您使用不太复杂的解决方案,“大数据”将无法达到相同的性能,因为在解决“大数据”类型问题上花费的精力更少。因此,如果您有一个“简单”的基准测试,它对一小组数据进行一些基本计算,而实际上您要运行一些更大的数据集,那么小基准测​​试可能无法反映现实。

而且我或其他任何人都无法告诉您哪种解决方案可以使用您的数据集在您的系统上为您提供最佳性能,除非我们可以访问您的数据集,确切地知道您的计算性能(也就是说,漂亮很多有你的代码),并且有使用两个“包”运行它的经验。

继续其他标准(“易用性”等),这些标准更基于“个人意见”,因此首先不适合 SO 问题。

于 2013-09-07T10:59:19.627 回答
1

这个答案不仅取决于优化标志,还取决于用于编译 GSL 库和您的特定代码的编译器。示例:如果您使用 gcc 编译 gsl 并使用 icc 编译程序,那么您可能会看到(显着)差异(我已经使用 std::pow 与 gsl_pow 进行了此测试)。./configure另外,由展示。

GSL 的一大优点是库的模块化。如果您不需要双精度,那么您可以编译gsl_complex.h,gsl_complex_math.hmath.c单独使用积极的浮点数优化(但是您需要删除#include <config.h>math.c 中的行)。另一种策略是使用积极的浮点数优化编译整个库的单独版本,并测试准确性是否不是您的特定问题的问题(这是我最喜欢的方法)。

编辑:我忘了提到gsl_complex.h还有一个浮动版本gsl_complex

typedef struct
  {
    float dat[2];
  }
gsl_complex_float;
于 2013-09-07T21:19:44.510 回答