gpt4 book ai didi

c++ - 高性能计算的C++类

转载 作者:行者123 更新时间:2023-12-01 14:35:03 25 4
gpt4 key购买 nike

根据this Quora forum

One of the simplest rules of thumb is to remember that hardware loves arrays, and is highly optimized for iteration over arrays. A simple optimization for many problems is just to stop using fancy data structures and just use plain arrays (or std::vectors in C++). This can take some getting used to.


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

最佳答案

如果您的类(class)看起来像这样:

struct Person {
double age;
double income;
size_t location;
};
那么您可能会受益于重新安排
std::vector<double> ages;
std::vector<double> incomes;
std::vector<size_t> locations;
但这取决于您的访问模式。如果您经常一次访问一个人的多个元素,那么将这些元素组合在一起是很有意义的。
如果您的类(class)看起来像这样:
struct Population {
std::vector<double> many_ages;
std::vector<double> many_incomes;
std::vector<size_t> many_locations;
};
然后,您将使用您的资源推荐的表格。单独使用这些数组中的任何一个都比使用第一类更快,但是使用第二类同时使用来自所有三个数组的元素可能会更慢。
最终,您应该使代码的结构尽可能简洁和直观。速度的最大来源将是对算法的深刻理解和正确使用,而不是内存布局。我建议不要理会此操作,除非您已经具备强大的HPC技能并且需要从计算机中获得最大性能。在几乎所有其他情况下,您节省开发时间和理智比节省几个时钟周期要有值(value)得多。
更广泛的
  • 与之相关的有趣论文是SLIDE: In Defense of Smart Algorithms over Hardware Acceleration for Large-Scale Deep Learning Systems。在将ML算法映射到GPU方面已经进行了很多工作,并且对于ML应用程序而言,正确安排内存布局确实可以带来真正的改变,因为在培训上花费了大量时间,并且GPU已针对连续数组处理进行了优化。但是,本文的作者认为,即使您对算法的理解很好,也可以通过优化的内存布局击败专用硬件,他们通过使CPU训练速度比GPU快3.5倍来证明这一点。
  • 更广泛地说,您的问题涉及cache misses的想法。由于高速缓存未命中的费用比L1引用(link)高200倍,因此,如果您的数据布局已针对您的计算进行了优化,则可以真正节省时间。 然而,如上所述,,很少情况就是简单地神奇地重新整理数据就能使一切变得更快。考虑矩阵乘法。这是一个完美的示例,因为根据资源的要求,数据被布置在单个数组中。但是,对于简单的三循环matmult GEMM实现,仍然有6种方式来布置循环。这些方法中的某些方法比其他方法效率要高得多,但是没有一种方法可以使您获得接近最佳性能的任何效果。通读this step-by-step explanation of matmult可以更好地了解获得良好性能所需的所有算法优化。

  • 以上应该说明的是,即使在我们仅按照您的资源所建议的那样仅布置了几个数组的情况下,仅靠布局也无法提高速度。好的算法可以做到。数据布局注意事项(如果有)来自我们选择的算法和更高级别的硬件约束。
    如果对于简单的数组和矩阵乘法之类的操作是如此,那么通过扩展,您还应该对“奇特的数据结构”也是如此。

    关于c++ - 高性能计算的C++类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63692267/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com