組込み関数のオフロード実行について | インテル Xeon Phi 開発者フォーラム | フォーラム

iSUS に投稿されている記事の内容や、IA プラットフォーム上でのソフトウェア開発に関するトピックを開発者同士でディスカッションできる場としてフォーラムを公開しています。

運営ルールはフォーラムの利用案内をご覧ください。
フォーラムの使い方はこちら

 
フォーラムに投稿するにはログインが必要ですログイン

組込み関数のオフロード実行について

メンバー投稿

3:55 PM
2014年9月8日


asoshin

投稿数 3

1

XeonPhi上で組込み関数を使用したいのですが、オフロード形式でコンパイルしようとするとリンクエラーが発生してしまいます。

具体的には下記の様なコードをコンパイルしようとするとエラーが発生します。

#include

int main(void)
{
#pragma offload target(mic:0)
{
__attribute__((aligned(64))) double a[8];
__m512d src;

src = _mm512_load_pd(a);
}

return 0;
}

$ icc -Wall hoge.c -o hoge -offload-option,mic,ld,"-L/usr/linux-k1om-4.7/lib/gcc/x86_64-k1om-linux/4.7.0"
/tmp/iccyNpHnn.o: In function `main':
hoge.c:(.text+0x3e): undefined reference to `_mm512_load_pd'

なお、プラグマ宣言の行をコメントアウトしNative形式でコンパイルすれば問題なくビルドできます。

ご教示いただけますよう、よろしくお願いいたします。

2:22 PM
2014年9月9日


iSUS編集部 – 菅原

投稿数 206

2

asosbin さん

こんにちは。何点か確認させていただけますか?
(1)コンパイラーのバージョンは、いくつでしょうか?
(2)#include の部分には何を指定されていますか?
(3)-offload-option を指定しないでコンパイルするとどうなりますか?

よろしくどうぞ。

4:24 PM
2014年9月9日


asoshin

投稿数 3

3

以下に回答いたします。
(1) icc (ICC) 13.1.3 20130607
(2) immintrin.h
(3) 下記のようにコンパイルしたところ同じようなメッセージが出力されました。
$ icc -Wall hoge.c -o hoge -L/usr/linux-k1om-4.7/lib/gcc/x86_64-k1om-linux/4.7.0
ld: skipping incompatible /usr/linux-k1om-4.7/lib/gcc/x86_64-k1om-linux/4.7.0/libgcc.a when searching for -lgcc
ld: skipping incompatible /usr/linux-k1om-4.7/lib/gcc/x86_64-k1om-linux/4.7.0/libgcc.a when searching for -lgcc
/tmp/iccPSL8Wq.o: In function `main':
hoge.c:(.text+0x8c): undefined reference to `_mm512_load_pd'

よろしくお願いいたします。

5:30 PM
2014年9月10日


iSUS編集部 – 菅原

投稿数 206

4

asosbin さん

icc 14.0.2、MPSS 3.2.3-1、GCC 4.4.6 の環境で試したところ、正しくコンパイルできるようです。最新のコンパイラーは、15.0です。

バージョン13.1と少し古いコンパイラーをお使いのようですが、それ以外に1点気になることがあります。

コンパイラーをインストールされている開発環境には、複数のバージョンの gcc やライブラリーがインストールされていますか? -L リンクオプションを指定されていることと、
ld: skipping incompatible /usr/linux-k1om-4.7/lib/gcc/x86_64-k1om-linux/4.7.0/libgcc.a when searching for -lgcc
のメッセージから複数のバージョンがあるのではないかと推測しました。

インテルコンパイラーをインストールされる際に、システムに既にある gcc とライブラリーのバージョンとの互換性がデフォルトとして設定されます。異なるバージョンのライブラリーを利用されると、エラーが発生する可能性があります。

そこで、-gcc-version=470 (gcc 4.7と互換性を維持する場合)オプションを指定してコンパイル、リンクしてみていただけますでしょうか? 4.6 であれば、460(他のバージョンも同様の規則)を指定します。

よろしくご検討ください。

2:44 PM
2014年9月11日


asoshin

投稿数 3

5

ご回答ありがとうございました。

こちらで試行錯誤した結果、以下のように組込み関数を#ifdef __MIC__セクション内に記述することでオフロード実行をすることが可能となりました。

#include <immintrin.h>

int main(void)
{
#pragma offload target(mic:0)
{
  __attribute__((aligned(64))) double a[8];
  __m512d src;

#ifdef __MIC__
  src = _mm512_load_pd(a);
#endif
}

  return 0;
}

コプロセッサー固有の組込み関数をプロセッサー側でもリンクしようとしていたために、エラーが発生していたものと考えられます。

また、icc 14.0.2の環境ではコンパイルできたとのことですが、オフロードでコンパイルする際の仕組みがバージョン13.1から変わったためコンパイルできたのでしょうか?

よろしくお願いいたします。

4:27 PM
2014年9月11日


iSUS編集部 – 菅原

投稿数 206

6

asoshin さん

確かに offload セクションは、MICが利用できない場合に備えて、CPUコードも生成されるので、エラーも納得できます。

新しいコンパイラーでは、Coreアーキテクチャー向けの AVX-512 コード生成がサポートされるので、コードのコンパイル・リンクが可能になります。バージョン14のコンパイラーも当初は、ドキュメント化されずに機能を実装していたようですが、最終版ではサポートされていました。

これを機会にバージョンアップをご検討ください….

タグはありません