的OpenMP块错误

问题描述:

为什么OpenMP的给我这个错误: -的OpenMP块错误

错误:预期前声明 '{' 令牌

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) 
{ 

#pragma omp parallel 
{ 

int a[100],b[100],c[100]; 
int i =0; 

    for(; i < 100; i++){ 
    a[i] = i; 
    b[i] = i; 
    } 

    #pragma omp parallel for schedule(static,5) 
    { 
    int i = 0; 
     for(; i < 100 ; i++){ // this is the for loop that is referred in the error message 
    c[i] = a[i] + b[i]; 
    } 

    } 

} 

printf("Outside parallel block \n"); 

} 

这样做

int i; 
#pragma omp parallel for schedule(static,5) 
for (i=0;... 
+0

我一直在想这个。我担心的是,如果'我'成为不同线程的共享变量(而不是每个线程的个体)。由于不同的线程写在同一个变量上,结果会不稳定吗? – r3x 2015-07-21 13:21:52

+0

@julianromera是的。这个答案还需要声明'private(i)'以便正确。 – NoseKnowsAll 2015-09-27 22:22:27

第一,第二OpenMP编译指示不应该有一个“并行”的地方;你已经打开了一个平行块,你现在需要分享for循环的工作。

二,你不能有一个通用块的并行;它必须是一个for循环。如果你真的想要一个不同的i比上面使用,这样做:

#pragma omp for schedule(static,5) 
for (int i=0; i < 100; i++) 
{ 
    c[i] = a[i] + b[i]; 
} 

这是一个答案我张贴this问题之前,我意识到这是这一个的副本。因为它以某种方式扩展了这里已经给出的答案,所以我将它收回。

parallel for是合并指令。它将parallelfor组合在一个指令中,可以节省一些空间。

#pragma omp parallel for shared(sum) private(i,j,k) 
... 

基本上是

#pragma omp parallel shared(sum) private(i,j,k) 
{ 
    #pragma omp for 
    ... 
} 

速记符号(在private子句也可以归因于for指令)

由于for指令的语​​法要求它立即跟在之后的是for -loop,相同的语法要求适用于parallel for指令。换句话说,在上面的...只能是for -loop与其相关联的(块)体:

#pragma omp parallel for ... 
for (...) 
{ 
    ... 
} 

具有for -loop内的块是错误的。整个并行区域在一个块内不是。以下是一个完全有效的语法:

{ 
    #pragma omp parallel for ... 
    for (...) 
    { 
     ... 
    } 
}