2

私は、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 プログラマーの回復) を使用するのが初めてなので、「オフロードできるもの」の境界を完全には理解していません。

4

1 に答える 1

3

次のようなものが必要です:

void __attribute__((target(mic))) computeIntensiveFunction(std::vector<sometype> myvar);

ソースで定義されています。これにより、オフロード領域から呼び出すことができるように、MIC 側の関数が定義されます。

于 2013-06-07T17:04:53.010 に答える