当前位置: 首页 > 知识库问答 >
问题:

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

苏振国
2023-03-14

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

C++类是那种“奇特的数据结构”,即一种可以用数组代替的数据类型,以在C++程序中获得更高的性能吗?

共有1个答案

荀增
2023-03-14

如果您的类如下所示:

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;
};

更广泛地说,您的问题涉及缓存未命中的想法。由于一个缓存未命中要比一个L1引用(链接)贵200倍,如果你的数据布局优化到你的计算,那么你就真的可以节省时间。然而,正如上面所暗示的,很少会出现这样的情况:简单地重新排列你的数据就神奇地使一切变得更快。考虑矩阵乘法。这是一个完美的例子,因为按照资源的要求,数据以单个数组的形式进行布局。然而,对于一个简单的三循环matmult GEMM实现,仍然有6种方法来安排您的循环。其中一些方法比其他方法效率高得多,但没有一种方法能给您提供接近峰值的性能。阅读本文对matmult的逐步解释,以更好地理解获得良好性能所需的所有算法优化。

上面应该说明的是,即使我们只有几个数组按照您的资源建议进行布局,单靠布局并不能给我们提供速度。好的算法可以。数据布局考虑因素(如果有的话)来自我们选择的算法和更高级别的硬件约束。

如果对于简单的数组和像矩阵乘法这样的操作是这样的话,那么通过扩展,您也应该期望对于“高级数据结构”也是这样。

 类似资料:
  • 👥面试题目 一面 项目 cuda详细说(好久了有的忘记了说的磕磕巴巴的) 然后 讲了实习的东西 感觉和他们目前的业务比较match 基础问题 c加加和cuda的基础问题 一个膨胀卷积实现的手撕 呃问我怎么优化 没回答出来 给我讲解了我还是没明白 笑死 面试官无语 反问 两轮技术面 技术业务偏向移动端硬件优化这边 面试官比较友好 亲切 没开摄像头 希望可以进二面 跪求

  • 1、自我介绍 2、项目介绍 3、主要做了什么,为什么这样做 4、模型结构 5、与原算法比较,优势和不足 6、在学校有没有学过机器学习深度学习相关课程 7、滤波器(不会) 8、怎样部署(不会) 9、评价指标 10、倾向于做什么方向 11、线性回归与逻辑回归 12、朴素贝叶斯 13、代码题:单位园随机采样 #摩尔线程##摩尔线程智能科技(北京)有限责任公司#

  • 我正在研究一个基于代理的流行病模型。这个想法是单个代理根据他们在网络中观察到的情况(基于距离)做出决定。我在每个代理中都有几个功能,可以动态更新受感染接触者的数量,接触者表现出特定行为等。 下面的代码用于计算代理网络中受感染的联系人。 至少还有3个这样的函数可以保持表示代理网络中其他功能的其他代理的计数。现在,当我 有没有一种计算效率更高的方法来跟踪更大人口的网络统计数据?

  • 【名称】蔚来高性能计算日常实习 1 2 3面 【时间】23.07 【公司】蔚来 【岗位】高性能计算 【面经】个人 一面: 1. 自我介绍 2. 深挖实习 3. 你用过TensorRT 讲讲对 TensorRT的理解 4. 讲讲TensorRT 和 OpenVINO的区别 C++ 八股: 5. C++面向对象特性 面向对象特性分别如何体现的 6. 讲一下继承 7. 讲一下虚函数 8. 讲一下vect

  • 校验者: @曲晓峰 @小瑶 翻译者: @小瑶 对于某些 applications (应用),estimators(估计器)的性能(主要是 prediction time (预测时间)的 latency (延迟)和 throughput (吞吐量))至关重要。考虑 training throughput (训练吞吐量)也可能是有意义的,但是在 production setup (生产设置)(通常在脱

  • 投的上海的高性能计算被挂了,被北京的高性能计算的语音技术部捞了 百度面试官非常好,体验感非常棒,奈何自己太菜了,全程道歉 一面 8.2 项目深挖 算子开发相关涉及知识点 GPU架构,内存模型 并发编程 锁 信号量 创建线程的几种方式 lambda表达式的底层是怎么实现的 std::move 使用场景,他比赋值构造好在哪 lock_guard相比较于lock/unlock能防止什么问题? cuda