虽然已经有很多工具可以测量硬件性能计数器,但是仍然缺少一个轻量的命令行工具进行简单的端到端测量。Linux MSR模块,提供了从用户空间访问模型专用寄存器的接口,使我们能够不修改Linux内核就能读取Linux读取硬件性能计数器。此外,最近的Intel系统通过PCI接口提供非核心的硬件计数器。

likwid-perfctr支持以下模式:

  • 封装模式:使用likwid-perfctr作为你的程序的封装器,可以在不修改你的代码的情况下测量。
  • 听诊器模式:在一段时间内测量性能计数器,与运行的代码无关。
  • 时间轴模式:以指定的频率输出性能指标,可以是秒或毫秒。
  • 标记器API:只测量代码的一段区域,还是用likwid-perfctr控制要测量什么。

有一些预配置的事件集,称为性能组,是一组预选的事件集和根据事件集计算的指标。另外,你也可以指定一个自定义的事件集,在一个事件集中,你可以选择CPU插槽(socket)提供的任意多个物理计数器。请参见架构定义页获得更多详细信息。likwid-perfctl会在启动时检查事件配置的一组计数器是否可用。

由于likwid-perfctl执行简单的端到端测量,对执行的代码一无所知,因此固定(pin)应用程序至关重要。测量与代码之间的完全是通过固定来建立关系。由于likwid完全在用户空间工作,所以不可能测量单个进程,LIKWID始终测量CPU或插槽(socket)。likwid-perfctl具有likwid-pin内置的所有功能,你不需要用其它的工具固定。如果需要你也可以自己控制与CPU内核的亲和力。

likwid-perfctl的性能组是简单的文本文件,很容易修改和拓展。创建自己的性能组和指标非常简单。相对于以前版本的LIKWID,更新性能组不用再重新编译了。

文章目录

    • 支持的架构
      • Intel:
      • AMD:
      • ARM:
      • IBM:
    • 先决条件
      • 始终需要先决条件
      • 直接访问模式的先决条件
      • 访问守护进程模式的先决条件
    • 选项
    • 基本使用(封装模式)
    • 基本线程用法
    • 使用自定义事件集
    • 性能组
    • 在单词运行中使用多个事件集或性能组
    • 使用 Marker API
    • 在 Fortran 90 中使用 Marker API
    • 中间 Marker API 文件的语法
    • 其它编程语言的 Marker API
    • 自定义性能组
    • 时间线模式
    • 听诊器模式
    • 输出过滤
    • 将likwid-perfctr用于MPI程序
    • 在likwid-perfctr中使用perf_event后端
    • 使用 Nvidia GPU 后端
    • 使用 GENERIC_EVENT

支持的架构

有关likwid-perfctl对特定CPU架构的可用计数器和相关计数器选项的信息,点击下面的链接。

Intel:

  • P6 processors : Pentium 2, Pentium 3 (deprecated)
  • Pentium M : Banias, Dothan (deprecated)
  • Core2 : 65nm Dual Core, 45nm Dual and Quad Core
  • Nehalem : Full support for Uncore.
  • NehalemEX : Full support for Uncore.
  • Westmere : Full support for Uncore.
  • WestmereEX : Full support for Uncore.
  • Silvermont : Support for energy counters.
  • Goldmont : Support for energy counters.
  • SandyBridge : Support for energy counters.
  • SandyBridge EP/EN : Support for energy counters. Full support for Uncore.
  • IvyBridge : Support for energy counters.
  • IvyBridge EP/EN/EX : Support for energy counters. Full support for Uncore.
  • Haswell : Support for energy counters. Full support for Uncore.
  • Haswell EP/EN/EX : Support for energy counters. Full support for Uncore.
  • Broadwell : Support for energy counters.
  • Broadwell Xeon D : Support for energy counters. Full support for Uncore.
  • Broadwell EP : Support for energy counters. Full support for Uncore.
  • Skylake : Support for energy counters. Full support for Uncore.
  • Skylake X : Support for energy counters. Full support for Uncore.
  • Intel Xeon Phi (KNC) : Intel Xeon Phi KNC, support for energy counters. Full support for Uncore.
  • Intel Xeon Phi (KNL, KNM) : Intel Xeon Phi KNL and KNM, support for energy counters. Full support for Uncore.
  • Cascadelake X : Support for energy counters. Full support for Uncore.

AMD:

  • K8 : All variants
  • K10 : Barcelona, Shanghai, Istanbul and MagnyCours
  • Interlagos : Full support including NorthBridge counters
  • Kabini : Full support including L2 and NorthBridge counters
  • Zen: Full support for core-local, L3, data fabric and energy counters.
  • Zen2: Full support for core-local, L3, data fabric and energy counters.

ARM:

  • ARM A15: ARM A15 core
  • ARM A57: ARM A57 core
  • Marvell Thunder X2: Marvell Thunder X2. With uncore support

IBM:

  • POWER8: IBM POWER8
  • POWER9: IBM POWER8

先决条件

不同的访问模式(直接访问或访问守护进程)需要的先决条件不一样。

始终需要先决条件

MSR设备文件必须存在。可以使用ls /dev/cpu/*/msr进行检查,每个CPU应该列出一个msr设备文件。如果没有这些文件,请尝试通过sudo modprobe msr加载msr内核模块,然后再次检查MSR设备文件。为了在启动时加载模块,可以在/etc/modules中添加一行msr,文件名可能因系统版本而异。

直接访问模式的先决条件

与访问守护进程方式相比,直接访问模式的开销更小,但是要求用户有管理员权限。在config.mk中设置ACCESSMODE=direct使用这个功能。

  • 确保你的用户有足够的权限读取和写入MSR设备文件。可以通过sudo chmod +rw /dev/cpu/*/msr添加访问MSR设备文件的权限。
  • MSR设备文件受到严格保护以保证安全。为了解除保护,要执行以下任意一个操作:
    • 你可以设置LIKWID的Lua解释器的功能:sudo setcap cap_sys_rawio+ep <PREFIX>/bin/likwid-lua,其中<perfix>是安装路径。由于功能系统有点奇怪并且依赖于操作系统,因此这一步可能并不够。并且这个设置只提供core-local计数器,不支持Uncore。
    • 你可以设置Lua解释器setuid root。但是不建议这样做,因为这会运行任何人使用LIKWID Lua解释器用root权限执行代码。

访问守护进程模式的先决条件

