如何测量 x86 纳秒以下的运行时间?

2023-12-25

我搜索并使用了许多方法来测量经过的时间。为此目的有很多问题。例如,this https://stackoverflow.com/questions/6749621/how-to-create-a-high-resolution-timer-in-linux-to-measure-program-performance/6749768#6749768问题很好,但是当你需要一个准确的时间记录器时我找不到一个好的方法。为此,我想在这里分享我的方法,供大家使用,如有错误,还望指正。

更新&注意:这个问题是针对Benchmarking的,不到一纳秒。和使用完全不一样clock_gettime(CLOCK_MONOTONIC,&start);它记录的时间超过一纳秒。

UPDATE :衡量加速比的常用方法是重复程序中应进行基准测试的部分。但是,正如评论中提到的,当研究人员依赖自动矢量化时,它可能会显示出不同的优化。

NOTE它不够准确,无法测量一次重复所经过的时间。在某些情况下,我的结果表明该部分必须重复超过 1K 或 1M 才能获得最短的时间。

建议 :我不熟悉 shell 编程(只知道一些基本命令...)但是,也许可以测量最短时间,而无需在程序内重复。

我目前的解决方案为了防止分支,我使用宏重复颂歌部分#define REP_CODE(X) X X X... X X其中 X 是我想要进行基准测试的代码部分,如下所示:

//numbers
#define FMAX1 MAX1*MAX1
#define COEFF 8 
int __attribute__(( aligned(32))) input[FMAX1+COEFF];           //= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
int __attribute__(( aligned(32))) output[FMAX1];
int __attribute__(( aligned(32))) coeff[COEFF] = {1,2,3,4,5,6,7,8};//= {1,1,1,1,1,1,1,1};//;            //= {1,2,1,2,1,2,1,2,2,1};

int main()
{
    REP_CODE(
        t1_rdtsc=_rdtsc();
        //Code
        for(i = 0; i < FMAX1; i++){
            for(j = 0; j < COEFF; j++){//IACA_START
                output[i] += coeff[j] * input[i+j]; 

            }//IACA_END
        }
        t2_rdtsc=_rdtsc();
        ttotal_rdtsc[ii++]=t2_rdtsc-t1_rdtsc;
        )
    // The smallest element in `ttotal_rdtsc` is the answer
}

这不会影响优化,但也会受到代码大小的限制,某些情况下编译时间会太多。

有什么建议和更正吗?

提前致谢。


如果您对自动矢量化器有问题并且想要限制它,只需添加一个asm("#somthing");在你之后begin_rdtsc它将分开do-while环形。我刚刚检查过,它对您发布的代码进行了矢量化,而自动矢量化器无法对其进行矢量化。 我改变了你的宏你可以使用它......

long long t1_rdtsc, t2_rdtsc, ttotal_rdtsc[do_while], ttbest_rdtsc = 99999999999999999, elapsed,  elapsed_rdtsc=do_while, overal_time = OVERAL_TIME, ttime=0;
int ii=0;
    #define begin_rdtsc\
                    do{\
                        asm("#mmmmmmmmmmm");\
                        t1_rdtsc=_rdtsc();

    #define end_rdtsc\
                        t2_rdtsc=_rdtsc();\
                        asm("#mmmmmmmmmmm");\
                        ttotal_rdtsc[ii]=t2_rdtsc-t1_rdtsc;\
                    }while (ii++<do_while);\    
                    for(ii=0; ii<do_while; ii++){\
                        if (ttotal_rdtsc[ii]<ttbest_rdtsc){\
                            ttbest_rdtsc = ttotal_rdtsc[ii];}}\             
                    printf("\nthe best is %lld in %lld iteration\n", ttbest_rdtsc, elapsed_rdtsc);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测量 x86 纳秒以下的运行时间? 的相关文章

