2016-09-10 15 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);  
} 

Vòng lặp được biên dịch với -fopenmpgcc cho lỗi "vị ngữ kiểm soát không hợp lệ". Cách giải quyết?'vị từ kiểm soát không hợp lệ' lỗi khi được biên dịch với-fopenmp

+0

không nên 'ceil ((double) (n/size)) 'là một số nguyên? Tôi có nghĩa là "như một loại". Và '(double) (n/size)' sẽ không đạt được gì hữu ích nếu 'n' và' size' là số nguyên ... –

+0

Vui lòng đăng một [Minimal, Complete, và Verifiable example] (http: // stackoverflow. com/help/mcve). – MikeCAT

Trả lời

4

Không có cấu trúc OpenMP nào trong mã được hiển thị, do đó việc biên dịch có hoặc không có -fopenmp sẽ không ảnh hưởng đến nó. Nhưng nếu có một cấu trúc [parallel] for, thì nó sẽ thất bại vì loại ceil()double và OpenMP chỉ cho phép các loại số nguyên trong các vòng lặp.

Bạn cần phải ép buộc kết quả từ ceil() đến một số nguyên:

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

Tôi đã tạo một ví dụ từ mã của bạn mà tôi có thể biên dịch chính xác (tôi không cố gắng thực thi nó).

tôi có thể biên dịch nó với lệnh sau đây (xin lưu ý tùy chọn -lm linker):

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

Mã này là;

#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

Mã này không chứa cấu trúc OpenMP và do đó biên dịch với '-fopenmp'. Bài đăng gốc thiếu một số thông tin quan trọng, rất có thể là dòng '#pragma omp song song cho'. –

Các vấn đề liên quan