Вот мой код:избежать одновременного доступа к переменной
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
в то же время? Некоторые мысли:
- Может/нужно просто поставить
#pragma omp critical
илиatomic
директивы непосредственно в файлеsomefunction
где M читается? Моя первоначальная идея состояла в том, чтобы дать каждой теме свою полную полную версию
M
по пунктуfirstprivate(M)
в директивеparallel
. Тем не менее, я получаю следующее сообщение об ошибке при компиляции:main.cpp: In function âint somefunction(const VectorR&, const VectorR&)â:
main.cpp:xx: error: âMâ has reference type for âfirstprivateâ
Не одновременно читает данный элемент общей переменной 'M' проблематично? Кроме того, я забыл поставить 'result' в' shared' (отредактированный код). – lodhb
Нет, их не должно быть. Каждый протектор вытаскивает значения из M в свой собственный кеш. В этом случае вам не нужно указывать какие-либо общие или частные переменные. Переменные, определенные за пределами параллельного блока, неявно разделяются, а переменные, определенные внутри параллельного блока, являются неявно частными. Есть моменты, когда вы хотите явно определить их, но не в вашем случае. –
А потом, наверное, у меня нет проблем! Спасибо за вашу помощь. P.S. Мне сказали, что явное объявление каждой переменной в предложениях о совместном использовании данных является хорошей практикой (по крайней мере, для начинающих программистов). – lodhb