循環我有這樣的代碼:的OpenMP用的std ::矢量和標量減少與
#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有什麼技巧嗎?
標量變量在這裏只是通過在我創建的每個double上應用log()來重寫浮點數,因爲有很多double to double乘法,並且它們之後的結果接近於零。例如,通過執行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倍!
什麼類型是'scalar'?你觀察到什麼樣的競爭條件。 – Zulan
我正在處理非常大的雙數。當我將它們乘以很多時,它們變得太接近於零,所以我使用這種標量類型,這種標量類型在這些小型雙打日誌上超載操作。 –
無論如何,請提供[mcve]。 – Zulan