2016-09-10 6 views
6
void random(int M,int a,int c,int *seq,int start,int size) 
{ 
int i = start; 
seq[0] = 1; 
seq[i] = (a * seq[i - size] + c) % M; 
i += size; 
} 

for(int iter = 0;iter < ceil((double)(n/size));iter++) 
{  
    random(M,a,c,seq,1,1);  
} 

ループは「無効制御述語」エラーが発生します。 それを解決するには?がで-fopenmpコンパイル時にエラー「述語を制御無効」<code>-fopenmp</code>と<code>gcc</code>でコンパイルさ

+0

は 'はceil()は、n /サイズ()(ダブル)'整数ではないでしょうか?私は「型として」を意味します。そして '(ダブル)(N /サイズ) 'N'と' size'が整数である場合、 '便利なものを達成することはありません... –

+0

は[、最小完全、かつ検証例]を投稿します(httpてください:// stackoverflowの。 com/help/mcve)。 – MikeCAT

答えて

4

は、したがって、または-fopenmpがそれに影響を与えるべきではありませんせずにコンパイルし、示されたコードにはOpenMPの構文はありません。しかし、[parallel] for構成があった場合は、ceil()のタイプがdoubleであり、OpenMPはループ内に整数型しか許可しないため、失敗します。

あなたはceil()から整数に結果を強制する必要があります。

#pragma omp parallel for 
for(int iter = 0; iter < (int)ceil((double)n/size); iter++) 
{  
    random(M,a,c,seq,1,1); 
} 
2

私は私が正しく(私は それを実行しようとしませんでした)コンパイルすることができ、あなたのコードの例を生産しています。

私は(-lmリンカオプションを注意してください)以下のコマンドでコンパイルすることができます

gcc -fopenmp <<example_name>>.c -lm 

コードがあります。

#include <math.h> 

int n = 1; 
int size = 2; 
int M, a, c; 
int *seq; 

void random(int M,int a,int c,int *seq,int start,int size) 
{ 
    int i = start; 
    seq[0] = 1; 
    seq[i] = (a * seq[i - size] + c) % M; 
    i += size; 
} 

int main() 
{ 
    double iter = 0; 
    for(;iter < ceil((double)(n/size));iter++) 
    {  
     random(M,a,c,seq,1,1);  
    } 
    return 0; 
} 
+1

このコードにはOpenMP構造体が含まれていないため、 '-fopenmp'でコンパイルされます。元の投稿には重要な情報が欠落しています。おそらく '#pragma omp parallel for'行です。 –

関連する問題