如何定期使用 PAPI 进行性能测量

2024-01-09

我想使用 C 中的 PAPI api 分析我的应用程序的系统性能。一般结构是
-- 初始化PAPI
-- 初始化感兴趣的计数器
-- 启动计数器
-- 运行应用程序的主要逻辑
-- 结束计数器并读取值

我想定期读取计数器(例如每 1 秒一次),而不是在应用程序结束时读取最终值。 PAPI 输出是否给出程序执行结束时的聚合值,例如程序执行后 L2 缓存未命中的总数。另一个例子是在每个时间实例读取指令数,而不是在程序结束时读取指令总数。


您对此有什么想法吗?我正在做同样的事情,但我得到了奇怪的结果:我的计数器没有像我希望的那样频繁更新。

作为记录,以下是我测试过且运行良好的示例:

#include <papi.h>
#include <stdio.h>
#include <stdlib.h>

main()
{
int retval, EventSet = PAPI_NULL;
long_long values[3];
    unsigned counter;
    unsigned c;
    unsigned long fact;
    unsigned stoppoint;


        /* Initialize the PAPI library */
        retval = PAPI_library_init(PAPI_VER_CURRENT);

        if (retval != PAPI_VER_CURRENT) {
          fprintf(stderr, "PAPI library init error!\n");
          exit(1);
        }

        /* Create the Event Set */
        if (PAPI_create_eventset(&EventSet) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);

        /* Add Total Instructions Executed to our EventSet */
        if (PAPI_add_event(EventSet, PAPI_TOT_INS) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);

        /* Add Total Instructions Executed to our EventSet */
        if (PAPI_add_event(EventSet, PAPI_TOT_CYC) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);

        /* Add Total Instructions Executed to our EventSet */
        if (PAPI_add_event(EventSet, PAPI_LST_INS) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);


   srand ( time(NULL) );
   stoppoint = 50+(rand() % 100);
/* Do some computation here */
    for (counter = 0; counter < stoppoint; counter++)
    {
        /* Initialize the PAPI library */
        retval = PAPI_library_init(PAPI_VER_CURRENT);

        if (retval != PAPI_VER_CURRENT) {
          fprintf(stderr, "PAPI library init error!\n");
          exit(1);
        }


        /* Start counting */
        if (PAPI_start(EventSet) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);


                fact = 1;
        for (c = 1; c <= counter; c++)
        {
                     fact = c * c;
        }




        printf("Factorial of %d is %lu\n", counter, fact);
        if (PAPI_read(EventSet, values) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);
        printf ("\nTotal Instructions Completed:\t%lld\t Total Cycles:\t%lld\tLoad Store Instructions\t%lld\n\n", values[0], values[1], values[2]);
        /* Do some computation here */

        if (PAPI_stop(EventSet, values) != PAPI_OK)
            printf ("%s:%d\t ERROR\n", __FILE__, __LINE__);

            }
        /* End of computation */


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

如何定期使用 PAPI 进行性能测量 的相关文章

  • java - 简单计算在多线程中比在单线程中花费更长的时间

    我试图了解如何利用多线程 我写了一个简单的程序来增加i 比方说 使用两种方式 400 000 次 单线程方式 0 到 400 000 和多线程方式 在我的例子中 4 次 0 到 100 000 线程数等于Runtime getRuntime
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 带有闭包的 JavaScript 性能

    var name function n var digits one two three four return digits n var namenew function digits one two three four return
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • 为什么 System.nanoTime() 比 System.currentTimeMillis() 慢(性能)?

    今天我做了一个快速基准测试来测试速度性能System nanoTime and System currentTimeMillis long startTime System nanoTime for int i 0 i lt 1000000
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?

    我有一个表值内联 UDF 我想过滤该 UDF 的结果以获得一个特定值 当我使用常量参数指定过滤器时 一切都很好 并且性能几乎是瞬时的 当我使用可变参数指定过滤器时 它会花费明显更大的时间块 大约是逻辑读取的 500 倍和持续时间的 20 倍
  • 即使在急切加载之后,belongs_to 关联也会单独加载

    我有以下关联 class Picture lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many pictures end 在我的
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • Pandas hub_table 更快的替代品

    我正在使用熊猫pivot table在大型数据集 1000 万行 6 列 上运行 由于执行时间至关重要 因此我尝试加快流程 目前 处理整个数据集大约需要 8 秒 这太慢了 我希望找到替代方案来提高速度 性能 我当前的 Pandas 数据透视
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 为什么列表理解在数组相乘方面比 numpy 快得多?

    最近我回答了THIS https stackoverflow com questions 31596979 multiplication between 2 lists 31597029 31597029想要两个列表相乘的问题 一些用户建议
  • Javascript 定时通知 - setTimeout、setInterval

    我正在创建一个网络应用程序 允许用户管理日历 CRUD 事件 任务 提醒等 我正在尝试实现一个功能 他们将在事件 任务前 x 分钟收到弹出提醒 根据我的理解 使用 javascript 确实只有一种方法可以做到这一点 登录时 检查数据库中是
  • 处理大数据二进制文件

    我正在处理包含原始数据的大型二进制文件 每个大约 2 GB 这些文件具有明确定义的结构 其中每个文件都是一个数组events 每个事件都是一个数组data banks Each event and data bank有一个结构 header
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有

随机推荐

  • Python 3 XOR 字节数组

    python 3中是否有内置函数可以bitwise xor字节 例如 如果我有 2 个字节数组 one oE1ltQSsoEqRC4j1EMz1ORU1dyucIcI4WstKz uhuKA two Rffs1PW5zA1h5RFVh5Mk
  • jQuery AJAX - 让浏览器请求重定向标头中的新位置

    jQuery ajax 可以使浏览器请求服务器发送的重定向标头中的新位置吗 jQuery 执行预期的操作 自动遵循重定向并获取最终页面 你可以去http jigsaw w3 org HTTP 300 http jigsaw w3 org H
  • 如何使用SQL来匹配并删除字符串后面的所有内容?

    如何使用 SQL 查找字符串 如果存在 则返回该字符串之前的所有内容 即 在下面的示例中 在 ETL 过程中 我们如何从源中获取列 识别字符串 uniquecode 并因此在接收器列的 SELECT 语句中删除该字符串及其后面的所有内容 如
  • Dart 使用 json_serialized 解析 json 到/从 json 库类

    我正在与地理编码库 https pub dev packages geocoder扑腾中 当我得到一个Address https pub dev documentation geocoder latest model Address cla
  • 向 PHP 对象内的数组添加值

    我有这个对象 myobject object name gt value gt id gt 我想在 foreach 循环中添加一些值 但数组推送似乎不起作用 我试过这个 object name myobject gt name array
  • 无论列的顺序如何聚合

    我想按两列聚合一个数据框 以便这些变化仅存在一次 值列应该由聚合函数聚合 例如max or sum Data itemID1 itemID2 value B0001 B0001 1 B0002 B0001 1 B0001 B0002 2 B
  • rmi java.security.policy 访问被拒绝

    我是 Java 中的 RMI 主题新手 我想使用 RMI 创建客户端服务器应用程序 我按照此链接中找到的本教程进行操作 使用 eclipse 的 RMI 教程 http www ejbtutorial com java rmi a step
  • 分组并计算 Javascript 数组中属性的平均值

    我很难在其他 stackoverflow 帖子中找到我正在寻找的解决方案 尽管我强烈地觉得它必须存在 如果是的话 请把我转发到正确的方向 我正在尝试使用运动数据在 javascript 中做一个非常标准的分组 我有以下对象数组 const
  • 如何在Python中拆分数学表达式的字符串?

    我制作了一个在 python 中将中缀转换为后缀的程序 问题是当我介绍论点时 如果我引入这样的内容 这将是一个字符串 73 34 72 33 3 56 95 28 它会用 split 分割它 程序将正常工作 但我希望用户能够介绍这样的内容
  • iOS 6 社交框架无法设置或没有警报

    我正在尝试在 iOS6 中实现新的社交框架 并让它正常工作 除了两个奇怪的问题 如果我启用了我感兴趣的服务 例如 FaceBook 那么它就可以正常工作 但是 如果从设置面板 假设是 Facebook 为了保持一致 中删除了帐户 那么我会在
  • 如何在 MATLAB 的 bar3 图中隐藏零值

    我有一个 2 D 直方图 该图是 3D 的 几个并排绘制的直方图 是用 bar3plot 命令生成的 然而 所有零值在 x y 平面上都显示为平面正方形 有没有办法阻止 MATLAB 显示这些值 我已经尝试用 NaN 替换所有零 但它并没有
  • 如何在 OpenUrl 卡操作中回复消息?

    我正在发送带有 openURL 的 cardAction 用户应该单击该按钮 按照所述 URL 中的说明进行操作 然后报告数据 我想要显示一条消息when用户单击按钮 同时打开 URL 根据我的测试 我只能选择 ImBack 或 OpenU
  • 如何在 Google Cloud BigQuery 中小写整个列数据

    我正在尝试找到一种 快速 方法来小写 Google Cloud BigQuery 内表列中的所有数据 字符串 在构建脚本之前 我正在寻找更短的方法 例如查询 如何查询 BigQuery 以小写整个列 您可以使用UPDATE陈述 UPDATE
  • MySQL UPDATE 和 SELECT 一次性完成

    我有一个要执行的 MySQL 任务表 每一行都有一个任务的参数 有许多工作应用程序 可能在不同的机器上 循环执行任务 这些应用程序使用 MySQL 的本机 C API 访问数据库 为了拥有一项任务 应用程序会执行以下操作 生成一个全局唯一的
  • 类型参数命名准则是什么?

    我注意到了 也看到了必备 C 3 0 https rads stackoverflow com amzn click com 0321533925书上 参数通常定义为T or TEntity 例如 public class Stack
  • !: Angular 中的(爆炸冒号)表示法

    I found 中使用的符号Angular 弃用文档 https angular io guide deprecations dependency on a reflect metadata polyfill in jit mode Inp
  • TextField 包含日语字符时缺少字体样式

    将字符串传递给视图 Case 1 English alphabet is no problem test deck ABCDE Case 2 Font style is missing test deck Case 3 Font style
  • 用于比较 Windows 二进制文件的工具?

    我们的 QA 团队希望根据 EXE 和 DLL 在构建之间实际发生的变化来集中测试 我们有一个很好的 svn 更改报告 但是源代码和更改的二进制文件之间的关系并不总是很明显 我们正在比较的构建始终是完全干净的构建 因此我们不能使用文件系统时
  • Python 基础知识 为什么 set() 有效但 {} 失败? [复制]

    这个问题在这里已经有答案了 s this that this 为什么set s 工作但是 s 失败了 TypeError unhashable type list 这是因为它们意味着不同的东西 set s 迭代s创建一个集合 而文字语法 s
  • 如何定期使用 PAPI 进行性能测量

    我想使用 C 中的 PAPI api 分析我的应用程序的系统性能 一般结构是 初始化PAPI 初始化感兴趣的计数器 启动计数器 运行应用程序的主要逻辑 结束计数器并读取值 我想定期读取计数器 例如每 1 秒一次 而不是在应用程序结束时读取最