英特尔代码覆盖率:将多个 CI 作业的代码覆盖率与单独构建的可执行文件相结合

问题描述

我们在 GitLab 中设置了持续集成管道来测试我们基于 MPI 的 Fortran 代码。它有两个阶段,构建阶段和测试阶段。测试阶段分为多个同时执行的作业。我现在正在尝试配置测试设置,以便我们还根据测试套件获得代码的整体覆盖率。构建代码和每个测试作业的路径会有所不同,因为相应的作业目录被赋予了特定的 ID。我遇到两个问题:

  1. 在运行测试时,我无法使用构建阶段构建的可执行文件来工作。我用 -prof-gen=srcpos -prof-src-root-cwd 编译代码,认为选项 -prof-src-root-cwd 应该使可执行文件可重定位,但我可以看到 .dyn 文件被写入我构建代码的目录,而不是我测试的目录(参见 { {3}})。相反,我必须在每个单独的测试作业中编译代码。我遇到了这个问题:https://software.intel.com/content/www/us/en/develop/documentation/fortran-compiler-oneapi-dev-guide-and-reference/top/compiler-reference/compiler-options/compiler-option-details/profile-guided-optimization-pgo-options/prof-src-root-cwd-qprof-src-root-cwd.html#prof-src-root-cwd-qprof-src-root-cwd。我尝试发出命令 export INTEL_PROF_DYN_PREFIX=NEW_SRC_ROOT 其中 NEW_SRC_ROOT 是每个作业创建的包含完整存储库和可执行文件的目录的绝对路径。我也尝试使用相对路径。但这对我不起作用。

  2. 为了合并来自单独运行的测试的覆盖率数据,我添加了第三个作业阶段,在那里我收集在每个测试作业中创建的 .dpi 文件。我跑:

profmerge -a pgopti_*.dpi
codecov -txtlcov

其中 pgopti_*.dpi 是从每个测试作业创建的 .dpi 文件(我手动将 $JOB_ID 字符串附加到每个 .dpi 文件)。 codecov 可执行文件需要 .spi 文件,因此我使用从测试作业生成的 .spi 文件之一。但似乎根据我使用的 .spi 文件,我得到了特定测试集的覆盖率,而不是所有测试的总和。

我怀疑这两个问题的根源在于我生成的检测代码不可重定位,因此组合测试覆盖率结果也不是。 .spi 文件似乎链接到特定的构建目录,并且在收集覆盖率数据时,只有特定 .spi 文件的数据包含在覆盖率中。

我正在使用 ifort (IFORT) 19.0.4.243 20190416 版本

在此先感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)