Tag: 分支

x86汇编指令执行计数

大家好,我有一个代码,我想找到每个assembly线执行的次数。 我不关心是通过分析还是仿真,但我想要高精度的结果。 我曾经遇到过一个论坛,它提供了一些脚本代码,但我丢失了链接。 任何人都可以帮助我集思广益吗? 问候 编辑 :Okey我想我已经到了一半。 我根据一篇post对英特尔手册3A第16.4.5节提供的BTS(分支跟踪存储)进行了一些研究。 此function提供分支历史记录。 所以现在我需要你的帮助来查找是否有任何开源脚本或工具来执行此操作。 等待检查您的反馈 欢呼=)!

用于C / C ++的JIT优化器

我正在阅读有关JIT优于预编译的优点,其中之一是JIT可以根据实际运行时数据调整分支预测。 现在我在大学写一个编译器已经很久了,但在我看来,在大多数情况下(没有明确的getos),预编译代码也可以实现类似的东西。 请考虑以下代码: test x jne L2: L1: … jmp L3: L2: … L3: 如果我们有一些运行时检测可以看到’jne L2’为真的次数,它可以物理地交换L1:block和L2:block中的所有指令。 当然,它必须知道交换期间任何一个块都没有线程,但这些都是细节…… test x jeq L1: L2: … jmp L3: L1: … L3: 我知道程序代码加载到只读内存等时也存在问题,但这是一个想法。 所以我的问题是,这样的JIT优化是否适用于C / C ++,还是我错过了一些无法做到这一点的根本原因? 那里有C / C ++的JIT优化器吗?

Lcov:无法收集分支机构覆盖率统计数据

我使用lcov在我的项目中创建覆盖信息。 但我只能获得线路覆盖和function覆盖统计信息。 lcov version:1.10, gcov version:4.4.5 我使用的命令是: lcov -d $OSPL_HOME/src -d $OSPL_OUTER_HOME/src -c -o /work/li/log/lcov-raw.info lcov -r /work/li/log/lcov-raw.info “*.ll” “*.yy” “*.yy.c” yaccpar “TAO161*” “/usr/include/*” “*/testsuite/*” -o /work/li/log/lcov.info 在这两个命令之后,我得到的结果是: Deleted 23 files Writing data to /work/li/log/lcov.info Summary coverage rate: lines……: 45.4% (65087 of 143496 lines) functions..: 46.1% (5575 of 12102 functions) **branches…: no data found** 所以没有分支覆盖结果。 […]

C程序对三个命令执行管道

我必须编写一个程序来执行与du |相同的操作 排序| 在命令行的头会做,但我卡住了,我的程序不工作。 现在的输出是112。 并且该程序不会终止。 请帮忙,我不知道该怎么办! int main(void) { int fd[2]; int fd1[2]; int pid; if (pipe(fd) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { case -1: perror(“Fork”); exit(2); case 0: dup2(fd[1], STDOUT_FILENO); close(fd[0]); close(fd[1]); execl(“/usr/bin/du”, “du”, (char *) 0); exit(3); } if (pipe(fd1) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { […]

使用Fork的递归Fibonacci(在C中)

我正在尝试编写一个函数,该函数使用C中的forks从给定的int n递归计算得到的fibonacci数。 这是function规范:如果print为true,则打印它。 否则,将其提供给父进程。 解决方案应该是递归的,它必须为每个调用分叉一个新的子节点。 每个进程应该只调用一次doFib()。 方法签名无法更改。 无法使用辅助函数。 这是我到目前为止根据我对fork的理解所写的内容。 我试图分叉两次,所以我可以产生两个子进程。 一个做fib(n-1),一个做fib(n-2)。 这样我就可以抓住两个结果并将它们组合起来。 static void doFib(int n, int doPrint) { pid_t pid1; pid_t retpid1; int status1; pid_t pid2; pid_t retpid2; int status2; pid = fork(); if (pid == 0) // Child Process 1 { exit(100); // sends 100 to the parent } else if (pid > […]