我有一个遗传密码,我希望它在12个内核上并行,第一部分是我要并行的循环,但是在并行和运行之后,我看到串行代码比并行代码更快,请告诉我在哪里我我错了。有没有办法让openmp比serrial更快?
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(ⅰ); 是修复染色体的功能 和G.Fitness(i); 是计算每条染色体适合度的函数
答案 0 :(得分:0)
并行化任务需要时间。
你有没有在现实生活和3名工人中完成任务并自己思考“我会快速做到这一点,这比解释那些需要对这三个人做什么更快”?
嗯,同样的事情可能发生在这里。一个人“正在做这件事”比组织它的多个人要快,并且再次组织合并结果。
并行做事并不是银弹。任务需要适合它,否则你只会增加开销。