1. ホーム
  2. c++

[解決済み] OpenMPエラー 述語の制御が無効です [重複]。

2022-02-16 19:13:26

質問

<余談
この質問には、すでにここで回答があります :
クローズド 6年前 .

以下のコードを書いて、openmpを使って並列化しようとしているのですが、コンパイルがうまくいかず、エラーになってしまいます。 無効な制御述語エラー

#pragma omp parallel for schedule(dynamic, 1)
for( ; i+o<N*C && i < C*n; i++ )
       buf[i] = (a[i]-b[i])*(a[i]-b[i]);

どのように解決するのですか?

ループをこのように書き換えれば、うまくいくはずです。

int maxII = min( N*C-o, C*n);
#pragma omp parallel for schedule(dynamic, 1)
for ( int ii=i; ii<maxII; ii++ )
   buf[ii] = (a[ii]-b[ii])*(a[ii]-b[ii]);

OpenMP for Loopは、quot;Canonical Loop Form"で説明されているように、ループに従わなければなりません。 標準2.6章


EDIT "私のコードの何が間違っていたのか説明していただけませんか。

OpenMPの「Canonical Loop Form」(以下、ループ形式)は、基本的に(簡単に言い過ぎました、すみません)そのように要求しています。

  • ループのインデックスが明確に定義されていること。
  • ループの下限は初期化部分で与えられる。
  • は、以下の演算子のいずれかである。 < , <= , > または >= および
  • インクリメントが明確である。

この単純なルールを守るように、あなたのループを書き換えただけです。ほとんどの場合そうなのですが、これはとても簡単でした。