我有一个长时间运行的模拟程序,我计划使用OpenMP来并行加速一些代码。我是OpenMP的新手,并有以下问题。C++ 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])
但是编译器在'['token'之前抱怨“错误:预计')'
我并没有做减法,如果可能的话我尽量避免使用'critical'指令。那么,我在这里错过了什么吗?我如何正确保护矢量的某个元素?
非常感谢,我欣赏任何建议。
- 发展盒:2核心CPU,目标平台4-6芯
- 平台:Windows 7中,64位
- MinGW的4.7.2 64位(rubenvb构建)
ageGroup不是seed_by_age(它是一个向量)的成员, –