首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于高性能计算的C++类

用于高性能计算的C++类
EN

Stack Overflow用户
提问于 2020-09-01 17:01:03
回答 4查看 1.1K关注 0票数 4

这个Quora论坛称,

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

C++类是那些“花哨的数据结构”之一,即一种可以被数组取代的数据类型,以在C++程序中获得更高的性能吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-09-01 17:15:02

如果您的班级是这样的:

代码语言:javascript
复制
struct Person {
  double age;
  double income;
  size_t location;
};

那么你可能会从重新安排到

代码语言:javascript
复制
std::vector<double> ages;
std::vector<double> incomes;
std::vector<size_t> locations;

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

如果您的班级是这样的:

代码语言:javascript
复制
struct Population {
  std::vector<double> many_ages;
  std::vector<double> many_incomes;
  std::vector<size_t> many_locations;
};

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

最终,您应该尽可能地构造您的代码以保持简洁和直观。最大的速度来源将是强大的理解和适当使用算法,而不是内存布局。我建议你忽略这一点,除非你已经有很强的高性能控制技能,并且需要从你的机器中榨取最大的性能。在几乎所有其他情况下,您的开发时间和理智都比节省几个时钟周期更有价值。

更广泛地说是

  1. 与此相关的一篇有趣的论文是幻灯片:防止大规模深度学习系统硬件加速的智能算法。在将ML算法映射到GPU方面已经做了大量工作,对于ML应用程序来说,获得正确的内存布局确实有很大的不同,因为花费了大量的时间在培训上,并且GPU是专门针对连续数组处理进行优化的。但是,本文的作者认为,即使在这里,如果你对算法有很好的理解,你也可以用优化的内存布局击败专门的硬件,他们通过让他们的CPU比他们的GPU快3.5倍来演示这一点。
  2. 更广泛地说,您的问题涉及缓存漏掉的概念。由于缓存丢失比L1引用(链接)高200倍,如果您的数据布局优化了计算,那么就可以真正节省时间。然而,正如上面所指出的,--然而,--很少会简单地重新排列数据,从而使一切变得更快。考虑矩阵乘法。这是一个完美的例子,因为数据是按照资源的要求在一个数组中布局的。然而,对于一个简单的三环匹配GEMM实现,仍然有6种方法来安排您的循环。其中有些方法比其他方法效率高得多,但它们中没有一种能给您提供接近高峰的性能。阅读一步一步的解释,以更好地理解所有算法优化,以获得良好的性能。

上面应该展示的是,即使在我们只有几个数组的情况下,就像您的资源所建议的那样,布局本身并不能给我们速度。好的算法就行。数据布局方面的考虑,如果有的话,来自我们选择的算法和更高层次的硬件约束.

如果对于简单的数组和像矩阵乘法这样的操作是这样的,那么你也应该期望它也适用于“花哨的数据结构”。

票数 5
EN

Stack Overflow用户

发布于 2020-09-01 17:05:55

C++类是那些“漂亮的数据结构”之一吗?

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

C++类本身可能鼓励也可能不鼓励非顺序RAM访问;它是否这样做完全取决于类是如何实现的(特别是取决于它是否通过多个堆分配保存其数据)。std::vector类(在论坛文本中提到)是一个C++类的例子,它在遍历其内容时不需要任何非顺序的内存访问。

票数 3
EN

Stack Overflow用户

发布于 2020-09-01 17:16:34

C++类是那些“奇特的数据结构”之一吗?

C++类是一个可用于创建数据类型的构造。它可以用于创建数据结构,如列表、队列等。

即一种数据类型

类是数据类型。

可以用数组替换的

类和数组不可互换。数组是数据结构。你在比较苹果和橘子。

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

这取决于您如何实现类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63692267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档