2013-05-28 6 views
0

Вот мой код:избежать одновременного доступа к переменной

main.cpp

#include <header.h> 
#include <Eigen/Dense> 

int main{ 

    int result(100); 
    VectR M(100) = something; // VectR defined in header.h 
    VectR N(100) = something else; 

    #pragma omp parallel private(var,i,R) shared(M,N,result) 
    { 
     #pragma omp for 
     for(int i = 0 ; i < 100 ; ++i){ 
      result(i) = somefunction(M,N(i)); 
     } 
    } 
} 

somefunction, определенный в другом файле, нужно будет читать (но не писать) весь вектор M ,

header.h:

#include <Eigen/Dense> 
using namespace Eigen; 

typedef double REAL; 
typedef Eigen::Matrix<REAL, Eigen::Dynamic, 1> VectR; 

int somefunction(const VectorR&, const VectorR&) 

Как избежать несколько потоков от доступа данного элемента M в somefunction в то же время? Некоторые мысли:

  1. Может/нужно просто поставить #pragma omp critical или atomic директивы непосредственно в файле somefunction где M читается?
  2. Моя первоначальная идея состояла в том, чтобы дать каждой теме свою полную полную версию M по пункту firstprivate(M) в директиве parallel. Тем не менее, я получаю следующее сообщение об ошибке при компиляции:

    main.cpp: In function âint somefunction(const VectorR&, const VectorR&)â:

    main.cpp:xx: error: âMâ has reference type for âfirstprivateâ

ответ

1

В чем проблема? У вас хуже производительность с OpenMP, чем без? OpenMP имеет накладные расходы, поэтому, если somefunction работает быстро, и вы используете только 100 элементов, то OpenMP может дать худшую производительность.

Я не вижу проблемы с каждой нитью, обращающейся к М. До тех пор, пока somefucntion не записывается в M или N (только из них читается), проблем не должно быть.

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

+0

Не одновременно читает данный элемент общей переменной 'M' проблематично? Кроме того, я забыл поставить 'result' в' shared' (отредактированный код). – lodhb

+0

Нет, их не должно быть. Каждый протектор вытаскивает значения из M в свой собственный кеш. В этом случае вам не нужно указывать какие-либо общие или частные переменные. Переменные, определенные за пределами параллельного блока, неявно разделяются, а переменные, определенные внутри параллельного блока, являются неявно частными. Есть моменты, когда вы хотите явно определить их, но не в вашем случае. –

+0

А потом, наверное, у меня нет проблем! Спасибо за вашу помощь. P.S. Мне сказали, что явное объявление каждой переменной в предложениях о совместном использовании данных является хорошей практикой (по крайней мере, для начинающих программистов). – lodhb

Смежные вопросы