本發(fā)明涉及并發(fā)程序設(shè)計(jì)方法,尤其涉及一種并發(fā)調(diào)用方法及裝置。
背景技術(shù):
摩爾定律是由英特爾創(chuàng)始人之一戈登·摩爾提出來的。其內(nèi)容為:當(dāng)價(jià)格不變時(shí),集成電路上可容納的元器件的數(shù)目,約每隔18-24個(gè)月便會(huì)增加一倍,性能也將提升一倍。雖然該定律的有效性已經(jīng)超過半個(gè)世紀(jì),然而已經(jīng)在近十年的發(fā)展中,cpu主頻的提升已經(jīng)明顯遇到了一些暫時(shí)無法突破的瓶頸。在目前的科技水平下,如果無法在物質(zhì)分子層面以下進(jìn)行工作,那么目前的單cpu主頻已經(jīng)接近理論極限。因此,摩爾定律在cpu的計(jì)算性能上可能已經(jīng)失效[sutterh.thefreelunchisover:afundamentalturntowardconcurrencyinsoftware[j].dr.dobb’sjournal,2005,30(3):202-210.]。
雖然長達(dá)半世紀(jì)的摩爾定律轟然倒地,但多核cpu在短短幾年內(nèi)迅速發(fā)展。從整體上看,專業(yè)服務(wù)器的內(nèi)核總數(shù)甚至可以達(dá)到幾百個(gè)。隨著cpu技術(shù)進(jìn)入多核時(shí)代,如何有效利用多核并發(fā)運(yùn)算優(yōu)勢,提升設(shè)備的處理能力,滿足用戶對高性能的需求,已成為關(guān)注的焦點(diǎn)。多核處理器以其高性能、低功耗優(yōu)勢正逐步取代傳統(tǒng)的單處理器成為市場的主流。[李燕.多核處理器的發(fā)展歷程及其發(fā)展趨勢[j].科技信息,2012(34):454-454.]
在科學(xué)、工程和商業(yè)計(jì)算領(lǐng)域,還有很多問題難以使用現(xiàn)有的超級計(jì)算機(jī)解決,如需要處理的海量數(shù)據(jù)資源分布在不同的地理壓域,所需的特殊計(jì)算設(shè)施和輸入輸出設(shè)備等不是本地的。基于這種情況,網(wǎng)格計(jì)算技術(shù)被提了出來,它將網(wǎng)絡(luò)上的各種資源,包括超級計(jì)算機(jī)、大規(guī)模存儲系統(tǒng)、個(gè)人計(jì)算機(jī)各種設(shè)備等組織在一個(gè)統(tǒng)一的框架下,從而能夠用非常方便的方法解決各種復(fù)雜的問題。這種方法又被稱為元計(jì)算(metacomputing),無縫、可擴(kuò)展計(jì)算(seamlessscalablecomputing),全局計(jì)算(globalcomputing)等。[肖連兵,黃林鵬.網(wǎng)格計(jì)算綜述[j].計(jì)算機(jī)工程,2002,28(3):1-3.]
隨著高性能計(jì)算機(jī)硬件結(jié)構(gòu)的不斷發(fā)展,傳統(tǒng)的串行程序變得難以充分利用不同硬件結(jié)構(gòu)下的計(jì)算資源,先進(jìn)的硬件對于高性能并發(fā)程序的需求與日俱增。然而目前相對于傳統(tǒng)的串行程序,高性能并發(fā)程序的開發(fā)成本是極高的,原因主要有下面幾點(diǎn):
1、性能方面,在不同并發(fā)級別下,不同并發(fā)算法往往在性能上差異較大;在不同平臺中,對某些并發(fā)原語的支持度也不盡相同;在大規(guī)模并發(fā)程序設(shè)計(jì),涉及不同類型執(zhí)行方式的情況下,例如cpu和gpu處理器協(xié)同工作或是集群環(huán)境中,并發(fā)控制也更加復(fù)雜,例如需要考慮數(shù)據(jù)一致性、傳輸、調(diào)度等。
2、正確性方面,并發(fā)程序不僅難以開發(fā),更難以調(diào)試,故其質(zhì)量控制困難。同一個(gè)程序的運(yùn)行結(jié)果具有一定的隨機(jī)性,除非能從理論上證明程序的正確性,僅僅利用測試是很難斷言程序是正確的。
3、開發(fā)效率方面,現(xiàn)有的并發(fā)程序設(shè)計(jì)工具或模式雖然在一定程度上為開發(fā)提供了很多便利,提升了開發(fā)效率,但本身存在很多限制,不同工具提供的功能也不盡相同。使用不同工具開發(fā)的并發(fā)程序往往很難移植,程序的性能瓶頸也往往被限制于使用的工具或模式。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供并發(fā)調(diào)用方法及裝置,旨在解決當(dāng)前用戶在開發(fā)并發(fā)程序時(shí)不同平臺差異大、并發(fā)控制復(fù)雜、質(zhì)量控制困難、開發(fā)效率不夠高所造成的開發(fā)成本較高的問題。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
一種并發(fā)調(diào)用方法,包括:
語義需求文檔獲取步驟:
接收用戶對編程語言的選擇指令,確定編程語言;
查詢與編程語言相應(yīng)的語義需求文檔,所述語義需求文檔包括邏輯接口和與邏輯接口相應(yīng)的語義需求;所述邏輯接口包括并發(fā)過程接口、并發(fā)回調(diào)接口、線性緩沖區(qū)接口、原子狀態(tài)機(jī)初始化器接口、原子狀態(tài)向前轉(zhuǎn)移器接口、原子狀態(tài)向后轉(zhuǎn)移器接口、二元信號量接口、并發(fā)調(diào)用器接口中的一種或多種;
協(xié)作代碼獲取步驟:
接收用戶對協(xié)作過程的選擇指令,確定協(xié)作過程;所述協(xié)作過程包括同步并發(fā)調(diào)用過程、異步并發(fā)調(diào)用過程、并發(fā)分支過程和并發(fā)匯合過程;
查詢與協(xié)作過程相應(yīng)的協(xié)作代碼;
調(diào)用步驟:
確定與協(xié)作過程相應(yīng)的邏輯接口;
根據(jù)語義需求文檔,實(shí)現(xiàn)與協(xié)作過程相應(yīng)的邏輯接口的功能;
根據(jù)與協(xié)作過程相應(yīng)的邏輯接口,調(diào)用協(xié)作代碼,以實(shí)現(xiàn)用戶需求。
在上述實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述同步并發(fā)調(diào)用過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)二元信號量實(shí)體、m個(gè)并發(fā)過程實(shí)體和n個(gè)并發(fā)調(diào)用器實(shí)體;m和n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第一求和變量;
以所述第一求和變量為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第一緩沖區(qū)變量;
創(chuàng)建并發(fā)回調(diào)實(shí)體,所述并發(fā)回調(diào)實(shí)體的執(zhí)行邏輯為:對所述二元信號量實(shí)體執(zhí)行釋放操作;
以所述第一緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;
對所述第一緩沖區(qū)變量執(zhí)行取出操作,保存輸出為x(0)變量;
以任意次序執(zhí)行所述m個(gè)并發(fā)過程實(shí)體,其中第i個(gè)被執(zhí)行的并發(fā)過程實(shí)體以x(i-1)變量和所述并發(fā)回調(diào)實(shí)體為輸入,保存輸出為x(i)變量;i為正整數(shù),i≤m;
對x(m)變量執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作成功時(shí),對所述二元信號量實(shí)體執(zhí)行等待操作。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述異步并發(fā)調(diào)用過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第二求和變量;
以所述第二求和變量和數(shù)值1的作差結(jié)果為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第二緩沖區(qū)變量;
以所述第二緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述并發(fā)分支過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)向前轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第三求和變量;
以所述第三求和變量為輸入,對所述原子狀態(tài)向前轉(zhuǎn)移器實(shí)體執(zhí)行向前轉(zhuǎn)移操作,保存輸出為第三緩沖區(qū)變量;
以所述第三緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;
對所述第三緩沖區(qū)變量執(zhí)行取出操作,保存輸出為向后轉(zhuǎn)移器變量;
輸出所述向后轉(zhuǎn)移器變量。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述并發(fā)匯合過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體;
對所述原子狀態(tài)向后轉(zhuǎn)移器實(shí)體執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作失敗時(shí),執(zhí)行所述并發(fā)回調(diào)實(shí)體。
一種并發(fā)調(diào)用裝置,包括:
語義需求文檔獲取模塊,用于:
接收用戶對編程語言的選擇指令,確定編程語言;
查詢與編程語言相應(yīng)的語義需求文檔,所述語義需求文檔包括邏輯接口和與邏輯接口相應(yīng)的語義需求;所述邏輯接口包括并發(fā)過程接口、并發(fā)回調(diào)接口、線性緩沖區(qū)接口、原子狀態(tài)機(jī)初始化器接口、原子狀態(tài)向前轉(zhuǎn)移器接口、原子狀態(tài)向后轉(zhuǎn)移器接口、二元信號量接口、并發(fā)調(diào)用器接口中的一種或多種;
協(xié)作代碼獲取模塊,用于:
接收用戶對協(xié)作過程的選擇指令,確定協(xié)作過程;所述協(xié)作過程包括同步并發(fā)調(diào)用過程、異步并發(fā)調(diào)用過程、并發(fā)分支過程和并發(fā)匯合過程;
查詢與協(xié)作過程相應(yīng)的協(xié)作代碼;
調(diào)用模塊,用于:
確定與協(xié)作過程相應(yīng)的邏輯接口;
根據(jù)語義需求文檔,實(shí)現(xiàn)與協(xié)作過程相應(yīng)的邏輯接口的功能;
根據(jù)與協(xié)作過程相應(yīng)的邏輯接口,調(diào)用協(xié)作代碼,以實(shí)現(xiàn)用戶需求。
在上述實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述同步并發(fā)調(diào)用過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)二元信號量實(shí)體、m個(gè)并發(fā)過程實(shí)體和n個(gè)并發(fā)調(diào)用器實(shí)體;m和n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第一求和變量;
以所述第一求和變量為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第一緩沖區(qū)變量;
創(chuàng)建并發(fā)回調(diào)實(shí)體,所述并發(fā)回調(diào)實(shí)體的執(zhí)行邏輯為:對所述二元信號量實(shí)體執(zhí)行釋放操作;
以所述第一緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;
對所述第一緩沖區(qū)變量執(zhí)行取出操作,保存輸出為x(0)變量;
以任意次序執(zhí)行所述m個(gè)并發(fā)過程實(shí)體,其中第i個(gè)被執(zhí)行的并發(fā)過程實(shí)體以x(i-1)變量和所述并發(fā)回調(diào)實(shí)體為輸入,保存輸出為x(i)變量;i為正整數(shù),i≤m;
對x(m)變量執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作成功時(shí),對所述二元信號量實(shí)體執(zhí)行等待操作。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述異步并發(fā)調(diào)用過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第二求和變量;
以所述第二求和變量和數(shù)值1的作差結(jié)果為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第二緩沖區(qū)變量;
以所述第二緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述并發(fā)分支過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)向前轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);
對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第三求和變量;
以所述第三求和變量為輸入,對所述原子狀態(tài)向前轉(zhuǎn)移器實(shí)體執(zhí)行向前轉(zhuǎn)移操作,保存輸出為第三緩沖區(qū)變量;
以所述第三緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;
對所述第三緩沖區(qū)變量執(zhí)行取出操作,保存輸出為向后轉(zhuǎn)移器變量;
輸出所述向后轉(zhuǎn)移器變量。
在上述任意實(shí)施例的基礎(chǔ)上,進(jìn)一步地,所述并發(fā)匯合過程包括:
接收用戶輸入的一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體;
對所述原子狀態(tài)向后轉(zhuǎn)移器實(shí)體執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作失敗時(shí),執(zhí)行所述并發(fā)回調(diào)實(shí)體。
本發(fā)明的有益效果是:
本發(fā)明提供了并發(fā)調(diào)用方法及裝置,在傳統(tǒng)串行調(diào)用的基礎(chǔ)上增加了并發(fā)調(diào)用的概念,向用戶提供了基于同步并發(fā)調(diào)用和異步并發(fā)調(diào)用的新型并發(fā)程序設(shè)計(jì)方式。該方法規(guī)定了一系列邏輯接口與協(xié)作,使得用戶在開發(fā)并發(fā)程序時(shí)只需關(guān)注這些語義的實(shí)現(xiàn)即可為不同平臺生成高效的并發(fā)程序可執(zhí)行代碼,無論是共享內(nèi)存的多核程序,還是cpu、gpu協(xié)同的并發(fā)程序,或者是工作在集群中的并發(fā)程序,均可使用該并發(fā)調(diào)用方法,在不以損耗性能為代價(jià)的前提下,使用戶便捷地編寫出更高效的并發(fā)程序成為可能。
附圖說明
下面結(jié)合附圖和實(shí)施例對本發(fā)明進(jìn)一步說明。
圖1示出了本發(fā)明實(shí)施例提供的并發(fā)調(diào)用方法的流程圖;
圖2示出了本發(fā)明實(shí)施例提供的并發(fā)調(diào)用裝置的結(jié)構(gòu)示意圖;
圖3~圖5示出了本發(fā)明實(shí)施例提供的邏輯接口之間的關(guān)系示意圖。
具體實(shí)施方式
實(shí)體是編程語言定義的程序運(yùn)行時(shí)的可用資源。實(shí)體可以具有語義;特定語義在程序運(yùn)行時(shí)執(zhí)行將產(chǎn)生特定效果。
例如,在c++語言中,實(shí)體可以是基本數(shù)據(jù)類型、指針、對象等?;緮?shù)據(jù)類型包括不同位數(shù)的有符號整數(shù)、不同位數(shù)的無符號整數(shù)、不同位數(shù)的浮點(diǎn)數(shù)、布爾值等。整數(shù)通??梢跃哂屑臃?、減法、乘法、除法等語義。指針通??梢跃哂袑ぶ返日Z義。對象包含c++標(biāo)準(zhǔn)庫類的實(shí)例化對象、用戶定義類的實(shí)例化對象、lambda表達(dá)式等,其語義通常由其成員函數(shù)的語義定義。
邏輯接口是語義的邏輯描述的集合。一個(gè)包含n個(gè)語義的邏輯描述的邏輯接口的實(shí)體是m個(gè)實(shí)體的集合;其中n和m均為正整數(shù)。若所述集合中所有實(shí)體具有的全部語義不重復(fù)地包含所述邏輯接口中描述的全部語義,則稱所述多個(gè)實(shí)體的集合是所述邏輯接口的實(shí)體。
“邏輯接口”通常不能直接用于編程,而是要首先根據(jù)其包含的邏輯描述得到符合所使用編程語言語法規(guī)則的標(biāo)準(zhǔn)化文檔。例如,定義“基本鎖邏輯接口”具有“加鎖”和“解鎖”語義;其中加鎖操作將阻塞當(dāng)前執(zhí)行者,直到獲取當(dāng)前實(shí)體所有權(quán);解鎖操作在當(dāng)前執(zhí)行者擁有當(dāng)前實(shí)體所有權(quán)的前提下釋放所有權(quán)。在c++語言中,c++標(biāo)準(zhǔn)[iso/iec14882:2014informationtechnology—programminglanguages—c++[j].internationalorganizationforstandardization,geneva,switzerland,2014.]定義的basiclockablerequirements即可視為所述基本鎖邏輯接口的c++標(biāo)準(zhǔn)化文檔:
atypelmeetsthebasiclockablerequirementsifthefollowingexpressionsarewell-formedandhavethespecifiedsemantics(mdenotesavalueoftypel).
m.lock()
effects:blocksuntilalockcanbeacquiredforthecurrentexecutionagent.ifanexceptionisthrownthenalockshallnothavebeenacquiredforthecurrentexecutionagent.
m.unlock()
requires:thecurrentexecutionagentshallholdalockonm.
effects:releasesalockonmheldbythecurrentexecutionagent.
throws:nothing.
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不限定本發(fā)明。
具體實(shí)施例一
如圖1所示,本發(fā)明實(shí)施例提供了一種并發(fā)調(diào)用方法,包括:
語義需求文檔獲取步驟s101:
接收用戶對編程語言的選擇指令,確定編程語言;
查詢與編程語言相應(yīng)的語義需求文檔,所述語義需求文檔包括邏輯接口和與邏輯接口相應(yīng)的語義需求;所述邏輯接口包括并發(fā)過程接口、并發(fā)回調(diào)接口、線性緩沖區(qū)接口、原子狀態(tài)機(jī)初始化器接口、原子狀態(tài)向前轉(zhuǎn)移器接口、原子狀態(tài)向后轉(zhuǎn)移器接口、二元信號量接口、并發(fā)調(diào)用器接口中的一種或多種;
協(xié)作代碼獲取步驟s102:
接收用戶對協(xié)作過程的選擇指令,確定協(xié)作過程;所述協(xié)作過程包括同步并發(fā)調(diào)用過程、異步并發(fā)調(diào)用過程、并發(fā)分支過程和并發(fā)匯合過程;
查詢與協(xié)作過程相應(yīng)的協(xié)作代碼;
調(diào)用步驟s103:
確定與協(xié)作過程相應(yīng)的邏輯接口;
根據(jù)語義需求文檔,實(shí)現(xiàn)與協(xié)作過程相應(yīng)的邏輯接口的功能;
根據(jù)與協(xié)作過程相應(yīng)的邏輯接口,調(diào)用協(xié)作代碼,以實(shí)現(xiàn)用戶需求。
本發(fā)明實(shí)施例在傳統(tǒng)串行調(diào)用的基礎(chǔ)上增加了并發(fā)調(diào)用的概念,向用戶提供了基于同步并發(fā)調(diào)用和異步并發(fā)調(diào)用的新型并發(fā)程序設(shè)計(jì)方式。該方法規(guī)定了一系列邏輯接口與協(xié)作,使得用戶在開發(fā)并發(fā)程序時(shí)只需關(guān)注這些語義的實(shí)現(xiàn)即可為不同平臺生成高效的并發(fā)程序可執(zhí)行代碼,無論是共享內(nèi)存的多核程序,還是cpu、gpu協(xié)同的并發(fā)程序,或者是工作在集群中的并發(fā)程序,均可使用該并發(fā)調(diào)用方法,在不以損耗性能為代價(jià)的前提下,使用戶便捷地編寫出更高效的并發(fā)程序成為可能。
本發(fā)明實(shí)施例對同步并發(fā)調(diào)用過程不做限定,優(yōu)選的,所述同步并發(fā)調(diào)用過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)二元信號量實(shí)體、m個(gè)并發(fā)過程實(shí)體和n個(gè)并發(fā)調(diào)用器實(shí)體;m和n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第一求和變量;以所述第一求和變量為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第一緩沖區(qū)變量;創(chuàng)建并發(fā)回調(diào)實(shí)體,所述并發(fā)回調(diào)實(shí)體的執(zhí)行邏輯為:對所述二元信號量實(shí)體執(zhí)行釋放操作;以所述第一緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;對所述第一緩沖區(qū)變量執(zhí)行取出操作,保存輸出為x(0)變量;以任意次序執(zhí)行所述m個(gè)并發(fā)過程實(shí)體,其中第i個(gè)被執(zhí)行的并發(fā)過程實(shí)體以x(i-1)變量和所述并發(fā)回調(diào)實(shí)體為輸入,保存輸出為x(i)變量;i為正整數(shù),i≤m;對x(m)變量執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作成功時(shí),對所述二元信號量實(shí)體執(zhí)行等待操作。其中,初始化操作和創(chuàng)建并發(fā)回調(diào)實(shí)體這兩個(gè)步驟可以并發(fā)執(zhí)行,而激活操作和取出操作這兩個(gè)步驟可以交換順序。
本發(fā)明實(shí)施例對異步并發(fā)調(diào)用過程不做限定,優(yōu)選的,所述異步并發(fā)調(diào)用過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第二求和變量;以所述第二求和變量和數(shù)值1的作差結(jié)果為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第二緩沖區(qū)變量;以所述第二緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作。
本發(fā)明實(shí)施例對并發(fā)分支過程不做限定,優(yōu)選的,所述并發(fā)分支過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)向前轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第三求和變量;以所述第三求和變量為輸入,對所述原子狀態(tài)向前轉(zhuǎn)移器實(shí)體執(zhí)行向前轉(zhuǎn)移操作,保存輸出為第三緩沖區(qū)變量;以所述第三緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;對所述第三緩沖區(qū)變量執(zhí)行取出操作,保存輸出為向后轉(zhuǎn)移器變量;輸出所述向后轉(zhuǎn)移器變量。
本發(fā)明實(shí)施例對并發(fā)匯合過程不做限定,優(yōu)選的,所述并發(fā)匯合過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體;對所述原子狀態(tài)向后轉(zhuǎn)移器實(shí)體執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作失敗時(shí),執(zhí)行所述并發(fā)回調(diào)實(shí)體。
本發(fā)明實(shí)施例對編程語言不做限定,用戶可以根據(jù)自身喜好選用編程語言,優(yōu)選的,所述編程語言可以為c++、java、或python。
優(yōu)選的,本發(fā)明實(shí)施例中,對原子狀態(tài)機(jī)初始化器實(shí)體的初始化操作和原子狀態(tài)向前轉(zhuǎn)移器實(shí)體的向前轉(zhuǎn)移操作的輸出執(zhí)行取出操作,得到的實(shí)體既是原子狀態(tài)向前轉(zhuǎn)移器實(shí)體又是原子狀態(tài)向后轉(zhuǎn)移器實(shí)體。
該方法面向用戶提供可直接使用的同步并發(fā)調(diào)用和異步并發(fā)調(diào)用接口,其使用需要用戶提供符合相應(yīng)語義描述的組件實(shí)現(xiàn)。本方法規(guī)定了邏輯接口(logicinterfaces)和協(xié)作過程(collaborationsprocedures)。邏輯接口定義了用戶使用本方法可能需要實(shí)現(xiàn)的邏輯需求,共分為兩類,分別是執(zhí)行邏輯接口(executionlogicinterfaces)和控制邏輯接口(controllogicinterfaces)。執(zhí)行邏輯接口共2種,分別為:并發(fā)過程接口、并發(fā)回調(diào)接口;控制邏輯接口共6種,規(guī)定了本方法依賴的控制邏輯,分別為:線性緩沖區(qū)接口、原子狀態(tài)機(jī)初始化器接口、原子狀態(tài)向前轉(zhuǎn)移器接口、原子狀態(tài)向后轉(zhuǎn)移器接口、二元信號量接口和并發(fā)調(diào)用器接口。本發(fā)明實(shí)施例對協(xié)作過程不做限定,優(yōu)選的,所述協(xié)作過程可以包括同步并發(fā)調(diào)用(syncconcurrentinvoke)過程、異步并發(fā)調(diào)用(asyncconcurrentinvoke)過程、并發(fā)分支過程(concurrentforkprocedure)和并發(fā)匯合過程(concurrentjoinprocedure)。
在大部分并發(fā)需求中,若干個(gè)并發(fā)任務(wù)總是需要在某個(gè)時(shí)刻同時(shí)被異步執(zhí)行,每個(gè)任務(wù)在被執(zhí)行完畢后與其他任務(wù)同步。此處的任務(wù)是一個(gè)比“子程序”更靈活的概念——一個(gè)任務(wù)的執(zhí)行可以涉及多種執(zhí)行方式,例如多線程、多進(jìn)程、多處理器、多機(jī)、集群等,任務(wù)的開始和結(jié)束也可以不同方式發(fā)生。由于每次并發(fā)調(diào)用互相不依賴,每次并發(fā)調(diào)用方式的選取皆是獨(dú)立的,并發(fā)調(diào)用的使用可以任意方式組合、嵌套,像傳統(tǒng)的串行調(diào)用一樣靈活。
如圖3~圖5所示,本發(fā)明實(shí)施例中,對于邏輯接口的限定可以如下所述。
并發(fā)過程接口:一個(gè)并發(fā)過程(concurrentprocedure)實(shí)體是一段程序,其執(zhí)行依賴于一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體和一個(gè)并發(fā)回調(diào)實(shí)體;其執(zhí)行結(jié)束后輸出一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體。
并發(fā)回調(diào)接口:一個(gè)并發(fā)回調(diào)(concurrentcallback)實(shí)體是一段程序,其執(zhí)行不依賴任何輸入;其執(zhí)行結(jié)束后的輸出未定義。
線性緩沖區(qū)接口:一個(gè)線性緩沖區(qū)(linearbuffer)實(shí)體是存儲了若干某種類型實(shí)體的、可逐個(gè)取出的容器,具有取出(fetch)的語義。對于某種類型實(shí)體e的線性緩沖區(qū),如果可以斷言該緩沖區(qū)非空,用戶對其執(zhí)行取出操作期望得到一個(gè)e的實(shí)體。一個(gè)線性緩沖區(qū)不一定存在上界;對于同一個(gè)線性緩沖區(qū)的先后兩次取出操作可能得到相同的實(shí)體。
原子狀態(tài)機(jī)(atomicstatemachine)是支持原子操作的狀態(tài)機(jī),存在n種狀態(tài)可以一一映射到小于n的全部非負(fù)整數(shù);n為正整數(shù)。
原子狀態(tài)機(jī)初始化器邏輯接口(atomicstatemachineinitializerinterface)包含初始化(initialize)的語義,其執(zhí)行依賴于一個(gè)非負(fù)整數(shù)n,其作用包含初始化一個(gè)具有初始狀態(tài)映射數(shù)值為n的原子狀態(tài)機(jī)實(shí)體,輸出一個(gè)線性緩沖區(qū)實(shí)體;對所述線性緩沖區(qū)實(shí)體執(zhí)行的前(n+1)次取出操作中的每一次均應(yīng)得到一個(gè)依賴于所述原子狀態(tài)機(jī)的原子狀態(tài)機(jī)向后轉(zhuǎn)移器實(shí)體。
原子狀態(tài)向前轉(zhuǎn)移器邏輯接口(atomicstateforwardtransferinterface)包含向前轉(zhuǎn)移(forwardtransfer)的語義。一個(gè)原子狀態(tài)向前轉(zhuǎn)移器實(shí)體對應(yīng)一個(gè)狀態(tài)映射數(shù)值為n的原子狀態(tài)機(jī)實(shí)體,其向前轉(zhuǎn)移語義的執(zhí)行依賴于一個(gè)非負(fù)整數(shù)m,其作用包含原子地將所述原子狀態(tài)機(jī)實(shí)體狀態(tài)轉(zhuǎn)移至數(shù)值(n+m)所映射的狀態(tài),輸出一個(gè)線性緩沖區(qū)實(shí)體;對所述線性緩沖區(qū)實(shí)體執(zhí)行的前(m+1)次取出操作中的每一次均應(yīng)得到一個(gè)依賴于所述原子狀態(tài)機(jī)的原子狀態(tài)機(jī)向后轉(zhuǎn)移器實(shí)體。
原子狀態(tài)向后轉(zhuǎn)移器邏輯接口(atomicstatebackwardtransferinterface)包含向后轉(zhuǎn)移(backwardtransfer)的語義。一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體對應(yīng)一個(gè)狀態(tài)映射數(shù)值為n的原子狀態(tài)機(jī)實(shí)體,若n大于零,則其向后轉(zhuǎn)移語義的執(zhí)行應(yīng)成功,其作用包含原子地將所述原子狀態(tài)機(jī)實(shí)體狀態(tài)轉(zhuǎn)移至數(shù)值(n-1)所映射的狀態(tài);否則,即n等于零,則其向后轉(zhuǎn)移語義執(zhí)行應(yīng)失敗。
二元信號量接口:一個(gè)二元信號量(binarysemaphore)實(shí)體是一個(gè)同步原語,具有等待(wait)和釋放(release)語義。[dijkstra,edsgerw."cooperatingsequentialprocesses(ewd-123).ewdijkstraarchive."centerforamericanhistory,universityoftexasataustin(1965).]當(dāng)一個(gè)二元信號量實(shí)體a被初始化后,對其執(zhí)行等待操作將阻塞程序的運(yùn)行,該阻塞將在其他程序?qū)一次執(zhí)行釋放操作后解除。上述情形中的對a的等待操作與釋放操作同步。
并發(fā)調(diào)用器接口:一個(gè)并發(fā)調(diào)用器(concurrentinvoker)實(shí)體具有激活(activate)和調(diào)用計(jì)數(shù)(invocationcount)語義。激活一個(gè)并發(fā)調(diào)用器實(shí)體需要提供一個(gè)至少包含調(diào)用計(jì)數(shù)個(gè)數(shù)的依賴于同一原子狀態(tài)機(jī)實(shí)體的原子狀態(tài)機(jī)向后轉(zhuǎn)移器實(shí)體的線性緩沖區(qū)實(shí)體和一個(gè)并發(fā)回調(diào)實(shí)體。調(diào)用計(jì)數(shù)操作的執(zhí)行輸出一個(gè)非負(fù)整數(shù)。當(dāng)一個(gè)并發(fā)調(diào)用器被激活后,應(yīng)在未來對輸入的線性緩沖區(qū)實(shí)體執(zhí)行調(diào)用計(jì)數(shù)個(gè)數(shù)的取出操作,并執(zhí)行調(diào)用計(jì)數(shù)次數(shù)的并發(fā)匯合操作。
在上述的具體實(shí)施例一中,提供了一種并發(fā)調(diào)用方法,與之相對應(yīng)的,本申請還提供一種并發(fā)調(diào)用裝置。由于裝置實(shí)施例基本相似于方法實(shí)施例,所以描述得比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。下述描述的裝置實(shí)施例僅僅是示意性的。
具體實(shí)施例二
如圖2所示,本發(fā)明實(shí)施例提供了一種并發(fā)調(diào)用裝置,包括:
語義需求文檔獲取模塊201,用于:
接收用戶對編程語言的選擇指令,確定編程語言;
查詢與編程語言相應(yīng)的語義需求文檔,所述語義需求文檔包括邏輯接口和與邏輯接口相應(yīng)的語義需求;所述邏輯接口包括并發(fā)過程接口、并發(fā)回調(diào)接口、線性緩沖區(qū)接口、原子狀態(tài)機(jī)初始化器接口、原子狀態(tài)向前轉(zhuǎn)移器接口、原子狀態(tài)向后轉(zhuǎn)移器接口、二元信號量接口、并發(fā)調(diào)用器接口中的一種或多種;
協(xié)作代碼獲取模塊202,用于:
接收用戶對協(xié)作過程的選擇指令,確定協(xié)作過程;所述協(xié)作過程包括同步并發(fā)調(diào)用過程、異步并發(fā)調(diào)用過程、并發(fā)分支過程和并發(fā)匯合過程;
查詢與協(xié)作過程相應(yīng)的協(xié)作代碼;
調(diào)用模塊203,用于:
確定與協(xié)作過程相應(yīng)的邏輯接口;
根據(jù)語義需求文檔,實(shí)現(xiàn)與協(xié)作過程相應(yīng)的邏輯接口的功能;
根據(jù)與協(xié)作過程相應(yīng)的邏輯接口,調(diào)用協(xié)作代碼,以實(shí)現(xiàn)用戶需求。
本發(fā)明實(shí)施例在傳統(tǒng)串行調(diào)用的基礎(chǔ)上增加了并發(fā)調(diào)用的概念,向用戶提供了基于同步并發(fā)調(diào)用和異步并發(fā)調(diào)用的新型并發(fā)程序設(shè)計(jì)方式。該方法規(guī)定了一系列邏輯接口與協(xié)作,使得用戶在開發(fā)并發(fā)程序時(shí)只需關(guān)注這些語義的實(shí)現(xiàn)即可為不同平臺生成高效的并發(fā)程序可執(zhí)行代碼,無論是共享內(nèi)存的多核程序,還是cpu、gpu協(xié)同的并發(fā)程序,或者是工作在集群中的并發(fā)程序,均可使用該并發(fā)調(diào)用方法,在不以損耗性能為代價(jià)的前提下,使用戶便捷地編寫出更高效的并發(fā)程序成為可能。
本發(fā)明實(shí)施例對同步并發(fā)調(diào)用過程不做限定,優(yōu)選的,所述同步并發(fā)調(diào)用過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)二元信號量實(shí)體、m個(gè)并發(fā)過程實(shí)體和n個(gè)并發(fā)調(diào)用器實(shí)體;m和n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第一求和變量;以所述第一求和變量為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第一緩沖區(qū)變量;創(chuàng)建并發(fā)回調(diào)實(shí)體,所述并發(fā)回調(diào)實(shí)體的執(zhí)行邏輯為:對所述二元信號量實(shí)體執(zhí)行釋放操作;以所述第一緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;對所述第一緩沖區(qū)變量執(zhí)行取出操作,保存輸出為x(0)變量;以任意次序執(zhí)行所述m個(gè)并發(fā)過程實(shí)體,其中第i個(gè)被執(zhí)行的并發(fā)過程實(shí)體以x(i-1)變量和所述并發(fā)回調(diào)實(shí)體為輸入,保存輸出為x(i)變量;i為正整數(shù),i≤m;對x(m)變量執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作成功時(shí),對所述二元信號量實(shí)體執(zhí)行等待操作。其中,初始化操作和創(chuàng)建并發(fā)回調(diào)實(shí)體這兩個(gè)步驟可以并發(fā)執(zhí)行,而激活操作和取出操作這兩個(gè)步驟可以交換順序。
本發(fā)明實(shí)施例對異步并發(fā)調(diào)用過程不做限定,優(yōu)選的,所述異步并發(fā)調(diào)用過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)機(jī)初始化器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第二求和變量;以所述第二求和變量和數(shù)值1的作差結(jié)果為輸入,對所述原子狀態(tài)機(jī)初始化器實(shí)體執(zhí)行初始化操作,保存輸出為第二緩沖區(qū)變量;以所述第二緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作。
本發(fā)明實(shí)施例對并發(fā)分支過程不做限定,優(yōu)選的,所述并發(fā)分支過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)向前轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體、n個(gè)并發(fā)調(diào)用器實(shí)體;n為非負(fù)整數(shù);對所述n個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行調(diào)用計(jì)數(shù)操作,對調(diào)用計(jì)數(shù)操作的輸出執(zhí)行求和操作,保存求和操作的輸出為第三求和變量;以所述第三求和變量為輸入,對所述原子狀態(tài)向前轉(zhuǎn)移器實(shí)體執(zhí)行向前轉(zhuǎn)移操作,保存輸出為第三緩沖區(qū)變量;以所述第三緩沖區(qū)變量和所述并發(fā)回調(diào)實(shí)體為輸入,以任意次序?qū)λ鰊個(gè)并發(fā)調(diào)用器實(shí)體執(zhí)行激活操作;對所述第三緩沖區(qū)變量執(zhí)行取出操作,保存輸出為向后轉(zhuǎn)移器變量;輸出所述向后轉(zhuǎn)移器變量。
本發(fā)明實(shí)施例對并發(fā)匯合過程不做限定,優(yōu)選的,所述并發(fā)匯合過程可以包括:接收用戶輸入的一個(gè)原子狀態(tài)向后轉(zhuǎn)移器實(shí)體、一個(gè)并發(fā)回調(diào)實(shí)體;對所述原子狀態(tài)向后轉(zhuǎn)移器實(shí)體執(zhí)行向后轉(zhuǎn)移操作,并當(dāng)該操作失敗時(shí),執(zhí)行所述并發(fā)回調(diào)實(shí)體。
本發(fā)明實(shí)施例對編程語言不做限定,用戶可以根據(jù)自身喜好選用編程語言,優(yōu)選的,所述編程語言可以為c++、java、或python。
需要說明的是,在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。盡管本發(fā)明已進(jìn)行了一定程度的描述,明顯地,在不脫離本發(fā)明的精神和范圍的條件下,可進(jìn)行各個(gè)條件的適當(dāng)變化??梢岳斫?,本發(fā)明不限于所述實(shí)施方案,而歸于權(quán)利要求的范圍,其包括所述每個(gè)因素的等同替換。