インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
_Cilk_shared および _Cilk_offload を正しく使用するには、これらの規則に従ってください。多くの場合、コンパイラーは誤った使用方法に関する診断結果を出力します。
C++ クラスに適用されると、すべてのメンバー関数は共有され、そのクラス型のすべてのオブジェクトも共有されます。
クラスのスタティック・フィールド。
共有へのポインターから、非共有へのポインターへの割り当て。
共有変数のアドレスを共有ポインターへ割り当て。
_Cilk_offload func で呼び出される関数は、_Cilk_shared 属性を持ち、外部参照が含まれていなければなりません。
_Cilk_offload indirect-call の関数ポインターは、共有へのポインター型でなければなりません。
アドレスを利用する共有関数には外部参照が含まれていなければなりません。
オフロード関数呼び出しに渡されるポインター引数は共有へのポインターでなければなりません。
_Cilk_offload _Cilk_for 内で参照されるグローバル変数には _Cilk_shared 属性が含まれていなければなりません。
_Cilk_offload _Cilk_for から呼び出される関数は共有でなければなりません。
_Cilk_offload _Cilk_for 内で参照されるポインターは共有変数へのポインターでなければなりません。
_Cilk_shared 属性を持つ関数内で参照されるグローバル変数には _Cilk_shared 属性が含まれていなければなりません。
構造体のフィールドに対する _Cilk_shared は許可されていません。
静的変数に対する _Cilk_shared は許可されていません。
関数のローカル変数に対する _Cilk_shared は許可されていません。
非共有へのポインターから共有へのポインターへの割り当ては許可されていません。
この例は、_Cilk_shared の誤った使用方法を示しています。_Cilk_shared オブジェクト mark が関数ローカルに宣言されています。
#pragma offload_attribute(push, _Cilk_shared) #include <vector> #include "tbb/concurrent_vector.h" #pragma offload_attribute(pop, _Cilk_shared) class _Cilk_shared Thing { public: Thing(void) { m_size = 100; } void work(); int m_size; }; void Thing::work() { _Cilk_shared std::vector<bool> mark(m_size); // エラー tbb::concurrent_vector< std::pair<unsigned int, unsigned int> > m_hits(m_size); }
以下の正しい使用方法の例では、オブジェクト mark は静的に割り当てられ、使用方法が少し変更されています。
#include <vector> #include "tbb/concurrent_vector.h" _Cilk_shared std::vector<bool> mark; _Cilk_shared tbb::concurrent_vector< std::pair<unsigned int, unsigned int> > m_hits; class _Cilk_shared Thing { public: Thing(void) { m_size = 100; } void work(); int m_size; }; void Thing::work() { mark.resize(m_size); m_hits.resize(m_size); }