Имам дългогодишна програма за симулация и планирам да използвам 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)