高性能计算的C ++类 除非您确定代码会占用大部分CPU时间,否则不要优化代码

问题描述

根据this Quora forum

最简单的经验法则之一就是要记住,硬件喜欢数组,并且针对数组的迭代进行了高度优化。对许多问题的简单优化只是停止使用奇特的数据结构,而仅使用纯数组(或C ++中的std :: vectors)。这可能需要一些时间来适应。

C ++是否对那些“奇特的数据结构”进行分类,即一种可以被数组替换以在C ++程序中实现更高性能的数据类型?

解决方法

如果您的班级是这样的:

struct Person {
  double age;
  double income;
  size_t location;
};

然后您可能从重新安排到

std::vector<double> ages;
std::vector<double> incomes;
std::vector<size_t> locations;

但这取决于您的访问方式。如果您一次经常访问一个人的多个元素,那么将这些元素放在一起是很有意义的。

如果您的班级是这样的:

struct Population {
  std::vector<double> many_ages;
  std::vector<double> many_incomes;
  std::vector<size_t> many_locations;
};

然后,您使用的是您推荐的表格。单独使用这些数组中的任何一个都比使用第一类更快,但是在第二类中同时使用所有三个数组中的元素可能会更慢。

最终,您应该使代码的结构尽可能简洁和直观。速度的最大来源将是对算法的深刻理解和正确使用,而不是内存布局。我建议不要理会此操作,除非您已经具备强大的HPC技能,并且需要从计算机中获得最大的性能。在几乎所有其他情况下,您的开发时间和理智远比节省几个时钟周期有价值。

更广泛的

  1. 与此相关的有趣论文是SLIDE: In Defense of Smart Algorithms over Hardware Acceleration for Large-Scale Deep Learning Systems。在将ML算法映射到GPU方面已经进行了很多工作,并且对于ML应用程序而言,正确安排内存布局确实可以带来真正的改变,因为在培训上花费了大量时间,并且GPU已针对连续数组处理进行了优化。但是,论文的作者认为,即使在这里,即使您对算法的理解很好,也可以通过优化的内存布局击败专用硬件,他们通过使CPU训练速度比GPU快3.5倍来证明这一点。

  2. 更广泛地说,您的问题涉及cache misses的想法。由于缓存未命中的费用比L1参考(link)高200倍,因此,如果您的数据布局已针对计算进行了优化,则可以真正节省时间。 但是,正如上面所暗示的,在极少数情况下,简单地神奇地重新布置数据可以使一切变得更快。考虑矩阵乘法。这是一个完美的示例,因为根据资源的要求,数据被布置在单个数组中。但是,对于简单的三循环matmult GEMM实现,仍然有6种方式来布置循环。这些方法中的某些方法比其他方法效率要高得多,但是没有一种方法可以使您获得接近最佳性能的任何效果。通读this step-by-step explanation of matmult可以更好地了解获得良好性能所需的所有算法优化。

以上内容应说明的是,即使在我们仅按照您的资源所建议的那样仅布置了几个数组的情况下,仅布局也无法提高速度。好的算法可以做到。数据布局的考虑(如果有的话)来自我们选择的算法和更高级别的硬件约束。

如果对于简单的数组和诸如矩阵乘法之类的操作来说是这样,那么通过扩展,您还应该对“奇特的数据结构”也是如此。

,

C ++是否将这些“奇特的数据结构”之一分类为

我认为他们特别是指std::mapstd::dequestd::list等容器,它们在许多不同的堆分配中保存数据,因此需要遍历容器的内容CPU会在某种程度上在RAM地址空间中“跳来跳去”,而不仅仅是顺序读取RAM。这种跳跃通常会限制性能,因为当未来的RAM访问位置不容易预测时,由于RAM延迟,CPU的板载内存缓存在避免执行死机方面效果不佳。

C ++类本身可能会或可能不会鼓励非顺序RAM访问;它是否完全取决于类的实现方式(尤其取决于它是否通过多个堆分配保存其数据)。 std::vector类(在论坛文章中提到)是C ++类的一个示例,当您遍历其内容时,该类不需要任何非顺序的内存访问。

,

C ++是否将那些“精美数据结构”中的一种分类为

C ++类是可用于创建数据类型的构造。可用于创建列表,队列等数据结构。

即一种数据类型

类是数据类型

可以被数组替换的

类和数组不可互换。数组是数据结构。您正在将苹果与橙子进行比较。

在C ++程序中获得更高的性能?

这取决于您如何实现课程

,

C ++是否对那些“奇特的数据结构”进行分类,即一种可以被数组替换以在C ++程序中实现更高性能的数据类型?

计算机时间和开发时间都很宝贵。

除非您确定代码会占用大部分CPU时间,否则不要优化代码。

因此,请先使用profiler (例如Gprof),然后阅读C或C ++编译器的文档(例如GCC)。编译器能够进行优化。

如果您真的关心HPC,请通过以下方式了解GPGPU编程: OpenCLOpenACC

如果您碰巧使用Linux(HPC世界中的常见操作系统),请先阅读Advanced Linux Programming,然后依次阅读syscalls(2)time(7)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...