在以多執行緒執行的的迴圈訪問中,為了解決在不使用鎖的情況下既共享sum變數有保護該變數的問題,openmp提供了reduction子句,可以用來有效的合併乙個迴圈中某些關於乙個或多個滿足結合律的算術規約操作。
二、reduction示例
#include
#include // openmp程式設計需要包含的標頭檔案
int main()
std::cout << "after: " << sum << std::endl;
return 0;
} 輸出如下:
其中sum是共享的,採用reduction之後,每個執行緒根據reduction(+: sum)的宣告算出自己的sum,然後再將每個執行緒的sum加起來。
可以看到,第乙個執行緒sum的值依次為0, 1, 3, 6, 10;第二個執行緒sum的值一次為5, 11, 18, 26, 35;最後10+35=45。
如果將其中的reduction宣告去掉,則會輸出:
計算步驟如下:
第乙個執行緒sum=0;第二個執行緒sum=5
第乙個執行緒sum=1+5=6; 第二個執行緒sum=6+6=12
第乙個執行緒sum=2+12=14;第二個執行緒sum=7+14=21
第乙個執行緒sum=3+21=24;第二個執行緒sum=8+24=32
第乙個執行緒sum=4+32=36;第二個執行緒sum=9+36=45
儘管結果是對的,但兩個執行緒對共享的sum的操作是不確定的,會引發資料競爭,例如計算步驟可能如下:
第乙個執行緒sum=0;第二個執行緒sum=5
第乙個執行緒sum=1+5=6; 第二個執行緒sum=6+6=12
第乙個執行緒sum=2+12=14;第二個執行緒sum=7+14=21
第乙個執行緒sum=3+21=24;第二個執行緒sum=8+21=29 //在第乙個執行緒沒有將sum更改為24時,第二個執行緒讀取了sum的值
第乙個執行緒sum=4+29=33;第二個執行緒sum=9+33=42 //導致結果錯誤。
reduction宣告可以看作:
1. 保證了對sum的原則操作
2. 多個執行緒的執行結果通過reduction中宣告的操作符進行計算,以加法操作符為例:
假設sum的初始值為10,reduction(+: sum)宣告的並行區域中每個執行緒的sum初始值為0(規定),並行處理結束之後,會將sum的初始化值10以及每個執行緒所計算的sum值相加。
三、reduction的宣告形式
我們在上邊已經了解了reduction的宣告形式,其具體如下:
reduction (operator: var1, val2, ...)
其中operator以及約定變數的初始值如下:
運算子 資料型別 預設初始值
+ 整數、浮點 0
- 整數、浮點 0
* 整數、浮點 1
& 整數 所有位均為1
| 整數 0
^ 整數 0
&& 整數 1
|| 整數 0
小結 對reduction的用法進行了介紹,下面介紹執行緒同步。
mysql資料庫規約 MySQL資料庫規約
8 字段允許適當冗餘,以提高查詢效能,但必須考慮資料一致。冗餘欄位應遵循 1 不是頻繁修改的字段。2 不是 varchar 超長字段,更不能是 text 字段。9 單錶行數超過 500 萬行或者單錶容量超過 2gb,才推薦進行分庫分表。二 索引規約 1 業務上具有唯一特性的字段,即使是多個欄位的組合...
資料探勘筆記 2 資料規約
資料規約 對於中小型資料集而言,前面提到的資料探勘準備中的預處理步驟通常足夠了。但對於真正意義上的大型資料集,在應用資料探勘技術之前,還需要執行乙個中間的 額外的步驟 資料規約。本次主要說維規約。3.1 大型資料的維度 資料規約過程的3個基本操作是刪除列 刪除行 減少列中值的數量。全面分析下述引數 ...
資料預處理之資料規約
1 x mean std為什麼會改變資料的分布?2 標準化與歸一化各自的適用場景與憂缺?3 robustscaler 的優點?參 4 標準化的缺點 會改變資料的分布?標準化中的均值與方差是基於所有資料計算的,包含了異常值,因此標準化後,異常值的離群特性會變得不明顯 可通過robustscaler解決...