在没有sudo权限的计算机上分析与OpenMP并行化的C ++程序的最简单方法是什么?
答案 0 :(得分:6)
我建议使用英特尔VTune Amplifier XE分析器。
Basic Hotspots分析不需要root权限,您甚至可以安装它而不需要sudoers。
对于OpenMP分析,最好使用Intel OpenMP实现进行编译,并在运行配置文件会话之前将环境变量KMP_FORKJOIN_FRAMES设置为1。这将使工具能够将每个平行区域的叉点到连接点的时间区域可视化。这可以很好地了解你有足够的并行性和你没有的地方。通过使用帧域/帧类型/功能等网格分组,您还可以将并行区域与CPU上发生的事情相关联,从而可以找到无法扩展的功能。
例如,假设一个简单的代码运行一些平衡的工作,然后一些连续工作,然后一些不平衡的工作调用delay()函数所有这些确保delay()不内联。这模仿了一个真实的工作负载,可以从并行区域调用各种不熟悉的函数,通过查看热函数简介来分析并行性是好还是坏:
void __attribute__ ((noinline)) balanced_work() {
printf("Starting ideal parallel\n");
#pragma omp parallel
delay(3000000);
}
void __attribute__ ((noinline)) serial_work() {
printf("Starting serial work\n");
delay(3000000);
}
void __attribute__ ((noinline)) imbalanced_work() {
printf("Starting parallel with imbalance\n");
#pragma omp parallel
{
int mythread = omp_get_thread_num();
int nthreads = omp_get_num_threads();
delay(1000000);
printf("First barrier %d\n", mythread);
#pragma omp barrier
delay(mythread * 25000 + 200000);
printf("Second barrier %d\n", mythread);
#pragma omp barrier
delay((nthreads - 1 - mythread) * 25000 + 200000);
printf("Join barrier %d\n", mythread);
}
}
int
main(int argc, char **argv)
{
setvbuf(stdout, NULL, _IONBF, 0);
calibrate();
balanced_work();
serial_work();
imbalanced_work();
printf("Bye bye\n");
}
对于此代码,典型的函数配置文件将显示在delay()函数中花费的大部分时间。另一方面,使用VTune中的帧分组和CPU使用信息查看数据将了解什么是串行,什么是不平衡以及什么是平衡。以下是您可能会在VTune中看到的内容:
在这里可以看到:
希望这有帮助。