フローグラフ・アナライザーを使用して、アプリケーションの OpenMP* 並列領域、タスク、およびタスクの依存関係をトレース、視覚化、および解析できるようになりました。
フローグラフ・アナライザーの OpenMP* テクノロジーのサポートは実験的であり、現在 2 つのシナリオをカバーしています。
OpenMP* 並列領域が、インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) のフローグラフでに入れ子になっている。このケースでは、フローグラフ・アナライザーは、スレッドごとのタスク実行タイムラインで並列領域の実行を表示します。
次のサンプルコード omp_nested.cpp は、oneTBB フローグラフ内に入れ子になった OpenMP* 構造の例です。
#include "tbb/tbb.h"
#include "tbb/flow_graph.h"
#include<omp.h>
#include <iostream>
using namespace tbb;
using namespace tbb::flow;
int main() {
graph g;
const int size = 20;
continue_node< continue_msg> hello( g,
[]( const continue_msg &) {
std::cout << "Hello\n";
tbb::parallel_for(0, size, 1, [=](int k) {
std::cout << k << "\n"; });
});
continue_node< continue_msg> world( g,
[]( const continue_msg &)
std::cout << " World\n";
#pragma omp parallel for
for (int i=0; i<20; i++) {
std::cout << i <<"\n";
}
}
);
make_edge(hello, world);
hello.try_put(continue_msg());
g.wait_for_all();
return 0;
}
depends 節を使用する OpenMP* task 構造。この場合、フローグラフ・アナライザーはタスクの実行タイムラインで表示され、OpenMP* タスク間の依存関係をグラフキャンバスのグラフとして確認することを可能にする実験的な機能をサポートします。
次のサンプルコード omp_depend.cpp は、OpenMP* タスクの依存関係を示す入門コードです。
#include <omp.h>
#include<iostream>
int main() {
#pragma omp parallel
{
std::string s = "";
#prgma omp single
{
#pragma omp task depend( out: i)
{ s = "hello";
printf("%s", s);
}
#pragma omp task depend( out: s )
{ s = "world";
printf("%s",s);
}
}
}
return 0;
}