我正在做一项大学工作,使用OpenMP并行化C代码,然后使用eztrace获取运行时映像,转换并在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个线程),每个线程获得一个“有组织”的迭代范围:
也就是说,线程3捕获了需要更多时间的迭代。但这种闲散并没有在风筝中显示出来。为什么呢?
这里我是如何执行,转换和展示风筝的:
eztrace -t omp ./programa
eztrace_convert -t PAJE /tmp/rafael_eztrace_log_rank_1
vite eztrace_output.trace
答案 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)