gpt4 book ai didi

parallel-processing - 糟糕的性能 - 一个简单的开销问题,或者是否存在程序缺陷?

转载 作者:行者123 更新时间:2023-12-04 17:14:10 26 4
gpt4 key购买 nike

我在这里有一个我理解的相对简单的 OpenMP 结构。问题是与 2 个线程相比,程序在 1 个线程下的运行速度大约快 100-300 倍。 87% 的程序花费在 gomp_send_wait() 中,另外 9.5% 花费在 gomp_send_post 中。

程序给出了正确的结果,但我想知道代码中是否存在导致某些资源冲突的缺陷,或者仅仅是线程创建的开销对于块大小为 4 的循环来说是非常不值得的。p范围从 17 到 1000,具体取决于我们模拟的分子的大小。

我的数字是针对最坏的情况,当 p 为 17 且块大小为 4 时。无论我使用静态、动态还是引导式调度,性能都是相同的。使用 p=150 和块大小 75 ,程序仍然比串行慢 75x-100x。

...
double e_t_sum=0.0;
double e_in_sum=0.0;

int nthreads,tid;

#pragma omp parallel for schedule(static, 4) reduction(+ : e_t_sum, e_in_sum) shared(ee_t) private(tid, i, d_x, d_y, d_z, rr,) firstprivate( V_in, t_x, t_y, t_z) lastprivate(nthreads)
for (i = 0; i < p; i++){
if (i != c){
nthreads = omp_get_num_threads();
tid = omp_get_thread_num();

d_x = V_in[i].x - t_x;
d_y = V_in[i].y - t_y;
d_z = V_in[i].z - t_z;


rr = d_x * d_x + d_y * d_y + d_z * d_z;

if (i < c){

ee_t[i][c] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[i][c];
e_in_sum += ee_in[i][c];
}
else{

ee_t[c][i] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[c][i];
e_in_sum += ee_in[c][i];
}

// if(pid==0){printf("e_t_sum[%d]: %f\n", tid, e_t_sum[tid]);}

}
}//end parallel for


e_t += e_t_sum;
e_t -= e_in_sum;

...

最佳答案

首先,我认为在这种情况下优化您的串行代码不会有助于解决您的 OpenMP 困境。别担心。

IMO 对放缓有三种可能的解释:

  • 这可以很容易地解释经济放缓。数组 ee_t 的元素导致缓存行内的错误共享。错误共享是指内核最终写入相同的缓存行,而不是因为它们实际上正在共享数据,而是当内核正在写入的内容恰好在同一缓存行中时(这就是为什么它被称为错误共享)。如果你在谷歌上没有发现虚假分享,我可以解释更多。使 ee_t 元素缓存行对齐可能会有很大帮助。
  • 生成工作的开销高于并行性 yield 。您是否尝试过少于 8 个内核? 2核性能如何?
  • 总迭代次数很少,我们以17次为例。如果你把它分成 8 个内核,它会遇到负载不平衡问题(特别是因为你的一些迭代实际上没有做任何工作(当 i == c 时)。至少一个内核必须做 3 次迭代,而所有其他内核都将做 2.​​ 这并不能解释速度变慢,但肯定是加速没有您预期的那么高的一个原因。由于您的迭代长度不同,我将使用块大小为 1 的动态计划或使用 openmp 引导。试验chunk size,chunk太小也会导致速度变慢。

  • 让我知道事情的后续。

    关于parallel-processing - 糟糕的性能 - 一个简单的开销问题,或者是否存在程序缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870952/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com