分析OpenMP并行化的C ++代码

时间:2013-06-29 16:38:18

标签: c++ parallel-processing profiling openmp

在没有sudo权限的计算机上分析与OpenMP并行化的C ++程序的最简单方法是什么?

1 个答案:

答案 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中看到的内容:

OpenMP frames for the sample

在这里可以看到:

  • 当我们执行不平衡区域时,有13.671的经过时间。人们可以看到CPU使用率细分的不平衡。
  • 有3.652的经过时间非常平衡。这里有一些红色时间,这可能是一些系统效应 - 值得在现实案例中进行调查。
  • 然后我也有大约4秒的连续时间。弄清楚它是4秒目前有点棘手 - 你必须从摘要(在我的情况下为21.276)中抽出时间并从中减去13.671和3.652,产生四个。但很容易。

希望这有帮助。