为什么使用eztrace拍摄的运行时图像不会显示线程的空闲状态?

时间:2015-05-18 05:22:08

标签: c multithreading openmp trace

我正在做一项大学工作,使用OpenMP并行化C代码,然后使用eztrace获取运行时映像,转换并在vite上显示。

但它没有显示线程上的空闲时间。 Visualização com vite
由于使用了静态子句

,我的代码显然空闲了
int prime_v2(int n)
{
  int i;
  int j;
  int prime;
  int total = 0;

  #pragma omp parallel for schedule(static) private(j,prime) shared(total)
  for (i = 2; i <= n; i++)
  {
    prime = 1;
    for (j = 2; j < i; j++)
    {
      if (i % j == 0)
      {
        prime = 0;
        break;
      }
    }
    #pragma omp atomic
    total = total + prime;
  }
  return total;
}

可以看出,随着 i 的增加,增加了内循环迭代的总数,需要更多的时间。

使用静态除法(例如4个线程),每个线程获得一个“有组织”的迭代范围:

  • 主题0: 0~n / 4 - 1
  • 主题1: n / 4~n / 2 - 1
  • 主题2: n / 2~3n / 4 -1
  • 主题3: 3n / 4~n

也就是说,线程3捕获了需要更多时间的迭代。但这种闲散并没有在风筝中显示出来。为什么呢?

这里我是如何执行,转换和展示风筝的:

eztrace -t omp ./programa
eztrace_convert -t PAJE /tmp/rafael_eztrace_log_rank_1
vite eztrace_output.trace

2 个答案:

答案 0 :(得分:1)

您需要使用eztrace_cc编译您的应用程序:而不是使用

进行编译
$ gcc -o programa programa.c -fopenmp

使用

$ eztrace_cc gcc -o programa programa.c -fopenmp

一种简单的方法是修改你的makefile并设置

CC=eztrace_cc gcc

您可以在EZTrace网页上查看OpenMP教程: http://eztrace.gforge.inria.fr/tutorials/tutorial_openmp/

答案 1 :(得分:0)

我的问题在于debian存储库的eztrace版本

我下载了一个旧版本,它的工作正常。 (有些使用二进制eztrace.old)