作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对一个 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;
}
}
scale
是 double
标量值。
h
是 std::vector<std::uint64_t>
如果我将范围分成几个部分来处理任何子范围,我可以在本地(在每个线程中)首先计算 p_i
.
但我不知道如何确定值 mu1
.
所以我的问题是:有什么方法可以确定 mu1
在范围 B 的线程的开头,没有先于 mu1
的结果范围 A 的线程中处理了什么?如果是,如何?
最佳答案
对于显示的代码,使用多线程解决方案似乎很难实现。问题是 mu1
和 q1
取决于上一个循环的值,因此在上一个循环完成之前您无法真正继续。
如果你的代码更像:
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/
假设我们有这样的表达式: %rem = srem i32 %i.0, 10 %mul = mul nsw i32 %rem, 2 %i.0 是一个 llvm::PHINode,我可以获得边界。
我是一名优秀的程序员,十分优秀!