为了使普通用户能够访问硬件性能计数器,可以使用守护进程。作者在编写时牢记安全性的要求,它限制了硬件性能相关寄存器的访问,所以用户不能读写系统相关寄存器。当你在config.mk中选择ACCESSMODE=accessdaemon,你只需要通过sudo make install安装LIKWID。这会为守护进程设置适当的权限。不要改变config.mk中的CHOWN变量除非你想用不同的权限(允许访问MSR设备文件的组,root用户的不同名字等)。

关于Linux内核5.9及更新版本的更新:使用Linux 5.9时,msr内核模块得到了一些安全更新,对于LIKWID的主要改变是,现在默认情况下所有的MSR都是不可写的。为了改变这种情况,你需要修改引导选项,添加msr.allow_writes=on以允许写操作。这只会影响ACCESSMODE=directACCESSMODE=accessdaemon。如果你设置了perf_event 后端,那就不用修改任何东西。

也可以查看INSTALL文件获取更多细节。在对安全敏感的区域上,比如多用户系统或HPC(高性能计算)集群上,对所有MSR寄存器进行不受控制的访问是一个安全问题。有关此问题的解决方案,请查看Build和likwid-accessD.

选项

-h, --help            帮助信息
-v, --version         版本信息
-V, --verbose <level> 日志打印等级, 0 (only errors), 1 (info), 2 (details), 3 (developer)
-c <list>             要测量的处理器ID (必选), 例如 1,2-4,8
-C <list>             固定线程并测量的处理器ID, e.g. 1,2-4,8有关更多 <list> 的语法, 参见 likwid-pin
-G <list>             要测量的GPU ID
-g, --group <string>  CPU的性能组或自定义事件集字符串
-W <string>           英伟达GPU的性能组或自定义事件集字符串
-H                    获得性能组的帮助 (与 -g 选项一起用)
-s, --skip <hex>      用于跳过线程的比特位掩码
-M <0|1>              设置如何访问MSR寄存器, 0=直接, 1=访问守护进程
-a                    列出可用的性能组
-e                    列出可用事件和计数器寄存器
-E <string>           列出可用事件和对应的计数器中匹配<string>的计数器(不区分大小写)
-i, --info            打印CPU信息
-T <time>             以给定的频率切换事件集
模式:
-S <time>             听诊器模式的周期,以s, ms 或 us 为单位, 比如 20ms
-t <time>             时间线模式的频率,以 s, ms 或 us 为单位, 比如 300ms
-m, --marker          在代码中使用Marker API
输出选项:
-o, --output <file>   保存输出到文件. (可选: 根据文件名后缀应用文本过滤器)
-O                    输出可解析的 CSV 而不是 fancy tables

基本使用(封装模式)

用以下命令输出帮助:

$ likwid-perfctr -h

