我有一个长时间运行的模拟程序,我计划使用 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核CPU,目标平台4-6核
- 平台:Windows 7、64 位
- MinGW 4.7.2 64 位(rubenvb 构建)