openmp для ошибки блока - PullRequest
       6

openmp для ошибки блока

2 голосов
/ 13 февраля 2012

Почему 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");

}

Ответы [ 3 ]

5 голосов
/ 13 февраля 2012

Во-первых, вторая прагма OpenMP не должна иметь в себе «параллели»;вы уже открыли параллельный блок, вам просто нужно поделиться работой цикла for.

Во-вторых, у вас не может быть параллели для включения общего блока;это должно быть для цикла.Если вы действительно хотите использовать i, отличный от того, который использовался выше, выполните:

#pragma omp for schedule(static,5)
for (int i=0; i < 100; i++)
{
    c[i] = a[i] + b[i];
}
2 голосов
/ 28 сентября 2015

Это ответ, который я отправил на этот вопрос, прежде чем я понял, что это дубликат этого. Поскольку это как-то расширяет ответы, которые уже даны здесь, я отвечаю им.

parallel for - это комбинированная директива. Он объединяет parallel и for в одной директиве, что позволяет сэкономить немного места.

#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, такое же требование синтаксиса применяется к директиве parallel for. Другими словами, ... выше может быть только for -циклом со связанным с ним (блоком) телом:

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

Наличие for -петля внутри блока ошибочно. Имея всю параллельную область внутри блока, это не так. Ниже приведен совершенно правильный синтаксис:

{
   #pragma omp parallel for ...
   for (...)
   {
      ...
   }
}
1 голос
/ 13 февраля 2012

Сделай так

int i;
#pragma omp parallel for schedule(static,5)
for (i=0;...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...