有两个需要的选项: -c配置应测量CPU核心的哪些计数器,-g指定要测量的性能组和时间集。CPU核心id列表是一个逗号分割的序列,其中可以包含范围,例如1,2,4-7。可以在likwid-pin支持的从物理处理器id到不同逻辑变量的所有变量中使用此列表。要指出线程和缓存拓扑可以用likwid-topology](https://github.com/RRZE-HPC/likwid/wiki/likwid-topology)。由于 likwid-perfctr 只测量处理器不了解你的线程和进程, 因为必须确保你的代码真的运行在likwid-perfctr感知的处理器上。likwid-perfctr 包含likwid-pin用于固定线程的所有功能。但是你也可以使用其它工具固定或者通过代码功能。
为了收集关于硬件性能和性能组的信息,请使用 -a, -g-H 选项。

输出处理器支持的所有组:

$ likwid-perfctr -a

要获得所有受支持的计数器寄存器和事件列表,执行:

$ likwid-perfctr -e | less

要获取所有支持的事件和对应的匹配字符串的计数器寄存器列表,执行:

$ likwid-perfctr -E <string>

可以通过 -H-g 选项获得特定事件集的帮助:

$ likwid-perfctr -H -g MEM

这将在性能组文件的 LONG 后面打印文本。要自定义性能组,建议添加描述文本和计算指标的公式.

将 likwid-perfctr 用于串行应用程序执行:

$ likwid-perfctr  -C S0:1  -g BRANCH  ./a.out

这会将应用程序固定到CPU插槽(socket)0上的第二个核心(索引为1)。并测量该内核的性能组BRANCH。可以在 likwid-pin 上找到有关CPU字符串表示方法的说明。上述串行应用程序的执行结果输出如下图所示:

--------------------------------------------------------------------------------
CPU name:	Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
CPU type:	Intel Core Haswell processor
CPU clock:	3.39 GHz
--------------------------------------------------------------------------------
YOUR PROGRAM OUTPUT
--------------------------------------------------------------------------------
Group 1: BRANCH
+------------------------------+---------+---------+
|             Event            | Counter |  Core 1 |
+------------------------------+---------+---------+
|       INSTR_RETIRED_ANY      |  FIXC0  |  201137 |
|     CPU_CLK_UNHALTED_CORE    |  FIXC1  |  375590 |
|     CPU_CLK_UNHALTED_REF     |  FIXC2  | 1595994 |
| BR_INST_RETIRED_ALL_BRANCHES |   PMC0  |  44079  |
| BR_MISP_RETIRED_ALL_BRANCHES |   PMC1  |   3982  |
+------------------------------+---------+---------++----------------------------+--------------+
|           Metric           |    Core 1    |
+----------------------------+--------------+
|     Runtime (RDTSC) [s]    | 3.522605e-03 |
|    Runtime unhalted [s]    | 1.107221e-04 |
|         Clock [MHz]        | 7.982933e+02 |
|             CPI            | 1.867334e+00 |
|         Branch rate        | 2.191491e-01 |
|  Branch misprediction rate | 1.979745e-02 |
| Branch misprediction ratio | 9.033780e-02 |
|   Instructions per branch  | 4.563103e+00 |
+----------------------------+--------------+`

输出中包含有原始事件计数器的表格和计算出的指标的表格。如果测量多次,会有另一个包括统计数据(求和,最大值,最小值和平均值)的表格。

通常,事件名称和官方处理器手册中的名称相同(用 “_” 替换 “.”)。相关手册位于Intel Software Development Manual 3B Appendix A和(AMD)BIOS and Kernel Developers Guides (BKDG)。你也可以在供应商提供的优化手册中查看感兴趣的事件集,或者在Intel的性能监控数据库中查看(https://download.01.org/perfmon/)。Intel系统上存在 OFFCORE_RESPONSE 事件但是不符合Intel符号,你必须使用 OFFCORE_RESPONSE_0/1_OPTIONS 事件并使用其事件选项 match0 (低寄存器部分) 和match1 (高寄存器部分)自己指定过滤寄存器的比特位. LIKWID还引入了一些官方文档中找不到的事件,它们是大家都知道的事件,事件带有预配置的事件选项。

基本线程用法

对于线程使用,除了-c参数外没有任何变化。该应用程序在线程支持下进行编译。不需要设置OMP_NUM_THREADSCILK_WORKERSlikwid-perfctr会根据给定的CPU列表自动设置。如果已经设置了环境变量,likwid-perfctr 不会覆盖它们。

$ likwid-perfctr -C 0-3 -g BRANCH ./a.out
--------------------------------------------------------------------------------
CPU name:	Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
CPU type:	Intel Core Haswell processor
CPU clock:	3.39 GHz
--------------------------------------------------------------------------------
YOUR PROGRAM OUTPUT
--------------------------------------------------------------------------------
Group 1: BRANCH
+------------------------------+---------+----------+---------+----------+---------+
|             Event            | Counter |  Core 0  |  Core 1 |  Core 2  |  Core 3 |
+------------------------------+---------+----------+---------+----------+---------+
|       INSTR_RETIRED_ANY      |  FIXC0  | 15585960 | 5526616 |  7679943 | 4045942 |
|     CPU_CLK_UNHALTED_CORE    |  FIXC1  | 15025112 | 4660629 |  7745757 | 3406840 |
|     CPU_CLK_UNHALTED_REF     |  FIXC2  | 44696128 | 9473964 | 22825288 | 3762474 |
| BR_INST_RETIRED_ALL_BRANCHES |   PMC0  |  1470984 |  752872 |  1163894 |  345736 |
| BR_MISP_RETIRED_ALL_BRANCHES |   PMC1  |   9457   |   8238  |   25573  |   1025  |
+------------------------------+---------+----------+---------+----------+---------++-----------------------------------+---------+----------+---------+----------+------------+
|               Event               | Counter |    Sum   |   Min   |    Max   |     Avg    |
+-----------------------------------+---------+----------+---------+----------+------------+
|       INSTR_RETIRED_ANY STAT      |  FIXC0  | 32838461 | 4045942 | 15585960 | 8209615.25 |
|     CPU_CLK_UNHALTED_CORE STAT    |  FIXC1  | 30838338 | 3406840 | 15025112 |  7709584.5 |
|     CPU_CLK_UNHALTED_REF STAT     |  FIXC2  | 80757854 | 3762474 | 44696128 | 20189463.5 |
| BR_INST_RETIRED_ALL_BRANCHES STAT |   PMC0  |  3733486 |  345736 |  1470984 |  933371.5  |
| BR_MISP_RETIRED_ALL_BRANCHES STAT |   PMC1  |   44293  |   1025  |   25573  |  11073.25  |
+-----------------------------------+---------+----------+---------+----------+------------++----------------------------+--------------+--------------+--------------+--------------+
|           Metric           |    Core 0    |    Core 1    |    Core 2    |    Core 3    |
+----------------------------+--------------+--------------+--------------+--------------+
|     Runtime (RDTSC) [s]    | 6.292864e-02 | 6.292864e-02 | 6.292864e-02 | 6.292864e-02 |
|    Runtime unhalted [s]    | 4.429985e-03 | 1.374134e-03 | 2.283749e-03 | 1.004468e-03 |
|         Clock [MHz]        | 1.140153e+03 | 1.668508e+03 | 1.150968e+03 | 3.071098e+03 |
|             CPI            | 9.640158e-01 | 8.433061e-01 | 1.008570e+00 | 8.420388e-01 |
|         Branch rate        | 9.437879e-02 | 1.362266e-01 | 1.515498e-01 | 8.545253e-02 |
|  Branch misprediction rate | 6.067640e-04 | 1.490605e-03 | 3.329842e-03 | 2.533403e-04 |
| Branch misprediction ratio | 6.429030e-03 | 1.094210e-02 | 2.197193e-02 | 2.964690e-03 |
|   Instructions per branch  | 1.059560e+01 | 7.340711e+00 | 6.598490e+00 | 1.170240e+01 |
+----------------------------+--------------+--------------+--------------+--------------++---------------------------------+--------------+--------------+-------------+----------------+
|              Metric             |      Sum     |      Min     |     Max     |       Avg      |
+---------------------------------+--------------+--------------+-------------+----------------+
|     Runtime (RDTSC) [s] STAT    |  0.25171456  |  0.06292864  |  0.06292864 |   0.06292864   |
|    Runtime unhalted [s] STAT    |  0.009092336 |  0.001004468 | 0.004429985 |   0.002273084  |
|         Clock [MHz] STAT        |   7030.727   |   1140.153   |   3071.098  |   1757.68175   |
|             CPI STAT            |   3.6579307  |   0.8420388  |   1.00857   |   0.914482675  |
|         Branch rate STAT        |  0.46760772  |  0.08545253  |  0.1515498  |   0.11690193   |
|  Branch misprediction rate STAT | 0.0056805513 | 0.0002533403 | 0.003329842 | 0.001420137825 |
| Branch misprediction ratio STAT |  0.04230775  |  0.00296469  |  0.02197193 |  0.0105769375  |
|   Instructions per branch STAT  |   36.237201  |    6.59849   |   11.7024   |   9.05930025   |
+---------------------------------+--------------+--------------+-------------+----------------+

请注意,在LIKWID之前的版本中,你必须指定使用的线程实现,现在不需要了。LIKWID使用pinning库重载pthread_create的调用,这种线程解决方案被许多多线程库使用 (当然包括 PThreads,还包括OpenMP, Cilk+, C++11线程)。

在较新的处理器上存在一个与 Uncore 事件相关的问题。Uncore计数器测量每个插槽。因此likwid-perfctr具有一个插槽锁,确保每个插槽只有一个线程启动计数器,只有一个线程停止计数器。每个插槽第一个初始化的CPU会在整个执行时间内得到并保持锁。注意在统计信息表中包括尚未测量Uncore事件的处理器,因此仅 MAX 和 SUM 值可用。

使用自定义事件集

likwid-perfctr 允许自定义事件集。你可以选择测量物理计数器支持的所有事件。你可以用事件/计数器对的列表(用逗号分隔)定义事件集。**这高度依赖于体系结构!**在Intel架构上,固定目的的事件(如果尚未存在)会自动添加到事件集中。固定事件是retired指令(INSTR_RETIRED_ANY:FIXC0)、当前频率的时钟周期 (CPU_CLK_UNHALTED_CORE:FIXC1)和参考时钟(CPU在非暂停状态时)的时钟周期(CPU_CLK_UNHALTED_REF:FIXC2) 。

看起来像:

$ likwid-perfctr -C 0-3 -g FP_COMP_OPS_EXE_SSE_FP_PACKED_DOUBLE:PMC0,FP_COMP_OPS_EXE_SSE_FP_SCALAR_DOUBLE:PMC1 ./a.out--------------------------------------------------------------------------------
CPU name:	Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz
CPU type:	Intel Xeon IvyBridge EN/EP/EX processor
CPU clock:	3.00 GHz
--------------------------------------------------------------------------------
YOUR PROGRAM OUTPUT
--------------------------------------------------------------------------------
Group 1:
+--------------------------------------+---------+--------------+--------------+--------------+--------------+
|                 Event                | Counter |    Core 0    |    Core 1    |    Core 2    |    Core 3    |
+--------------------------------------+---------+--------------+--------------+--------------+--------------+
|          Runtime (RDTSC) [s]         |   TSC   | 2.058991e+01 | 2.058991e+01 | 2.058991e+01 | 2.058991e+01 |
|           INSTR_RETIRED_ANY          |  FIXC0  |  99177052283 |  70451946660 |  42327093707 |  14201949658 |
|         CPU_CLK_UNHALTED_CORE        |  FIXC1  |  52549591060 |  37828491423 |  23914813640 |  9075382636  |
|         CPU_CLK_UNHALTED_REF         |  FIXC2  |  45643583430 |  33342410670 |  21380293590 |  8250340590  |
| FP_COMP_OPS_EXE_SSE_FP_PACKED_DOUBLE |   PMC0  |  23240920556 |  16616581676 |  9974859861  |  3342307010  |
| FP_COMP_OPS_EXE_SSE_FP_SCALAR_DOUBLE |   PMC1  |    9889323   |   10181092   |   10184277   |   10276947   |
+--------------------------------------+---------+--------------+--------------+--------------+--------------++-------------------------------------------+---------+--------------+-------------+-------------+----------------+
|                   Event                   | Counter |      Sum     |     Min     |     Max     |       Avg      |
+-------------------------------------------+---------+--------------+-------------+-------------+----------------+
|          Runtime (RDTSC) [s] STAT         |   TSC   |   82.35964   |   20.58991  |   20.58991  |    20.58991    |
|           INSTR_RETIRED_ANY STAT          |  FIXC0  | 226158042308 | 14201949658 | 99177052283 |   56539510577  |
|         CPU_CLK_UNHALTED_CORE STAT        |  FIXC1  | 123368278759 |  9075382636 | 52549591060 | 30842069689.75 |
|         CPU_CLK_UNHALTED_REF STAT         |  FIXC2  | 108616628280 |  8250340590 | 45643583430 |   27154157070  |
| FP_COMP_OPS_EXE_SSE_FP_PACKED_DOUBLE STAT |   PMC0  |  53174669103 |  3342307010 | 23240920556 | 13293667275.75 |
| FP_COMP_OPS_EXE_SSE_FP_SCALAR_DOUBLE STAT |   PMC1  |   40531639   |   9889323   |   10276947  |   10132909.75  |
+-------------------------------------------+---------+--------------+-------------+-------------+----------------+

自定义事件集是FP_COMP_OPS_EXE_SSE_FP_PACKED_DOUBLE:PMC0,FP_COMP_OPS_EXE_SSE_FP_SCALAR_DOUBLE:PMC1。它定义了在计数器PMC0PMC1上编程的两个事件。Intel平台为计数器FIXC0FIXC1FIXC2自动添加的事件。事件 Runtime (RDTSC) [s] 和它的计数器 TSC 是虚拟事件。无法在自定义事件集中定义此事件或计数器。通常程序的运行时会打印在性能组定义的指标表中。自定义事件集没有要计算的指标。为了给自定义事件提供完整的概览,运行时将会作为虚拟事件输出。

性能组

常见任务存在预配置的事件集,这些组提供有用的事件集并据此计算常见的指标。我们尝试为所有架构上提供一些基本组。由于功能不同,有些性能组可能是基于特定处理器的。你可以使用likwid-perfctr -a打印可用的组。关于性能组选择了特定处理器的哪些事件,可以用 -H -g group 选项查看详细的文档,其中包括计算指标会使用哪些事件。

在单词运行中使用多个事件集或性能组

从 LIKWID 4.0.0 版本开始,可以测量多个性能组或自定义事件集。每个事件集都能用所有可用的性能计数器。事件集以 round-robin 方式切换。默认切换周期是两秒,但是可以使用-T <time> 更换此时间。请注意并非所有架构都提供 L2L3 性能组,只有CPU架构提供了需要的事件,我们才能提供性能组。

$ likwid-perfctr -C S0:0-3 -g L2 -g L3 -T 500ms ./a.out

上述命令会测量固定在插槽0上的前4个内核的应用程序。它从测量 L2 性能组开始,在500毫秒后切换到L3,再过500毫秒会测量L2。输出只会显示两个性能组的结果,但是只包括分别被测的时间段,因此 runtime_L2 + runtime_L3 = runtime_a.out。计算指标只包括性能组运行时,而不是整体时间吗,没有外推法或类似的方法。如果你想知道全部运行时间的L2数据量,你需要自己缩放(假设数据量线性增长)。听诊器模式不支持多个组!

使用 Marker API

Marker API 能够测量代码中的一段。允许区域重叠或嵌套,也可以多次进行一个区域(例如循环)。每个区域的计数器会累加。在多线程的情况下,可以有串行或并行区域。

Marker API 只读取计数器。计数器的配置仍然通过 likwid-perfctr 进行封装。为了使用 LIKWID Marker API,必须包括头文件 likwid.h 并将代码链接到 LIKWID 库。另外如果需要在链接期间启用 Pthreads,通常要在编译器命令行中设置 -pthread 。为了让你快速开关 Marker API,LIKWID 头文件中包含一组宏,可以在软件编译期间通过定义 LIKWID_PERFMON 激活 Marker API。必须在把 LIKWID 添加到头文件中,即使你的 LIKWID is not 不可用,代码也能编译。

对于 gccicc 看起来像这样:

$ gcc -O3 -fopenmp -pthread -o test dofp.c -DLIKWID_PERFMON -I<PATH_TO_LIKWID>/include -L<PATH_TO_LIKWID>/lib -llikwid -lm

下面这个例子展示了 Marker API 在串行代码的用法:

// This block enables to compile the code with and without the likwid header in place
#ifdef LIKWID_PERFMON
#include <likwid.h>
#else
#define LIKWID_MARKER_INIT
#define LIKWID_MARKER_THREADINIT
#define LIKWID_MARKER_SWITCH
#define LIKWID_MARKER_REGISTER(regionTag)
#define LIKWID_MARKER_START(regionTag)
#define LIKWID_MARKER_STOP(regionTag)
#define LIKWID_MARKER_CLOSE
#define LIKWID_MARKER_GET(regionTag, nevents, events, time, count)
#endifLIKWID_MARKER_INIT;
LIKWID_MARKER_THREADINIT;LIKWID_MARKER_START("Compute");
// Your code to measure
LIKWID_MARKER_STOP("Compute");
LIKWID_MARKER_CLOSE;

对于并行代码,从程序的串行部分调用以下函数序列非常重要:

LIKWID_MARKER_INIT;
[...]
LIKWID_MARKER_CLOSE;

如果将 Marker API 和 likwid-accessD 一起使用,高度建议在每个想测量的代码段执行下面的代码,参数是标识符

LIKWID_MARKER_REGISTER(string);

这将创建基本结构,并建立与守护进程的链接,如果不这样做,当代码只运行很短一段时间时,代码中第一个区域的值将会是 off/lower。

为了方便,还有一个简单的API来固定代码的或进程并获取处理器ID。

likwid_pinProcess(int processorId);
likwid_pinThread(int processorId);
likwid_getProcessorId();

LIKWID 从 4.0.0 版本开始引入了一些新 Marker API 调用:在多个事件集之间切换 (相比于其它API会产生更多开销):

LIKWID_MARKER_SWITCH;

另外,如果你想减少 LIKWID_MARKER_START 的开销,可以实现给代码段注册名字。这会避免串行创建哈希表,引发时间问题。虽然可选,但是高度推荐!

LIKWID_MARKER_REGISTER("Compute")

如果要在应用程序内部处理汇总的测量值,执行:

LIKWID_MARKER_GET("Compute", nevents, events, time, count)

其中neventsint*,定义了给定数组 events (类型是 double*) 的长度,并会在函数返回时被填上数据。time 的类型是 double*count 的类型是 int*.

注意:在区域标签内不允许使用空白字符!

如果想重置一个区域中计数器的值,使用:(在 4.3.3 及以后的版本中可用)

LIKWID_MARKER_RESET("Compute")

该调用必须由每个线程执行,以重置自己的值。

为了使用工具运行可执行文件,你要用 -m 选项激活 likwid-perfctr 的 Marker API:

$ likwid-perfctr -C 0-3 -g BRANCH -m ./a.out

由于CPU列表和事件集是提供给 likwid-perfctr 的而不是编译到程序中的,因此无需修改可执行程序本身就能测量,很灵活。

注意:每个线程分别读取计数器,因此当一个线程的工作量较少时,它会在其它线程之前读取计数器。在低负载线程是读取Uncore计数器的线程时,这个现象很重要。Uncore 计数器是基于特定CPU插槽的。Likwid通常使用一个CPU插槽的亲和性列表中的第一个硬件线程。例如有2个插槽0,1,2,3和4,5,6,7,并且在1,2,3,5,6,7上运行程序,1和5会被用于测量 Uncore 计数器。因此,他们执行用户代码会有延迟,等到他们开始执行用户代码时,可能其它线程开始了某些迭代。

例如:你想用多个线程执行读取内存数据的循环,当负责读取Uncore计数器的线程还在读取已停止的计数器,其它线程已经从内存中加载或向内存中保存了数据。此数据块未被计算在内,因此内存数据量将低于预期。

如果要精确测量,请使用barrier或有条件的等待来同步线程。

我们正在考虑提供MarkerAPI调用,其中包括barriers及一些环境变量,在所有MarkerAPI调用中激活barrier。

在 Fortran 90 中使用 Marker API

可以在 Fortran 90 中使用 LIKWID Marker API 的原生接口。必须在 config.mk 文件中启用,默认不启用。如果启用它,则会设置 Intel Fortran 编译器标志。要改为 gfortran ,编辑 ./make/include_GCC.mk 用相应的标志设置 gfortran 。必须注意 fortran 接口模块 likwid.mod 在你的模块的 include path 中,并且要与 likwid 库连接。

对于 Intel fortran 编译器,看起来像下面这样:

$ ifort -I<PATH_TO_LIKWID>/include -O3 -o fortran chaos.F90 -L<PATH_TO_LIKWID>/lib -llikwid  -lpthread -lm -DLIKWID_PERFMON

下面的例子展示了如何在测试目录(chaos.F90)和示例目录(F-markerAPI.F90)中的 Fortran 中使用 Marker API:

call likwid_markerInit()
call likwid_markerThreadInit()call likwid_markerStartRegion("sub")
! Do stuff
call likwid_markerStopRegion("sub")call likwid_markerClose()

C Marker API 中的所有函数都可用于 Fortran 90,包括 likwid_markerRegisterRegionlikwid_markerNextGrouplikwid_markerGetRegion

中间 Marker API 文件的语法

当检测到代码关闭 Marker API 时,它会将结果写入磁盘。默认是 /tmp 文件夹,通用文件名是 likwid_<PID_OF_PERFCTR>.txt。文件语法如下:

<nrThreads> <nrRegions> <nrGroups>
<regionID_1>:<regionName_1>
[...]
<regionID_n>:<regionName_n>
<regionID_1> <groupID> <cpuID_1> <callCount> <regionTime> <nrEvents> <event1> <event2> ... <eventM_g>
<regionID_1> <groupID> <cpuID_2> <callCount> <regionTime> <nrEvents> <event1> <event2> ... <eventM_g>
[...]
<regionID_n> <groupID> <cpuID_L-1> <callCount> <regionTime> <nrEvents> <event1> <event2> ... <eventM_g>
<regionID_n> <groupID> <cpuID_L> <callCount> <regionTime> <nrEvents> <event1> <event2> ... <eventM_g>

其它编程语言的 Marker API

LIKWID 团队现在不打算为其它语言提供 Marker API。但由于LIKWID是开源的,每个人都可以为他喜欢的语言创建模块。以下是为其它语言提供API的项目列表:

  • Java: https://github.com/jlewandowski/likwid-java-api
  • Python: https://github.com/RRZE-HPC/pylikwid

自定义性能组

在LIKWID最近的版本中,很容易新定义或修改性能组。所有的组都是根据$HOME/.likwid/groups/ARCH/目录中的文本文件指定的,其中ARCH是处理器微体系结构的缩写。你可以通过运行 likwid-perfctr -i 获得缩写 (自5.11.2015版本开始)。添加新组或更改现有组就是修改文本文件,下面的示例说明了格式:

SHORT Double Precision MFlops/sEVENTSET
FIXC0 INSTR_RETIRED_ANY
FIXC1 CPU_CLK_UNHALTED_CORE
PMC0  FP_COMP_OPS_EXE_SSE_FP_PACKED
PMC1  FP_COMP_OPS_EXE_SSE_FP_SCALAR
PMC2  FP_COMP_OPS_EXE_SSE_SINGLE_PRECISION
PMC3  FP_COMP_OPS_EXE_SSE_DOUBLE_PRECISIONMETRICS
Runtime [s](s]) FIXC1*inverseClock
CPI  FIXC1/FIXC0
DP MFlops/s (DP assumed) 1.0E-06*(PMC0*2.0+PMC1)/time
Packed MUOPS/s   1.0E-06*PMC0/time
Scalar MUOPS/s 1.0E-06*PMC1/time
SP MUOPS/s 1.0E-06*PMC2/time
DP MUOPS/s 1.0E-06*PMC3/timeLONG
Double Precision MFlops/s

语句的顺序很重要。第一个标记是该组的 简短 描述。后面是要测量的事件列表,LIKWID会在初始化时跳过不存在的计数器。首先是性能计数器寄存器,然后是用空格分开事件。支持的事件可以从-e选项打印的列表中获取。 你可以指定事件的更多选项,通过把他们添加到寄存器定义中 :OPT1=VAL1:OPT2=VAL2 。在 METRICS 标签后面,是一个要计算的指标的列表,一行一个指标。每个指标都由一个公式(无空格)和一个简短说明(会出现的表格中)组成。公式要遵循C语法。可以在度量标准中使用的预设变量是 time(表示运行时间) 和inverseClock (表示当前处理器的逆时钟)。由于性能组是用 Lua 解释的,不用再重新编译 LIKWID 了。

通过提交 https://github.com/RRZE-HPC/likwid/commit/4849571d833315c96e2e14c8e16ea1a222587730,我们添加了一个额外的文件夹,用于检查性能组文件。由于每个用户都可以创建自己的性能组,因此 LIKWID 现在还会检查文件夹 $HOME/.likwid/groups/ARCH。

通过提交 https://github.com/RRZE-HPC/likwid/commit/75bb5737f039c0bf739ebfe728f78768d5748eeb 和 https://github.com/RRZE-HPC/likwid/commit/88dedc39e02d3b7e171503807836a1d70f1b13ec 我们将内部计算器改为Lua,从这些提交开始,你不需要在指标公式中指定事件选项,为了反映这一点,所有性能组都进行了修改。

时间线模式

likwid-perfctr 允许测量时间解析的配置文件。通过

$ likwid-perfctr -c N:0-7 -g BRANCH -t 2s > out.txt

你可以每2秒测量一次CPU内核0-7上机器的分支行为。这意味着计数器运行会被每两秒执行一次,这以轻量方式实现,输出到 stderr。具有自定义事件集的时间线模式的语法是:

<groupID> <numberOfEvents> <numberOfThreads> <Timestamp> <Event1_Thread1> <Event1_Thread2> ... <EventN_ThreadN>

对于自定义事件集和性能组,时间线模式的输出是不同的。对于自定义事件集, EventX 指的是事件X的原始次数,而对于性能组 EventX 指的是 MetricX,因此列出了不同线程的指标。通常在使用性能组时,人们对指标和原始计数更感兴趣,因此我们更改了行为。因此,对于性能组:

<groupID> <numberOfEvents> <numberOfThreads> <Timestamp> <Metric1_Thread1> <Metric1_Thread2> ... <MetricN_ThreadN>

可以用命令行设置多个事件集。在每个测量周期后,事件集将以循环方式切换到下一个时间集。请注意,当你希望每2s读取一次具有多个事件集的数据时,需要每隔 2*<numberOfEventSets> 秒执行一次读取。

注意:尽管LIKWID允许微秒级别的测量,仍有几点需要考虑。测试表明对于低于100毫秒的测量,周期打印的结果不再有效 (高于预期),但结果的行为仍然有效。例如,如果你想解决突发内存传输的问题,则需要小间隔的结果。每次测量的内存带宽可能高于预期,甚至可能高于机器的理论最大值,但是通过内存带宽结果的高低可以清楚地识别突发流量和非突发流量。

听诊器模式

likwid-perfctr 允许监听特定时间发生的事情。如果你要查看长期运行的应用程序在性能方面的表现,这将很有用。我们使用它来分析MPI代码,而我们可能无法访问该代码。像likwid-agent一样,听诊器模式也适用于监视。注意不要过分依赖这些测量,因为您不知道代码实际上在做什么,所以可能导致结果不稳定,具体取决于测量的时间段。但是仍然可以让你了解基本性能属性情况。

监视前8个处理器上的分支行为10秒钟:

$ likwid-perfctr -c N:0-7 -g BRANCH  -S 10s

输出过滤

可以使用选项 -o 指定输出到文件。如下一节所述,文件名可以包含占位符例如 PID (进程ID) 或 MPI rank。你还必须提供文件扩展名,LIKWID 输出子系统在这里发挥作用。LIKWID 支持通用文本和CSV格式。如果指定 .txt 作为后缀,则原始文本将输出至此文件。如果指定另一个后缀,likwid-perfctr将CSV输出到一个临时文件,并根据后缀名称调用脚本转换成任意格式或进行结果过滤。在LIKWID树中,所有的过滤器都放在 filters 文件夹中。目前只有用于XML和JSON输出的过滤器。你可以通过向该目录添加新脚本来添加其它输出过滤器。我的脚本使用Perl,您也可以用其他脚本语言。如果找不到过滤器脚本,则将临时文件重命名为所需文件。

这使你可以定制likwid-perfctr的输出,使其完全适应您的工具链。还有一个开关(-O)可以直接生成CSV而无需调用脚本。如果将likwid-perctr作为监视后端,这会很有用。

将likwid-perfctr用于MPI程序

注意: likwid-mpirun 提供了一个更简单的接口用于测量MPI和混合应用程序的硬件性能计数器。

为了将likwid-perfctr用于MPI程序,最重要的问题是关注要将进程固定在哪些内核上,并告诉likwid-perfctr哪个内核属于哪些进程。现在的方法是用任务集固定MPI进程,并使用 -c N:0 符号调用 likwid-perfctr,以在此CPU集合中使用逻辑固定。为了区分多个进程的输出,-o选项允许输出所有结果到文件。

下面的占位符可以用于输出文件名:

  • %j - 环境变量 PBS_JOBID
  • %r - MPI Rank for Intel MPI (env var PMI_RANK) and OpenMPI (env var OMPI_COMM_WORLD_RANK)
  • %h - 主机名
  • %p - 进程 ID (PID)

输出文件名指定为:

$ mpiexec -np <numberofProcesses> likwid-perfctr -c L:N:0 -g BRANCH -o test_%h_%p.txt  ./a.out

有关LIKWID和MPI组合的更详细的说明,参见这里。

在likwid-perfctr中使用perf_event后端

在编译 LIKWID 之前,将config.mk 中的USE_PERF_EVENT 设置为 true。这将禁用 LIKWID 本机的后端并集成 perf_event。在初始化文件 /proc/sys/kernel/perf_event_paranoid 时,会检查某些函数,一些函数仅限于执行偏执值允许的操作:

  • -1 - 允许测量整个CPU,而不仅仅是特定的PID。允许读取 Uncore 计数器。LIKWID不支持读取原始追踪点的附加功能,因此不要设置成 0.
  • 0 - 允许测量整个CPU,而不仅仅是特定的PID。允许读取 Uncore 计数器。
  • 1 - 允许对PID进行测量,已识别已启动的应用程序。不允许读取 Uncore!
  • 2 - 允许对PID进行测量,已识别已启动的应用程序。 (只包括用户空间). 不允许读取 Uncore!

对于偏执等级 12需要在命令行中设置 --execpid 选项,以确保仅测量启动的应用程序。对于 0-1,可以忽略 --execpid 选项以测量所选CPU的一切。(正如LIKWID的默认后端那样)

可以在命令行选项中设置 --perfflags 为 perf_event 定义标志。

当前不支持选项,因为需要LIKWID选项名称到perf_event选项名称的转换表。

如果要测量某些其他应用程序,则可以使用命令行选项--perfpid

使用 Nvidia GPU 后端

在 LIKWID 5.0 中引入了 Nvidia GPU 后端,允许使用GPU MarkerAPI测量单个内核,以后会允许所有内核。为了正常工作,CUDA 和 CUPTI 必须在 $LD_LIBRARY_PATH 中。可以通过运行 likwid-topology 查看是否输出了你的GPU检测有效性。

注意: 当前,LIKWID使用的CUPTI Event API已被弃用,因此不能在比Nvidia Volta更新的GPU芯片上使用。对于Volta、Turing 和更高版本,应该会有 Nvidia PerfWorks API,但是还没有公开发布

使用 GENERIC_EVENT

在LIKWID 5.0中存在一个名为 GENERIC_EVENT 的新事件,适用于所有支持的寄存器类型。有时,时间定义不是事件名称而是而是16禁止的配置寄存器设置,整个寄存器0x437805 的一个值或用逗号分隔的字段 config=0x05,umask=0x78。对于这种情况,可以用 GENERIC_EVENTGENERIC_EVENT:<COUNTER>:CONFIG=0x05:UMASK=0x78<COUNTER> 告诉LIKWID使用哪个单位和计数器。如果 <COUNTER> 提供了额外的选项比如 THRESHOLDEDGEDETECT,也可以使用这些选项。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Django学习 day57之Django第三日

    Django第三日【知识储备】静态文件配置的本质细节知识创建步骤一 登录功能&#xff0c;连接mysql路由视图函数模板文件login.html模板文件index2.html二 MTV与MVC三 django请求生命周期图知识储备四 虚拟环境讲解&#xff0c;pycharm配置五 orm概述七 django中orm的使用【知识储…...

    2024/5/9 12:40:31
  2. recently----me

    HTML/HTML5 CSS/CSS3 javascript jQuery Bootstrap XMLXPath Servlet: Servlet/GenericServlet/HttpServlet; Servlet生命周期&#xff1b; Http协议剖析; GET和POST的区别; 转发和重定向; Cookie; Session; Servlet规范中常用接口的讲解Jsp: Jsp本质; Jsp和Servlet的区别以及…...

    2024/5/9 14:35:41
  3. 1248:Dungeon Master

    【题目描述】 这题是一个三维的迷宫题目&#xff0c;其中用‘.’表示空地&#xff0c;‘#’表示障碍物&#xff0c;‘S’表示起点&#xff0c;‘E’表示终点&#xff0c;求从起点到终点的最小移动次数&#xff0c;解法和二维的类似&#xff0c;只是在行动时除了东南西北移动外…...

    2024/4/23 23:55:12
  4. WIN10解决系统更新问题

    1.解决Windows Update Medic Service拒绝访问 我自己的win10更新出现了蓝屏的现象&#xff0c;在重装了系统之后&#xff0c;为了避免同样的问题&#xff0c;打算关闭win10更新&#xff0c;但是发现Windows Update Medic Service无法禁用&#xff0c;提示拒绝访问&#xff0c;…...

    2024/4/27 18:15:29
  5. Cannot access androidx.lifecycle.HasDefaultViewModelProviderFactory

    报错“Cannot access androidx.lifecycle.HasDefaultViewModelProviderFactory” 可正常运行 解决方法&#xff1a; 添加库&#xff1a; implementation androidx.lifecycle:lifecycle-extensions:2.2.0 implementation androidx.lifecycle:lifecycle-runtime:2.2.0或者更新…...

    2024/5/9 14:12:49
  6. CCF 201512-2 消除类游戏(Python100分)

    CCF历届真题 部分题解 &#xff0c;点击进入 问题描述 试题编号&#xff1a;201512-2试题名称&#xff1a;消除类游戏时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述   消除类游戏是深受大众欢迎的一种游戏&#xff0c;游戏在一个包含…...

    2024/4/23 7:12:02
  7. 【c++】int在内存中的存储形式:补码

    一、取值范围 类型名称占字节数取值范围int4B(−231)(-2^{31})(−231) ~ (231−1)(2^{31}-1)(231−1)unsigned int4B000 ~ 2322^{32}232 二、原码、反码、补码 正数&#xff1a;原码 反码 补码 十进制原码反码补码70000,0111B0000,0111B0000,0111B 负数&#xff1a;补码 反…...

    2024/4/23 21:12:27
  8. 靶机渗透测试(IMF)

    靶机渗透测试&#xff08;IMF&#xff09;&#xff1a; Vulnhub靶机 IMF 靶机&#xff1a;修改靶机的网络配置为桥接模式。 攻击机&#xff1a;Kali虚拟机&#xff0c;同样使用桥接模式&#xff0c;即可访问靶机。 靶机难度&#xff1a;&#xff08;Beginner/Moderate&#xf…...

    2024/5/7 3:34:02
  9. 2^k进制数

    题目描述 设r是个2^k 进制数&#xff0c;并满足以下条件&#xff1a; &#xff08;1&#xff09;r至少是个2位的2^k 进制数。 &#xff08;2&#xff09;作为2^k 进制数&#xff0c;除最后一位外&#xff0c;r的每一位严格小于它右边相邻的那一位。 &#xff08;3&#xff09;…...

    2024/4/28 1:23:15
  10. 什么情况下,方法区中的类才会被回收?

    该类所对应的所有实例对象都已经被回收了&#xff0c;Java堆中已经不存在该类的实例对象了。加载该类的类加载器ClassLoader已经被回收了。该类的Class对象没有任何引用。...

    2024/4/24 14:45:26
  11. pandas 分层索引(多级索引)

    import pandas as pd import os os.chdir(rC:\Users\Hans\Desktop\data_analysis) df pd.read_excel(pandas_multiindex.xls) df.head()日期收盘开盘高低交易量涨跌幅公司02020年5月27日201.18202.64202.64196.7723.61M-0.0027BABA12020年5月26日201.72205.96206.69201.1628…...

    2024/5/9 17:04:32
  12. MySQL安装及基本使用教程

    一、下载MySQL 首先&#xff0c;去数据库的官网http://www.mysql.com下载MySQL。 点击进入后的首页如下&#xff1a; 然后点击downloads&#xff0c;community&#xff0c;选择MySQL Community Server。如下图&#xff1a; 滑到下面&#xff0c;找到Recommended Download…...

    2024/5/8 22:05:35
  13. 云计算运维学习---rsync服务常见问题汇总

    这些问题是从一个学习资料中截取过来的&#xff0c;仅供大家参考...

    2024/5/9 11:05:04
  14. pandas 单列排序&多列排序

    import pandas as pd import os os.chdir(rC:\Users\Hans\Desktop\data_analysis) df pd.read_excel(pandas_multiindex.xls) df.head()日期收盘开盘高低交易量涨跌幅公司02020年5月27日201.18202.64202.64196.7723.61M-0.0027BABA12020年5月26日201.72205.96206.69201.1628…...

    2024/5/9 10:34:33
  15. Codeforces Round #673 (Div. 2)

    A. Copy-paste 题意&#xff1a; 给你一个数组和一个限定值 kkk&#xff0c;你可以进行法术使得&#xff1a; 当1≤i,j≤n1≤i,j≤n1≤i,j≤n andandand i≠ji ≠ ji​j 让 aj:ajaia_j : a_j a_iaj​:aj​ai​ 。 当进行法术操作使得其中有一个元素超过限定值 kkk 时&…...

    2024/4/23 10:06:59
  16. linux上使用ftdi的串口芯片,D2XX for Linux,出现ftdi d2xx与linux上的ftdi_sio冲突问题

    智科创玩写在前面1.问题概述2.解决方法2.1 查看VCP串口信息2.2 查看驱动信息写在前面 声明&#xff1a;笔者使用的ARM平台是orangepi4平台,Ubuntu,aarch64&#xff0c;D2XX Drivers &#xff1a;libftd2xx-arm-v8-1.4.8。 x64平台分别是:台式电脑和笔记本电脑&#xff0c;Ubun…...

    2024/4/27 6:42:01
  17. Codeforces Round #674 (Div. 3) D

    声明:本文学习自其他博客,原文链接 https://blog.csdn.net/qq_45585519/article/details/108861503. D 题目链接: https://codeforces.ml/contest/1426/problem/D. 题目描述: D. Non-zero Segments time limit per test2 seconds memory limit per test256 megabytes inputst…...

    2024/4/27 2:04:56
  18. pandas 同时加条件筛选和赋值

    import pandas as pd import os os.chdir(rC:\Users\Hans\Desktop\data_analysis\test_data) df pd.read_csv(reslut.csv,encodinggbk) df.head()日期收盘开盘高低百分比变化量02018年8月2日19,897.5019,875.0019,922.5019,815.000.71%12018年8月1日19,757.5019,942.5020,03…...

    2024/4/26 22:19:12
  19. C. Lose it!(思维)Codeforces Round #565 (Div. 3)

    原题链接&#xff1a; https://codeforces.com/contest/1176/problem/C 测试样例 input 5 4 8 15 16 23 output 5 input 12 4 8 4 15 16 8 23 15 16 42 23 42 output 0 input 15 4 8 4 8 15 16 8 16 23 15 16 4 42 23 42 output 3 题意&#xff1a; 给你一个长度为nnn的数组&am…...

    2024/4/24 7:29:44
  20. 数据结构:8皇后问题代码实现(递归回溯)

    package data; public class queen {public static void main(String[] args) {queen8 qnew queen8();q.check(0);System.out.println(q.c);} } class queen8 {int[] queen8 new int[8];//[0,0,0,0,0,0,0,0];static int c0;//输出结果public void print() {for (int i 0; i &…...

    2024/4/23 18:43:19

最新文章

  1. 三勾软件 / 三勾点餐系统门店系统,java+springboot+vue3

    项目介绍 三勾点餐系统基于javaspringbootelement-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 在…...

    2024/5/9 18:30:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. Docker Desktop+WSL2安装到自定义路径

    现在大多数软件实在太“流氓”了&#xff0c;在安装过程中&#xff0c;根本不让你选择安装路径&#xff0c;默认安装到$HOME下&#xff08;windows C盘&#xff09;&#xff0c;随着软件的使用增多&#xff0c;可能磁盘空间不够&#xff0c;这个时候就想着&#xff0c;看看某些…...

    2024/5/8 5:04:44
  4. Golang Gin框架

    1、这篇文章我们简要讨论一些Gin框架 主要是给大家一个基本概念 1、Gin主要是分为路由和中间件部分。 Gin底层使用的是net/http的逻辑&#xff0c;net/http主要是说&#xff0c;当来一个网络请求时&#xff0c;go func开启另一个协程去处理后续(类似epoll)。 然后主协程持续…...

    2024/5/9 17:34:50
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/8 19:32:33
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/9 7:40:42
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/9 2:44:26
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/8 20:33:13
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/9 3:15:57
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/9 5:40:03
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/9 7:40:40
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/8 20:58:56
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/9 1:35:21
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/9 4:12:16
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/9 7:40:35
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/8 18:06:50
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/9 7:40:34
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/9 1:42:21
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/9 5:02:59
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/9 4:31:45
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/9 16:54:42
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/8 9:51:44
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/9 6:36:49
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/9 4:33:29
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57