Я хотел бы использовать многопоточный цикл for, но у меня есть переменная внутри цикла, что нужно знать о предыдущем состоянии. Ну, это не совсем легко объяснить.переменная предварительная оценка в диапазоне целых чисел
Вот Exemple:
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>
Если я разделить диапазон в sevral части для процесса любой диапазон суб я могу локально (в каждом потоке) вычислить первый p_i
.
Но я не вижу, как я мог бы определить значение mu1
.
Итак, мой вопрос: есть ли способ определить mu1
в начале потока для диапазона B без предварительного результата mu1
, что было обработано в потоке для диапазона A? Если да, то как?
Какова ваша цель в многопоточном цикле? если производительность, вероятно, вам лучше сосредоточиться на автоматическом векторизации цикла вместо этого, поскольку накладные расходы на управление потоками, вероятно, отрицают любое преимущество использования нескольких ядер для этой относительно простой арифметики. также обратите внимание, что помимо mu1 (и неопределенного mu?, используемого при вычислении mu2), max_sigma и max_val требуют специальной обработки, чтобы избежать состояния гонки между потоками. –
Привет, Мэтт. Я даже знаю, как процитировать сам цикл. Я хотел бы знать, есть ли способ в такой ситуации сделать эффективную многопоточность ... или нет. –
Эффективное распараллеливание довольно сложно, если вычисление элемента 'i' каким-то образом зависит от элемента' i-1'. – Pixelchemist