У меня есть давно работающая программа моделирования, и я планирую использовать OpenMP для распараллеливания некоторых кодов для ускорения. Я новичок в OpenMP и у меня есть следующий вопрос.
Учитывая, что моделирование является стохастическим, у меня есть следующая структура данных, и мне нужно зафиксировать количество посеянных агентов для определенного возраста [Отредактировано: отредактирован некоторый код]:
class CAgent {
int ageGroup;
bool isSeed;
/* some other stuff */
};
class Simulator {
std::vector<int> seed_by_age;
std::vector<CAgent> agents;
void initEnv();
/* some other stuff */
};
void Simulator::initEnv() {
std::fill(seed_by_age.begin(), seed_by_age.end(), 0);
#pragma omp parallel
{
#pragma omp for
for (size_t i = 0; i < agents.size(); i++)
{
agents[i].setup(); // (a)
if (someRandomCondition())
{
agents[i].isSeed = true;
/* (b) */
seed_by_age[0]++; // index = 0 -> overall
seed_by_age[ agents[i].ageGroup - 1 ]++;
}
}
} // end #parallel
} // end Simulator::initEnv()
Поскольку переменная seed_by_age
является общей для нескольких потоков, я знаю, что должен защищать ее должным образом. Итак, в (b) я использовал #pragma omp flush(seed_by_age[agents[i].ageGroup])
, но компилятор жалуется на «ошибка: ожидается ')' перед токеном '['"
Я не делаю редукцию и стараюсь по возможности избегать «критической» директивы. Итак, я что-то пропустил здесь? Как правильно защитить определенный элемент вектора?
Большое спасибо, и я ценю любые предложения.
- Блок разработки: 2-ядерный процессор, целевая платформа 4-6 ядер
- Платформа: Windows 7, 64 бита
- MinGW 4.7.2 64 бита (сборка rubenvb)