使用 llvm-prof 收集 LLVM 边缘分析

2024-02-18

我正在使用这些命令来编译下面的代码以收集 trunk-llvm 中的边缘/块分析:

clang -emit-llvm -c sort.c -o sort.bc
opt -insert-edge-profiling sort.bc -o sort_prof.bc
clang sort_prof.bc -lprofile_rt -L/llvms/lib -o sort_prof

然后我运行该程序并使用显示分析信息 llvm-prof sort_prof.bc,结果为:

===-------------------------------------------------------------------------===
Function execution frequencies:

 ##   Frequency
  1. 4.3e+05/708539 main
  2. 2.8e+05/708539 quickSort

  NOTE: 2 functions were never executed!
.....

我的问题是关于执行频率。是否使任何 感觉 main 执行了 4.3e+05 次? 为什么这样?我正在编译的代码如下。

###################### sort.c ########################
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 1000000;

void swap(int* a, int* b) {
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

int partition(int vec[], int left, int right) {
  int i, j;

  i = left;
  for (j = left + 1; j <= right; ++j) {
    if (vec[j] < vec[left]) {
      ++i;
      swap(&vec[i], &vec[j]);
    }
  }
  swap(&vec[left], &vec[i]);

  return i;
}

void quickSort(int vec[], int left, int right) {
  int r;

  if (right > left) {
    r = partition(vec, left, right);
    quickSort(vec, left, r - 1);
    quickSort(vec, r + 1, right);
  }
}

int main(void) {

        int vet[MAX], i=0;

        srand(time(NULL));

        for (i=0; i<MAX; i++) {
                vet[i] = rand() % 654321;
        }

        quickSort(vet, 0, MAX-1);

        for (i=0; i<MAX; i++) {
                if ((rand() % 7) > 2) {
                        printf("Num$[%d] = %d\n", i, vet[i]);
                }
                else if ((rand() % 4) > 2) {
                        printf("Num@[%d] = %d\n", i, vet[i]);
                }
                else if ((rand() % 2) > 1) {
                        printf("Num#[%d] = %d\n", i, vet[i]);
                }
        }

        return 0;
}

问题是我将带检测的位码文件传递给 llvm-prof ,正确的是使用原始文件(不带检测):

llvm-prof sort.bc

与 llvm-prof 相关的另一个问题是,它由于科学记数法而对函数/块执行频率进行舍入。我已经向 llvm 提交了一个补丁来纠正这个问题。

另一个提示是 llvm-prof 默认情况下仅显示前 20 个最常执行的基本块,并且它不向用户提供任何更改它的方法。我提交了另一个补丁,添加了一个命令行参数,使用户能够设置他/她想要在输出中包含多少个基本块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 llvm-prof 收集 LLVM 边缘分析 的相关文章

  • 如何在 Scala 编译器插件中生成文本形式的新源代码?

    我刚刚完成了 Java 6 编译器插件的第一个版本 它根据注释自动生成包装器 代理 适配器 委托 您可以随意称呼它 由于我正在进行 Java Scala 混合项目 因此我希望能够在 Scala 代码中使用相同的注释 并获得相同的生成代码 当
  • 在 Windows 上针对 Mac/Linux 进行编译

    显然 您无法真正在 Windows 上运行 Mac 或 Linux 应用程序 但是您可以使用 MSVC 为这些平台编译二进制文件吗 显然要插入额外的编译器和工具 对于一个严肃的构建系统 您不希望每个平台都有一个构建服务器 因此拥有一个为所有
  • 统一不同 clang-format 版本的输出

    我们尝试使用 clang format 工具稍微美化我们的代码 为了在我们所做的所有机器上获得统一的结果clang format style llvm dump config 已进行了一些调整并存储到 repo 中 问题是 clang 10
  • C 8位16位32位编译器之间的区别[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在编译的 C 或 C++ 代码中加密密码

    我知道如何在终端中使用 GCC 和 CC 编译 C 和 C 源文件 但是我想知道编译后在这些文件中包含密码是否安全 例如 我检查用户输入的某个密码 例如 123 但似乎已编译的 C C 程序可能会被反编译 无论如何 有没有办法编译 C C
  • C++ - 对于内部编译器错误可以做什么?

    在编写矩阵类时 我遇到了一些有趣且烦人的事情 内部编译器错误 我愿意在名为的类中调用一个姐妹构造函数Matrix4
  • Haskell GHC 动态编译仅适用于第一次编译

    按照发布的 GHC 教程here http www bluishcoder co nz 2008 11 dynamic compilation and loading of html并按照以下建议对此代码进行更改我之前问过的一个堆栈溢出问题
  • 有谁能够在 iOS 上使用 Address-Sanitizer(称为 asan 或 -fsanitize=address)吗?

    地址消毒剂https code google com p address sanitizer wiki AddressSanitizer https code google com p address sanitizer wiki Addr
  • 如何强制Delphi编译器显示所有提示和警告

    有没有办法强制Delphi编译器一直显示所有提示和警告 这是我目前在 Delphi 6 中看到的行为 从源代码管理中查看我的应用程序的最新副本 在Delphi中打开项目并编译 显示项目的所有提示和警告 更改一个单位 Compile 仅显示更
  • C函数分析(地址似乎有偏移)

    我正在尝试使用 finstrument functions 选项来分析函数调用 基本上 我所做的是将以下内容写入任何已编译的源代码中 static int stepper 0 void cyg profile func enter void
  • 鉴于 GPU 有任务队列并且是异步的,计算 FPS 的正确方法是什么?

    我始终认为计算 FPS 的正确方法是简单地计算绘制循环迭代所需的时间 互联网上的大部分内容似乎都是一致的 But 现代显卡被视为异步服务器 因此绘制循环会发出 GPU 上已有的顶点 纹理 等数据的绘制指令 这些调用不会阻塞调用线程 直到 G
  • 如何将三地址代码转换为MIPS汇编语言?

    我正在做一个项目 其中我必须创建一个翻译器来为 C 代码生成 MIPS 汇编代码 正在使用的编程语言是 C 我已经完成了三个地址代码的生成 但我对如何进一步进行感到非常困惑 如前所述 这是直接翻译 确实没有什么需要澄清的 以下面的三地址代码
  • 重用语义分析阶段的符号表来生成代码

    我目前正在为一种具有全局变量和嵌套子例程功能的语言构建编译器 以前 我只为只有局部变量而没有嵌套子例程的语言构建过编译器 我有一个关于如何重用在代码生成阶段的语义分析阶段填充的符号表的问题 我将符号表作为链表堆栈 其中每个链表代表在特定范围
  • 在编译时检测编译器版本

    这既是一个问题 也是一个参考 我希望人们能够在此基础上进行构建 以便有类似问题的人可以重用它 我们如何可靠地检测 C C ObjC 编译器的特定版本 现在我知道了 Visual Studio 的答案 并部分知道了 Xcode 的答案 现在
  • ld:警告:__DATA/__objc_imageinfo__DATA 节的大小意外地大

    有谁知道这个警告是什么意思 接下来是错误 Command Developer Platforms iPhoneSimulator platform Developer usr bin llvm gcc 4 2 failed with exi
  • 无意中使用 = 而不是 ==

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 看起来 if x y 代替 if x y 是许多罪恶的根源 为什么不all编译器将其标记
  • 文本段的名称从何而来?

    传统的汇编器和更高级别的编译器使用多个内存segments 根据预期用途 因此 有数据段 堆栈段 bss 和文本段 文本段也称为代码段 Text部分 为了机器码 我问过所有我能找到的老前辈 像机器代码这样难以阅读的东西是如何被称为 文本段
  • 如何将 Ruby 编译为 Javascript? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在研究一段逻辑 我想在服务器和浏览器中表达它 类似于验证表单 其中基于已输入的内容 元素之间必须存在某些逻辑关系 所以 如果我可以编写
  • 使用 LLVM 内联特定函数调用

    给定一个llvm CallInst 我如何告诉内联器内联这个特定的调用 我可以将目标函数标记为AlwaysInline这将内联调用 但它也会内联每个调用 也许有某种方法可以在我发出特定调用时调用内联函数 内联基本块内的所有调用也可以 您可以
  • VisualVM中的时间和时间(CPU)有什么区别

    我使用 VisualVM 来查找某个特定调用的所有时间都花在了哪里 我发现大部分时间都在数据库调用中 但是分析器显示85 的时间是java lang Object 只有15 的时间在数据库调用中 我读错了什么吗 The columns wi

随机推荐

  • 线程“main”中的异常 java.lang.NoClassDefFoundError: com/google/common/base/Preconditions

    在 Eclipse 中运行 java Map Reduce 应用程序时 遇到以下异常 我也将 commons logging 1 2 jar 文件包含在我的构建路径中 但仍然在下面 我是 hadoop 新手 请帮助我 Exception i
  • 暂停 jQuery 中的默认事件

    我试图延迟 jQuery 脚本中的一个或多个默认事件 上下文是 我想在用户执行某些操作 主要单击 时在默认操作触发之前几秒钟向用户显示一条消息 伪代码 用户点击链接 按钮 元素 用户收到一条弹出消息 指出 您正在离开网站 消息在屏幕上保留
  • ASP.NET MVC 路由 - 尝试在 URL 中包含名称

    我目前有以下路线 routes IgnoreRoute resource axd pathInfo routes IgnoreRoute resource gif pathInfo MvcRoute MappUrl controller a
  • Angular 8 - 如何从回调路由中的url获取数据

    如何获取access tokenkeycloak服务器到我的授权组件 授权 URL 如下所示 回调网址位于http localhost 4200 auth http localhost 4200 auth 这是组件 import Compo
  • Android Google 登录按钮和 Facebook sdk 4+ 按钮布局

    我正在开发一个使用的应用程序google https developers google com branding guidelines sign in button and facebook https developers facebo
  • SignalR 和浏览器连接限制

    我用 SignalR 制作了一个简单的应用程序进行测试 当页面加载时 它会调用服务器上的函数 该函数然后调用在屏幕上打印消息的客户端函数 我这样做是为了检查客户端和服务器功能是否正常工作以及 SignalR 通信是否正常 我的问题是 如果我
  • Colab 突然无法浏览目录

    过去几个月我一直在使用 Google Colab 在连接驱动器和输入 shell 命令时没有出现任何问题 然而今天突然出现了一个错误 我找不到任何解决办法 Colab 似乎神奇地无法浏览目录 对于 cd pwd mkdir 等目录的任何 b
  • WooCommerce - 登录后重定向到上一页

    我一直在寻找可以处理它几个小时的插件和片段 但没有成功 每个答案都不适合我 我的菜单中有 登录 链接 可通往 WooCommerce 我的帐户 页面 其中显示登录表单 我希望客户在成功登录后返回到单击 登录 链接的页面 wp get ref
  • Highcharts - 如何更新角度系列?

    我在柱形图中更新系列数据时遇到问题 一开始 当我的模型为空时 我设置一个空数组作为系列 然后在ngOnchanges方法我映射我的modelData到匹配的格式 不幸的是 图表仍然是空的 这是我的组件代码 export class Colu
  • PHP 验证 PayPal 捐赠

    我如何验证贝宝捐款 在用户面板中我有一个捐赠按钮 一旦有人真正捐款 我就想为他做点什么 但我不知道如何检查用户是否实际捐赠或只是单击了捐赠按钮 看看 Paypal 的IPN https www paypal com ipn 即时付款通知 当
  • 长时间运行 Jupyter 笔记本/实验室?

    我在 ec2 实例上的 tmux 会话中运行 Jupyter 我有运行时间非常长的单元格 但是当我关闭浏览器或笔记本电脑盖子时 笔记本电脑不再写入输出单元格 并且可能会使 python 内核崩溃 这是我在远程实例上启动实验室的方式 jupy
  • 如何在 Prometheus 中推送 Kubernetes 指标而不是拉取?

    我已经在我们的基础设施中配置了 Prometheus 进行监控 在我们的基础设施中 我们有一个正在运行的 EKS 集群 我必须在 Prometheus 中收集 EKS 指标 默认情况下 Prometheus 采用基于拉动的机制 这里我有一个
  • NUnit 最佳实践

    环境 Visual Studio Professional 2008 中的 C WinForms 应用程序 我一直在挖掘有关 NUnit 最佳实践的指导 作为一个在相对孤立的环境中工作的独立程序员 我希望这里的集体智慧可以帮助我 斯科特 怀
  • 如何为 SonarQube.Scanner.MSBuild.exe 提供参数?

    通过在线搜索和查看 sonarqube 文档 我唯一能找到的是 SonarQube Scanner MSBuild exe k KeyOfProject n NameOfProject msbuild exe C projectpath s
  • 如何在特定接口上打开套接字并接收 IPv4 和 IPv6 流量

    使用 IPv4 我可以将 绑定到特定地址来选择将用于接收数据包的接口 在某些情况下 也用于发送数据包 但这不是重点 在双栈 IPv6 IPV4 机器上 我遇到这个问题 我可以创建一个 6 套接字并使用它接收 4 个流量 但如果我想绑定到特定
  • 如何强制 powershell 重新加载自定义模块?

    我创建了一个模块 ActiveDirectory psm1 其中包含 powershellv5 中的一个类 我将该模块导入另一个名为 test ps1 的文件中 然后从该类中调用一个方法 test ps1 包含以下内容 using modu
  • 如何*取消*突出显示选定的文本?

    以前的一个question https stackoverflow com questions 58175015 vba powerpoint how to highlight selected text描述了如何使用 Font Highl
  • 除了第一个 cudaMalloc 调用之外,还有什么特定的函数可以初始化 GPU?

    由于 GPU 上的一些初始化工作 第一个 cudaMalloc 调用很慢 例如 0 2 秒 是否有任何函数只进行初始化 以便我可以分离时间 cudaSetDevice 似乎将时间减少到 0 15 秒 但仍然没有消除所有初始化开销 致电 cu
  • git 选择性恢复文件中的本地更改

    在我跟踪 svn 存储库的 git 存储库中 我对单个文件进行了多次编辑 现在我想恢复这些更改 如 svn revert 但只是文件的一部分 我希望能够查看文件上的差异 丢弃 恢复 我不想要的更改并保留我想要的更改 the git add
  • 使用 llvm-prof 收集 LLVM 边缘分析

    我正在使用这些命令来编译下面的代码以收集 trunk llvm 中的边缘 块分析 clang emit llvm c sort c o sort bc opt insert edge profiling sort bc o sort pro