问题标签 [shark]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 优化 C 循环以获得数组的对角线
谷歌大神并没有向我解释一些循环优化问题。所以,很遗憾我没有足够的 Google-fu,我求助于 StackOverflow。
我正在优化用于求解特定微分方程组的 C 程序。在寻找数值解的过程中,我调用一个建立线性方程组的函数,然后调用一个函数来解决它。
求解函数最初在访问定义线性系统的数组对角线上的元素时存在瓶颈。因此,我包含了一个在系统初始化期间设置的一维数组,该数组保存沿数组对角线的值。
为了好玩,我继续使用初始化对角元素的代码,测量它所花费的时间并尝试不断改进代码。我尝试的版本导致了几个问题:
注意:我将我尝试过的所有版本都放在一个函数中,并分析了这个函数以查看时间花在了哪里。我将报告一个版本的执行时间占函数总时间的百分比。该功能被评估了数百万次。数字越小越好。
代码中使用的数据的相关声明:
我用于初始化 diag_data的原始循环。时间是评估的 16.1%(见注)。
总而言之,我们抓取指向对角线的指针,将一些组件设置为零(根据我使用的算法,这不是可选的),然后抓取驻留在以稀疏形式表示的“数组”的对角线上的值通过 spJ。由于 spJ 是 150x150 数组(大部分为零)的 908 个非零的一维数组,我们必须使用查找来查找 spJ 中对角线元素的位置。此查找由 98 元素数组 sp_diag_ind 定义。
我试图删除 jter 的使用,因为它显示为不可自由增加。我第二次尝试的中间循环:
这使情况有所改善。此版本的时间为 15.6%。但是当我查看 Shark 对此代码的分析(Mac 上 XCode 附带的工具)时,它警告我这是一个未对齐的循环。
第三次改进的尝试是删除“归零”循环并使用 memset 将 diag_data 归零:
时间为 14.9%。不确定什么是未对齐的循环,我继续摆弄。我发现了一个改进的第四个实现,使用指针在 diag_data 和 spJ[crazy index] 之间进行对齐偏移:
使用 diag_mask 可以稍微提高速度。它以 13.1% 的比例出现。
编辑:原来这部分比我最初想象的更愚蠢。iter 的使用是未定义的。支持@caf 和@rlibby 来捕捉它。
最后,我尝试了一些我认为很愚蠢的方法:
时间为 10.9%。此外,当我查看带注释的源代码时,Shark 不会发出未对齐循环警告。 结束愚蠢的部分
所以,我的问题:
- 什么是未对齐的循环?
- 为什么第五个实现是一致的,而第四个不是?
- 是否有一个对齐的循环负责在我的第四个和第五个实现之间提高执行速度,或者是否将增量步骤嵌入到 sp_diag_ind 的值的查找中?
- 你看到我可以做的任何其他改进吗?
谢谢您的帮助。
- 安德鲁
iphone - 我在哪里可以下载鲨鱼?
这可能是一个相当愚蠢的问题,但我一直在查看 Apple 开发人员页面,但没有找到任何鲨鱼的下载链接。我在我的硬盘上进行了搜索,我只找到了鲨鱼插件......
ios - Mac OS X Lion / Mountain Lion 缓存未命中分析
是否有任何工具可以分析 Mac OS X Lion 和 iOS 上的缓存未命中情况。如果您知道如何在仪器中做到这一点,请提供帮助。
Shark(CHUD 包)不安装在 Mac OS X Lion 及更高版本上,所以我不能使用 Shark。同时我在 Instruments 中找不到缓存未命中分析器的功能。
c++ - 如何在 vs 代码中安装 C++ 库,例如 Eigen 和 SharkML?
我正在尝试在 VSCode for C++ 中安装 eigen、sharkMl、xtensor 等库。请如果有人可以帮助我知道正确的方法。