第8章 對同步的硬件支持 摘錄

為了保證并行程序執行的正確性和高效性,構建一個共享存儲多處理器系統的硬件必須要解決緩存一致性、存儲一致性和同步原語的支持等問題。

被廣泛使用的同步原語包括鎖lock、柵欄barrier和點對點同步(signal和wait信號量)。舉例來說,鎖和柵欄被大量使用在DOALL并行性和具有鏈式數據結構的應用程序中,而signal/wait同步對流水線DOCROSS并行性來說至關重要。

如今一種很使用的方式是將最低級別的同步原語以原子指令的形式在硬件上實現,然后將其他所有高級別的同步原語在軟件中實現。通常在可擴展性(同步延遲和帶寬如何隨著更大數量的線程而擴展)和無競爭延遲(線程不同時嘗試同步所帶來的延遲)之間會作出權衡。

對于大型系統來說,在原子指令之上實現的軟件柵欄和鎖可能不具有足夠的可擴展。對于這些系統來說,硬件柵欄的實現很常見。

8.1 鎖的實現

8.1.1 對鎖實現性能的評估

性能評價標準,考慮鎖的實現:

? ? ? ? 1)無競爭獲取鎖延遲:當線程間沒有競爭時,獲取一個鎖所花費的時間。
? ? ? ? 2)通信量:總的通信量,是參與競爭鎖的線程或者處理器數的函數。通信量可以分為三個子部分,即當一個鎖空間時獲取產生的通信量、當一個鎖不空閑 時鎖 獲取產生的通信量:鎖釋放時產生的通信量。
????????3)公平性:線程同其他線程相比被允許持有鎖的程度。公平性的標準是在一個鎖實現中,線程饑餓的情況是否存在,即一個線程不能長時間地持有鎖,即使這個鎖在這段時間內是空閑的。
?????????4)存儲:需要的存儲空間時線程數的函數。一些鎖的實現要去一個恒定的存儲空間,這個存儲空間與共享鎖的線程數無關;而另一些鎖的實現要求的存儲空間是隨著共享鎖的線程數而線性增長的。

8.1.2 對原子指令的要求

? ? ? ? 軟件機制并不能擴展,因為執行的靜態指令的數量,已經為了查看線程是否能夠獲得鎖而需要檢查的變量的數量,都會隨著線程數的增加而增加。相反,如果一個原子指令能夠執行一系列加載、比較其他指令和存儲指令,那么可以實現一個簡單的鎖

int is_turn;
int is_ready[n] = {0};    // n是處理器數目void Lock(int porcess)
{int other = 1- process;is_ready[process] = TRUE;is_turn = process;while (is_turn == process && is_ready[other] == TRUE)
}void Unlock(int process)
{is_ready[process] = FALSE;
}

? ?在當今的系統中,大部分的處理器支持將一個原子指令作為最低級的原語,同時基于它還可以構建其他同步原語。一個原子指令以一種不可分割的方式執行一系列的讀、修改和寫操作,這些操作在執行時不可能分割。

lock: ld    R1, &lockvarbnz   R1, lockst    &lockvar, #1retunlock: st    &lockvar, #0ret 

以上指令必須原子性地執行,“原子”這個詞表達了兩件事。首先,它意味著要么整個序列都被完整執行,要么其中任何一條指令都不執行。其次,它表達了在任何給定的時間內,只有一條原子指令(無論來自那個處理器)能夠被執行。下面列出一些經常使用:

? ? ? ? test-and-set Rx,M: 讀取存儲在存儲單元M的值,將這個值與一個常數進行比較,如果他們想匹配,那么將寄存器Rx中的到存儲單元M中。

? ? ? ? fetch-and-op M: 讀取存儲在在存儲單元M的值,對這個值執行操作(如自增、減值、加法、減法),然后將得到的新值存儲到存儲單元M中。在有些情況下,會指定額外的操作數。

? ? ? ? exchange Rx, M:自動交換在存儲單元M中的值和寄存器Rx的值。

? ? ? ? compare-and-swap Rx, Ry,?M:比較存儲單元M中的值和寄存器Rx中的值,如果它們匹配,將寄存器Ry中的值寫到存儲單元M中,然后拷貝寄存器Rx中的值到寄存器Ry中。

除了以上指令之外,最通用的一個指令是比較并交換CAS:與test-adn-set指令相比較,它能執行一個比較,但是與之相比較的是一個寄存器中任意值,而不是一個常數;與一個exchange指令相比,它可以交換寄存器和內存中的值,但是需要附加的條件。

讀者可能會提出兩個問題:

? ? ? ? 1)一個原子指令如何確保原子性?
? ? ? ? 2)一個原子指令如何被用于同步控制結構?

