2017-05-11 37 views
1

我試圖計算出預期爲大同時使用遞歸和異步向量的2範數。這是我迄今爲止所擁有的。我得到了正確的答案,但我的程序似乎沒有改善性能。事實上,按順序計算規範似乎更快。有人可以看一下,看看我做錯了嗎?計算向量的並行規範並同時使用異步/期貨

double rtn_worker(const Vector& x, unsigned long begin2, unsigned long end2, unsigned long level2){ 
    int begin = (int) begin2; 
    int end = (int) end2; 
    int level = (int) level2; 
    if(level == 0){ 
    double temp_partial = 0.0; 
    for(unsigned long i = begin; i <= end; ++i){ 
     temp_partial += x(i)*x(i); 
    } 
    return temp_partial; 
    } 
    else{ 
    return rtn_worker(x, begin, begin+(end-begin)/2, level-1)+rtn_worker(x, begin+(end-begin)/2+1, end, level-1); 
    } 
} 
double recursiveTwoNorm(const Vector& x, unsigned long levels){ 
    double sum = 0.0; 
    unsigned long end = x.numRows(); 
    std::future<double> partial = std::async(std::launch::deferred, rtn_worker, std::ref(x), 0, end-1, levels); 
    sum += partial.get(); 
    double norm = sqrt(sum); 
    return norm; 
} 

注意:我已經定義了Vector的類。在這裏,.numRows()是一個私有成員函數,它返回向量的長度。

雖然我已經用數學疊交流頻繁,這是我在堆棧溢出的第一篇文章。任何和所有的評論和批評都表示讚賞!

*我已經實現這個使用thread.h,但我想比較與異步的性能。

+0

順序總是更快,穿線時的開銷,上下文切換和鎖定ARË都考慮到平行執行是不是性能的妙法,往往是相反的。 – gbjbaanb

+0

@gbjbaanb:你在哪裏看到平行化? – MSalters

+0

@MSalters在哪裏他使用了thread.h,但是異步是關於正在運行的線程,它使用與並行化相關的所有開銷,即使你一次只運行1個線程。這就是我的意思,不是他一次執行許多任務。 – gbjbaanb

回答

0

如果您立刻打電話給.get()就沒有意義了。推遲計算的重點是你不需要馬上得到結果。

不是說std::launch::async會幫助多少。* - 你有一個線程等待另一個。

的問題是,你在錯誤的級別使用asyncrtn_worker自稱兩次。以異步方式運行其中一個調用會很有效。在這種情況下,請使用std::launch::deferred | std :: launch :: async to let the runtime choose, or use level`來明確選擇。