У меня есть этот код:OpenMP для цикла с станд :: вектором и скалярной переменной с уменьшением
#pragma omp declare reduction(* : scalar : omp_out *= omp_in)
scalar like=1;
vector<scalar>& bigsum;
#pragma omp parallel for // reduction(* : like)
for (int m = 0; m < M-1; m++)
like *= bigsum[m];
Я пытаюсь получить последовательный результат, но это не делает (состояние гонки проблемы), но, как следует Я чиню это? как это видно в коде, у меня есть свой собственный reduction function
, но он тоже не работает. Есть ли какой-либо трюк для скалярного и std :: vector, о которых я должен знать?
Скалярная переменная здесь - это только переопределенная плавающая точка, применяя log() для каждого двойника, который я создал, так как существует так много двойных двойных умножений, и результат после того, как пара становится близкой к нулю. Например, делая log(), умножение становится добавлением и т. Д.
Один ответ для последовательного ответа будет таким:
#pragma omp parallel
{
scalar loc = 1;
#pragma omp for
for (std::size_t m = 1; m < M;m++)
{
_flm[m-1] = Qratio[m-1] * k1 + k2;
bigsum[m-1] = kappa0omegaproduct + kappa[1] * _flm[m-1];
#pragma omp critical (reduce_product)
{
like *= bigsum[m-1];
}
}
}
Этот ответ является правильным, но настолько медленно, что почти в 8 раз медленнее на моем 8 основной машине!
Какой тип 'скаляр'? Какое состояние гонки вы наблюдаете. – Zulan
Я имею дело с очень большими двойными номерами. Когда я их много размножаю, они становятся слишком близкими к нулю, поэтому я использую этот скалярный тип, который перегружает операции над журналом этих маленьких удвоений. –
В любом случае, пожалуйста, предоставьте [mcve]. – Zulan