私は、C++/OpenMP コードで実装されたシステムを使用しており、STL とEigenのデータ構造をいたるところで使用しています。アルゴリズム的には、このコードは、新しい Intel MIC ( Xeon Phi ) カードによる高速化の有力な候補のようです。
コード内の典型的な並列ループは次のようになります。
#pragma omp parallel for private(i)
for (i = 0; i < n; ++i) {
computeIntensiveFunction(some_STL_or_eigen_container[i]);
上記の疑似コードは妥当なパフォーマンスで実行されますが、その一部を Xeon Phi カードにオフロードするとよいでしょう。これを行う私の試みは次のとおりです。
#pragma offload target (mic) // <---- NEW
#pragma omp parallel for private(i)
for (i = 0; i < n; ++i) {
computeIntensiveFunction(some_STL_or_eigen_container[i]);
ただし、インテル ICC/ICPC コンパイラーは次のようなエラーを吐き出します: STL またはEigenerror: function "computeIntensiveFunction" called in offload region must have been declared with compatible "target" attribute.
を含む関数およびデータ構造に対して、このような苦情が表示されるようです。
これを回避する方法について何か考えはありますか?
私は Xeon Phi (CUDA プログラマーの回復) を使用するのが初めてなので、「オフロードできるもの」の境界を完全には理解していません。