gpt4 book ai didi

c++ - 为什么他们更喜欢此代码段中的动态调度

转载 作者:太空狗 更新时间:2023-10-29 22:54:51 25 4
gpt4 key购买 nike

我解决了一个练习,我必须用动量实现 SGD(随机梯度下降)。练习是在之后将其并行化。

我的建议如下:

#pragma omp for schedule(static) nowait
for (int i = 0; i < size; i++)
{
const double nablaE_w = (1.0/double(B)) * (grad[i] + lambda * param[i]);
mom_w[i] = beta * mom_w[i] - eta * nablaE_w;
param[i] = param[i] + mom_w[i];
}

我使用 nowait 因为在 for 循环之后计算完成。

但是关于他们使用的解决方案:

#pragma omp for schedule (dynamic, 64/sizeof(double)) nowait

同样在阅读了几个 stackoverflow-answers 之后,我仍然看不出 scheduling(dynamic) 的优势以及为什么他们使用 chunksize=8

我在使用 schedule(dynamic) 时很小心——实际上我从不使用它,因为我不知道如何正确地使用它。

最佳答案

解决方案可能出于以下两个原因之一:附近有另一个 nowait 循环不平衡,可能会导致线程乱序到达此循环的情况,或者他们担心在具有良好性能的系统上运行处理因核心而异的干扰。使用 schedule(dynamic) 的成本更高,目前直到运行时真正正确地实现 nonmonotonic,所以 static 是明确的选择,只要工作负载是平衡的,这个片段就是这样。此处使用动态的唯一原因是线程之间的不平衡预计来自其他地方,无论是在代码中还是来自干扰工作负载。

关于c++ - 为什么他们更喜欢此代码段中的动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077447/

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