インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

_Cilk_shared と _Cilk_offload の使用規則

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。

_Cilk_shared および _Cilk_offload を正しく使用するには、これらの規則に従ってください。多くの場合、コンパイラーは誤った使用方法に関する診断結果を出力します。

インテル® Cilk™ Plus は古い機能 (非推奨) です。

正しい使用方法

誤った使用方法

この例は、_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);
}