【问题标题】:why serial run is faster parallel openmp为什么串行运行更快并行openmp
【发布时间】: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 循环范围之外,这可能会导致问题。
  • 可能是由于您对代码计时的方式造成的问题...参见thisthat
  • 除了使用cpu时间的问题外,您的问题缺少关于实际循环体的基本信息,尤其是G的方法,以及您的具体计时结果和系统信息。

标签: c++ parallel-processing openmp genetic-algorithm


【解决方案1】:

并行化任务需要时间。

你有没有在现实生活中有一个任务和 3 个工人,并且自己想“我会很快地完成它,这比向这三个人解释需要做什么要快”?

好吧,同样的事情也可能发生在这里。一个人“只是做”比多个人组织它、做它并再次组织以合并结果要快。

并行做事不是灵丹妙药。任务需要适合它,否则只会增加开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2012-09-13
    • 2013-04-07
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多