一個原子指令本質上為程序提供了一個保障:指令所代表的一系列操作將會被完整地執行。

緩存一致性協議提供了原子性被保障的基礎。當遇到一個原子指令時,這個緩存一致性協議知道需要保證其原子性。他首先會獲得存儲單元M的“獨家所有權”(通過將其他包含M的緩存塊中的拷貝都置為無效)。當獲得獨家所有權后,這個協議會確保只有只有一個處理器能夠訪問這個塊,而如果其他處理器在此時想要訪問的話就會經歷緩存缺失,接下來原子指令就可以執行了。而如果其他處理器在此時想要訪問的話就會經歷緩存缺失,接下來原子指令就可以執行了。在原子指令持續期間,其他處理器不允許“偷走”這個塊。

在一個基于總線的多處理器中,一個阻止塊(在基于總線的多處理器上)被“偷走”的方法是鎖上或者預約總線直到指令完成。

一個更加常用的解決辦法(亦可用在非基于總線的多處理器系統中)不是阻止其他對總線的請求,而是使用執行原子指令的處理器的一致性控制器,來對塊的其他所有請求延遲響應直到原子指令完成,或者否定確認請求,這樣請求者會在未來重復請求。

8.1.3 TS鎖

在獲取鎖的嘗試中的第一條指令時test-and-set指令,它原子地執行下面幾個步驟:首先從lockvar所在的存儲單元中讀取值到寄存器R1中(使用一個獨占的讀指令,如BusRfx或者BusUpgr),將寄存器R1中的值與0相比較。第二條指令時分支指令,當R1中的值非0的時候分支指令回到標簽lock,這樣鎖的獲取可以被重新嘗試。如果R1中的值是0,就意味著當到達分支指令時,因為原子性,test-and-set指令已經成功了。鎖的釋放只需要將0賦給lockvar即可,而不需要原子指令,因為此時只有一個線程在臨界區,所有只有一個線程能夠對鎖進行釋放,在鎖釋放的時候不會產生沖突。

lock: t&s    R1, &lockvarbnz    R1, lockretunlock:    st, &lockvar,    #0ret

? 評價一下test-and-set鎖實現。因為在成功獲得一個鎖的時候只需要一條原子指令和一條分支指令,所以無競爭獲取鎖的延遲很低,但是通信量需求非常高。每個鎖獲取都試圖使其他拷貝失效,而不管這個獲取成功與否。比如

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARM 作業1

一、思維導圖 二、 1. 2. .text 文本段 .globl _start 聲明_start:mov r0,#0mov r1,#0fun:cmp r1,#100bhi stopadd r0,r0,r1add r1,r1,#1b fun stop:b stop .end

C++函數模板和類模板

C另一種編程思想稱為泛型編程,主要利用的技術是模板 C提供兩種模板機制:函數模板和類模板 C提供了模板(template)編程的概念。所謂模板,實際上是建立一個通用函數或類, 其類內部的類型和函數的形參類型不具體指定, 用…

Axios使用CancelToken取消重復請求

處理重復請求:沒有響應完成的請求,再去請求一個相同的請求,會把之前的請求取消掉 新增一個cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …

如何區分閏年與平年

首先要明白 地球繞太陽運行周期為365天5小時48分46秒(合365.24219天),即一回歸年(tropical year)。公歷的平年只有365日,比回歸年短約0.2422 日,每四年累積約一天,把這一天加于2月末…

Docker安裝基礎使用練習

目錄 1、安裝Docker-CE 1)簡單使用yum方式安裝 ! 2)配置鏡像加速: 2、下載系統鏡像(Ubuntu、 centos) 1)先查看我們所需的鏡像有哪些版本。使用search命令! 2)下載鏡像使用的是pul…

【爬蟲】P1 對目標網站的背景調研(robot.txt,advanced_search,builtwith,whois)

對目標網站的背景調研 檢查 robot.txt估算網站大小識別網站所用技術尋找網站的所有者 檢查 robot.txt 目的: 大多數的網站都會包含 robot.txt 文件。該文件用于指出使用爬蟲爬取網站時有哪些限制。而我們通過讀 robot.txt 文件,亦可以最小化爬蟲被封禁的…

vue中實現文字檢索時候將搜索內容標紅

實現結果 html&#xff1a; <div class"searchBox"><span class"bt">標&#8195&#8195題</span><div class"search"><div class"shuru"><!-- <span class"title">生產經營<…

[leetcode] 707 設計鏈表

707. 設L計鏈表 中等 902 相關企業 你可以選擇使用單鏈表或者雙鏈表&#xff0c;設計并實現自己的鏈表。 單鏈表中的節點應該具備兩個屬性&#xff1a;val 和 next 。val 是當前節點的值&#xff0c;next 是指向下一個節點的指針/引用。 如果是雙向鏈表&#xff0c;則還需…

