【问题标题】:Understand whether code sample is CPU bound or Memory bound了解代码示例是否受 CPU 限制或内存限制
【发布时间】:2013-02-05 23:07:41
【问题描述】:

对于那些致力于程序优化和性能调整的人来说,一个普遍的问题是,您如何确定您的代码是受 CPU 限制还是内存限制?我大体上理解这些概念,但如果我说“y”个负载和存储量以及“2y”个计算,那么如何找出瓶颈是什么?

您还可以弄清楚您将大部分时间花在哪里,并说,如果您在每次循环迭代中将“x”数量的数据加载到缓存中(如果它的内存受限),那么您的代码会运行得更快吗?除了反复试验,还有什么精确的方法可以确定这个“x”吗?

是否有任何工具可供您使用,比如在 IA-32 或 IA-64 架构上? VTune 有帮助吗?

例如,我目前正在做以下事情:

我有 26 个 8*8 复数双精度矩阵,我必须为这 26 个矩阵中的每一个执行一个长度为 8 的 (~4000) 个向量的 MVM(矩阵向量乘法)。我使用 SSE 来执行复数乘法。

/*Copy 26 matrices to temporary storage*/
for(int i=0;i<4000;i+=2){//Loop over the 4000 vectors 
    for(int k=0;k<26;k++){//Loop over the 26 matrices
       /*
        Perform MVM in blocks of '2' between kth matrix and 
        'i' and 'i+1' vector
       */     

    }
}

这 26 个矩阵占用 26kb(L1 缓存为 32KB),并且我已将向量放置在内存中,这样我就有了 stride'1' 访问权限。一旦我对具有 27 个矩阵的向量执行 MVM,我就不会再次访问它们,所以我认为缓存阻塞不会有帮助。我使用了矢量化,但仍然停留在 60% 的峰值性能上。

我尝试将例如 64 个向量复制到临时存储中,对于外部循环的每次迭代,我认为它们会在缓存中并提供帮助,但它只会降低性能。我尝试通过以下方式使用 _mm_prefetch():当我完成大约一半的矩阵时,我将下一个 'i' 和 'i+1' 向量加载到内存中,但这也没有帮助。

假设它的内存受限,我已经完成了所有这些,但我想确定。有什么办法吗?

【问题讨论】:

  • 你用的是什么操作系统?
  • Linux。但是在这种情况下,操作系统有什么关系呢?我使用作业调度在集群上运行它,所以没有其他进程在运行..
  • 我很好奇,你试过用perf吗?
  • @amdn 实际上没有,没有安装 perf,我很难让他们安装它。我改用VTune。我还重新安排了我的代码,现在它提供了最佳性能,毕竟它不受内存限制
  • 很高兴您能够提高性能!

标签: c performance optimization sse


【解决方案1】:

据我了解,最好的方法是分析您的应用程序/工作负载。根据输入数据,应用程序/工作负载的特性可能会有很大差异。然而,这些行为可以用很少的phasesRef[23] 来量化,并且直方图可以大致说明要优化的工作负载的最频繁路径。您提出的问题还需要针对架构的基准程序 [如 SPEC2006、PARSEC、Media bench 等],并且很难笼统地回答(并且是计算机架构研究的一个积极部分)。但是,对于特定情况,可以针对不同的内存层次说明定量结果。您可以使用以下工具:

  • 性能
  • OProfile
  • VTune
  • LikWid
  • LLTng

和其他监控和模拟工具来获取应用程序的分析跟踪。您可以查看性能计数器,如 IPC、CPI(用于 CPU 绑定)和内存访问、缓存未命中、缓存访问以及其他内存计数器以确定内存边界。如 IPC、每周期内存访问 (MPC),通常用于确定应用程序/工作负载的内存边界。 为了专门改进矩阵乘法,我建议使用LAPACK 中的优化算法。

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 2011-05-14
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2017-07-08
    • 2023-03-23
    • 2022-06-26
    • 1970-01-01
    相关资源
    最近更新 更多