随机推荐

  • java中的immutable和final有什么区别?

    最近有人问我这个问题 但无法简明地解释这两个概念到底有何不同 例如 最终且不可变 final String name John 如果我现在写 name Sam 我会得到一个编译器错误 不可变 String name John name Sa
  • SSRS 2005 如何打印 4" X 3" 标签为纵向..SSRS 假定为横向

    我有一份 SSRS 2005 报告表单 正在打印到 Zebra ZDesigner TLP 2844 Z 标签打印机 交互和页面尺寸设置为 4 英寸宽 x 3 英寸高 由于 SSRS 中没有纸张方向 因此当它应该是纵向报告时 它会假设这是横
  • 在 Hudson 重新运行期间首先运行失败的测试

    我在哈德逊有一份长期运行的单元测试工作 如果某些测试失败 我想先运行它们 而不是等待其他测试在它们之前运行 看看我是否修复了它们 可以在哈德逊设置吗 谢谢 我之前也遇到过同样的问题 这是我的解决方案 您可以编写一个独立程序来运行单元测试用例
  • 在nodejs解密中出现错误(错误:不支持的状态或无法验证数据)

    我在 java 中使用 AES GCM NoPadding 算法 AES 256 加密了一条消息 并尝试在 NodeJs 中解密它 出现异常 错误 状态不受支持或无法验证数据 同时解密 下面是java和nodejs的完整代码以及错误信息 请
  • ASP.NET Core:[FromQuery]用法和URL格式

    我正在尝试在我的 Web api 中使用 FromQuery 但我不知道如何使用它 这是控制器中的 GetAllBooks 方法 HttpGet Route api v1 ShelfID shelfID BookCollection pub
  • Open Office xml SDK 异常“无法插入 OpenXmlElement“newChild”,因为它是树的一部分”

    我正在使用 open office sdk 2 0 生成一个 word 文档 我遇到的异常是 无法插入 OpenXmlElement newChild 因为它是树的一部分 我知道异常是由于尝试 xml 中的重复节点造成的 但我不知道如何修复
  • 在 Chromium 中使用 WebCrypto 生成 RSA 密钥对

    以下代码适用于 Firefox 76 0 1 use strict let RSAKeys async gt RSAKeys await crypto subtle generateKey name RSA OAEP modulusLeng
  • node_modules 中的 webpack 4 图像:找不到模块

    问题 我使用 webpack 4 将 scss 编译为 css 并使用 MiniCssExtractPlugin 将 css 保存到不同的文件中 问题是 我无法加载通过 url 包含在 scss 文件内的图像和字体 运行开发或生产之间也没有
  • 如何初始化一个大小由 argc 和 argv 确定的二维数组?

    我正在编写代码 该代码将跟踪每次访问数组中的特定元素时的情况 数组本身将根据用户的输入动态分配 因此我所看到的函数都不是我正在寻找的 更具体地说 如何动态分配数组的行和列 然后将每个元素初始化为 0 前任 SIM A B int array
  • curl_multi_exec 显示不同的运行

    我只使用curl multi exec 来处理5 个url 现在我有这个奇怪的问题 当我在 xampp 上运行我的代码时 它运行完美 我可以看到 running 值初始化为 5 然后不断减少 但是 当我在其他本地主机 在arm架构上 上尝试
  • 使用 WebGL 索引缓冲区绘制网格

    3 个索引缓冲区 https stackoverflow com questions 2696182 3 index buffers问了一个更困难的问题 但我觉得他们的主要问题归结为我的 有没有办法使用索引缓冲区在 WebGL 中多次访问同
  • pyinstaller编译的文件有ssl问题,错误:185090050

    我有一些 python 代码可以在我的 Windows 机器上的 python ide 和 cmd 提示符下成功运行 当我用 pyinstaller 编译 到一个文件中 后 我收到以下错误 Traceback
  • flot.js - 位置垂直刻度,但被切断并居中

    我使用 flot js 绘制 x 轴上带有时间戳的图表 由于我在这些图表上会有很多刻度 所以我垂直旋转它们 这样它们就不会重叠 这工作正常 但标签集中在刻度上 并且没有提供足够的空间 因此它们被切断 我没有使用ticrotor插件滴答声 h
  • UDP/TCP 打洞 vs UPnP vs STUN vs?

    我尝试制作一个 P2P 程序 需要帮助来穿越客户端的 NAT 我在 stackoverflow 上读过很多问题 但我从来不知道通过 NAT 的所有方法的缺点和优点是什么 有多少路由器支持哪些方法 大公司常用哪些方法 BitTorrent T
  • OSError:输入/输出错误 - Google Colab

    Using h5py File path r 或 喀拉斯 model load weights path on h5文件产生以下错误 我已经在 Colab 上训练模型几个月了 从来没有遇到过这个问题 从云端硬盘下载后 相同的文件在我的计算机
  • 使用 graphql 公开动态模式

    我的应用程序动态处理模式 用户可以上传新域或更改现有域的定义 例如 我发布的产品具有如下用户模式 user fn ln age Later user can change this definition to include new pro
  • 在 C++ 中修改后修复文件权限?

    我将数据保存在程序的可执行文件中 我将其复制到临时文件中 覆盖从 a 开始的部分 神奇的字符串 并将其重命名为原来的 我知道这是一个坏主意 但我这样做只是为了实验 到目前为止 一切正常 除了每次替换文件时我必须重新启用 允许作为可执行文件运
  • 远程检查交换凭据并检查登录的用户

    我曾尝试过这一点 但没有取得多大成功 基本上我需要使用 EWS 远程登录 Exchange 问题是我不知道用户是否已正常登录 或者凭据是否错误 因为我没有得到任何回报 如果我提供了错误的凭据 软件就会继续运行 我是否遗漏了一些东西 我已经检
  • 无法导入模块

    首先 这很可能不是路径问题 我在 eclipse 中有一个 pydev 项目 这是目录结构 Genetic Framework Genetic Framework Genetic init py GA py crossover py fit
  • 如何测量 x86 纳秒以下的运行时间?

    我搜索并使用了许多方法来测量经过的时间 为此目的有很多问题 例如 this https stackoverflow com questions 6749621 how to create a high resolution timer in