【发布时间】:2017-05-18 09:32:18
【问题描述】:
我有一个遗传密码,我想在 12 核上并行它,第一部分是一个我想并行它的循环,但是在并行运行之后,我发现串行代码比并行代码快,请告诉我我在哪里我错了。有没有办法让 openmp 比串行更快?
int main() {
srand(time(0));
srand(rand() % 10000007);
G.vertex_degrees();
int step = 0, n_pop = 100;
G.initial_population(n_pop);//parallel shod
G.full_random_array();//movazi shod
clock_t start = clock();
int i = 0,tid,nthreads;
#pragma omp parallel for
for (i = 0; i < n_pop; i++) {
G.Chromosome_Repairing_Method(i);
G.Fitness(i);
}
//cout << "MC Size :" << G.current_Bc_size << " with Time (precise) = " << ((double)(clock() - start)) / CLOCKS_PER_SEC << "found it" << endl;
omp_set_num_threads(4);
G 是遗传算法的一个对象,并且 G.Chromosome_Repairing_Method(i); 是修复染色体的功能 和 G.Fitness(i); 是一个计算每个染色体适应度的函数
【问题讨论】:
-
Chromosome_Repairing_Method(), Fitness() 多长时间?他们最好花很多时间进行 100 次迭代。
-
我想知道是否应该在 for 循环中声明 i:for(int i = 0, ...)。由于 i 存在于 for 循环范围之外,这可能会导致问题。
-
除了使用cpu时间的问题外,您的问题缺少关于实际循环体的基本信息,尤其是
G的方法,以及您的具体计时结果和系统信息。
标签: c++ parallel-processing openmp genetic-algorithm