如何批量修改圖片名為不同名稱

如何批量修改圖片名為不同名稱&#xff1f;當今社會&#xff0c;因為人們都養成了隨手拍照的習慣&#xff0c;所以擁有上千上萬張照片的相冊已經司空見慣不足為奇。然而&#xff0c;我們在保存這些照片時往往都會碰到一個大難題——電腦中的圖片名稱千奇百怪&#xff0c;讓整個…

C++并發多線程--std::async、std::packaged_task和std::promise的使用

目錄 1--std::async的使用 2--std::packaged_task的使用 3--std::promise的使用 1--std::async的使用 std::async用于啟動一個異步任務&#xff0c;并返回一個std::future對象&#xff1b;std::future對象里含有異步任務線程入口函數的結果&#xff1b; std::launch::deferr…

完美解決微信小程序使用復選框van-checkbox無法選中

由于小程序使用了vant-ui框架&#xff0c;導致checkbox點擊無法選中問題 <van-checkbox value"{{ checked }}" shape"square"><view class"check-content"><view class"checktext">我已閱讀并同意>《用戶協議》…

opencv-目標追蹤

import argparse import time import cv2 import numpy as np# 配置參數 ap argparse.ArgumentParser() ap.add_argument("-v", "--video", typestr,help"path to input video file") ap.add_argument("-t", "--tracker", …

第1天----驗證一個字符串是否是另一個字符串的子串

本文我們將學習如何去驗證一個字符串是否是另一個字符串的子串。 一、小試牛刀&#xff1a; 題目描述 輸入兩個字符串&#xff0c;驗證其中一個串是否為另一個串的子串。 輸入格式 兩行&#xff0c;每行一個字符串。 輸出格式 若第一個串 s 1 是第二個串 s 2 的子串&#xff0c…

java Spring Boot properties多環境配置拆分文件管理

上文 java Spring Boot yml多環境拆分文件管理優化 我們用yml 做了一個多環境配置文件的拆分管理 我們將 application.yml 改為 application.properties 參考代碼如下 spring.profiles.activedev我們知道 yml 是用 : 來區分高低基本 而 properties是直接通過 . 來表達 其他基本…

使用svd 分解的方法對神經網絡模型進行壓縮(能不能壓縮要看秩的大小)

參考和理論 壓縮原理代碼 import torch import numpy as np torch.manual_seed(0)# ------------------------------------ # n:輸入數據維度 # m:輸出數據維度 # ------------------------------------ n = 12 m = 10# ------------------------------------ # 隨機初始化權…

樹形組件淺知

別人寫好的輪子&#xff0c;會用即可 首先&#xff0c;需要安裝依賴&#xff0c;npm install --save riophae/vue-treeselect 如果使用npm 不行 那么就使用 yarn add --save riophae/vue-treeselect 然后在使用的地方引入即可 // import the componentimport Treeselect from…

微信ipad協議8.0.40 加好友功能

友情鏈接 geweapi.com 點擊即可訪問&#xff01; 好友請求驗證 小提示&#xff1a; v_3 v_4 可以參考 搜索接口 請求URL&#xff1a; http://域名地址/api/contacts/verifyuser 請求方式&#xff1a; POST 請求頭&#xff1a; Content-Type&#xff1a;application/js…

SpringCloud實用篇7——深入elasticsearch

目錄 1 數據聚合1.1 聚合的種類1.2 DSL實現聚合1.2.1 Bucket聚合語法1.2.2 聚合結果排序1.2.3 限定聚合范圍1.2.4 Metric聚合語法1.2.5.小結 1.3 RestAPI實現聚合1.3.1 API語法1.3.2 業務需求1.3.3 業務實現 2 自動補全2.1 拼音分詞器2.2 自定義分詞器2.3 自動補全查詢2.4 實現…

POJ 1995 Raising Modulo Numbers 快速冪

一、總結 我一開始擔心溢出&#xff0c;開了一個無符號的long long&#xff0c;但是直接超時&#xff0c;后來一看它的mod不是很大&#xff0c;于是改成int&#xff0c;直接過了。 二、代碼 #include <iostream> using namespace std; int H, Z; int M; int mulMod(in…

P1217 [USACO1.5] 回文質數 Prime Palindromes

P1217 [USACO1.5] 回文質數 Prime Palindromes - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) # [USACO1.5] 回文質數 Prime Palindromes ## 題目描述 因為 $151$ 既是一個質數又是一個回文數&#xff08;從左到右和從右到左是看一樣的&#xff09;&#xff0c;所以 $151$ …