gpt4 book ai didi

c++ - 循环范围拆分中的变量预评估

转载 作者:行者123 更新时间:2023-11-28 00:05:53 25 4
gpt4 key购买 nike

我想对一个 for 循环进行多线程处理,但我的循环中有一些变量需要知道以前的状态。好吧,这并不容易解释。

这是一个例子:

    double mu1 = 0, q1 = 0;
double max_sigma = 0, max_val = 0;
for( i = 0; i < N; i++ )
{
double p_i, q2, mu2, sigma;
p_i = h[i]*scale;
mu1 *= q1;
q1 += p_i;
q2 = 1. - q1;

if(std::min(q1,q2) < FLT_EPSILON || std::max(q1,q2) > 1. -FLT_EPSILON )
continue;

mu1 = (mu1 + i*p_i)/q1;
mu2 = (mu - q1*mu1)/q2;
sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);
if( sigma > max_sigma )
{
max_sigma = sigma;
max_val = i;
}
}

scaledouble标量值。

hstd::vector<std::uint64_t>

如果我将范围分成几个部分来处理任何子范围,我可以在本地(在每个线程中)首先计算 p_i .

但我不知道如何确定值 mu1 .

所以我的问题是:有什么方法可以确定 mu1在范围 B 的线程的开头,没有先于 mu1 的结果范围 A 的线程中处理了什么?如果是,如何?

最佳答案

对于显示的代码,使用多线程解决方案似乎很难实现。问题是 mu1q1 取决于上一个循环的值,因此在上一个循环完成之前您无法真正继续。

如果你的代码更像:

for( i = 0; i < N; i++ )
{
SomeComplexAndSlowCalculation(); // Not depending on mu1 and q1

mu1 = mu1 * ....;
q1 = q1 + ....;

SomeOtherComplexAndSlowCalculation(); // Depending on mu1 and q1
// but not changing them

}

你可以像这样使用 std::condition_variable:

    SomeComplexAndSlowCalculation(); // Not depending on mu1 and q1

cv_previous.wait(...); // wait for thread handling previous index to complete

mu1 = mu1 * ....;
q1 = q1 + ....;

cv_next.notify_one(); // tell thread handling next index to carry on

SomeOtherComplexAndSlowCalculation(); // Depending on mu1 and q1
// but not changing them

您必须为每个索引启动一个新线程。

要使其有所不同/改进,这两个函数必须非常慢。

关于c++ - 循环范围拆分中的变量预评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704374/

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