kotlin 流水線素數

2021-10-07 05:05:00 字數 3094 閱讀 7275

標籤(空格分隔): kotlin

fun numbersfrom(context: coroutinecontext, start: int) = produce(context)
fun filter(context: coroutinecontext, numbers: receivechannel, prime: int) = produce(context)
fun main(args: array) = runblocking

coroutinecontext.cancelchildren() // 取消所有的子協程,從而讓主線程退出

}

粗解:

numbersfrom(2) -> filter(2) -> filter(3) -> filter(5) -> filter(7) ...

filter(3, filter(2, numbers))

細解:首先他的思想就是有乙個資料流:

[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],他首先用2進行過濾,能被2整除的都去除,

這樣就剩下了[3,5,7,9,11,13,15,17,19],然後用3進行過濾【此處遺留3】,

剩下了[5,7,11,13,15,17,19],然後用5進行過濾【此處遺留5】,

剩下了[7,11,13,17,19],此時用7進行過濾【此處遺留7】,

剩下了[11,13,17,19],然後用11進行過濾【此處遺留11】,

剩下了[13,17,19],然後用13進行過濾【此處遺留13】,

剩下了[17,19],然後用17進行過濾【此處遺留17】,

剩下了[19],然後用17進行過濾【此處遺留17

剩下了上面是處理的思想;

**[此處可忽略不看]**具體的操作:首先產生了乙個通道資料流numberfrom,發出了數字2,資料流掛起,2被接收,通道資料流numberfrom發出了數字3,又掛起;此時同時列印出了2,然後進入filter(cur,2),在這裡面,從cur通道裡面取出3,判斷之後send(3)掛起,此時numberfrom發出4後掛起,而filter(cur,2)也返回乙個通道資料流cur2[針對素數2],然後receive[3],此時cur過濾掉4,列印3,然後filter(cur2,3)開始跑起來,但是目前資料流是空的;

接著看,此時cur通道處理4,直接移除,此時numberfrom發出5後掛起,filter(cur,2)從中取出5,判斷send(5)後掛起,[同時numberfrom發出6後掛起,filter(cur,2)直接過濾掉,numberfrom發出7後掛起,filter(cur,2)send(7)後掛起,filter(cur2,3)send(7)後掛起,同時filter(cur3,5)資料流生成,也是空的,此時收到了7,然後send(7)後掛起,又到了一輪的receive],filter(cur2,3)拿到5,send(5)之後掛起,第三輪開啟,receive(5)之後列印

上面很亂的,因為把很多同時做的事情不好同時表述:

一次整理:

發到哪呢?此時filter返回了乙個資料流,也叫cur,[此處是復用,為了區分,我們把它叫做cur2=filter(cur,2)]

第一輪算是結束了,開始第二輪

注釋1處,receive了3

3被列印此時將cur2和數字3傳到filter中[看注釋2,看注釋2處,此時cur2中只有數字5,(5%3!=0)]

經過判斷,發出了數字5,掛起;同時返回資料流通道cur3=filter(cur2,3)

cur3中進行過濾判斷,發出了5,掛起

此時第二輪結束,開始第三輪

5被receive

cur3中收到了9,但是此時cur3剛發出了7,還沒有被receive消耗,所以9暫時存在cur2中

5被列印將cur3和5傳參到filter,cur5=filter(cur3,5)

注釋4處,此時cur3中只有7,7進行判斷過濾,發出了7,掛起

cur3中過濾掉了9

cur3中的接收了11,cur2中接收了12,cur中接收了來自numberfrom中的13 //注釋5

什麼掛起呢?自然是它返回的資料流通道cur5掛起

此時第三輪結束,開始第四輪

7被receive

7被列印此時cur7=filter(cur5,7)誕生,它發出了cur5中的11,掛起 //注釋6

cur3過濾掉了15,接收了17,cur2接收了18,cur接收了19

此時第四輪結束,開始第五輪

注釋6處,11被receive

11被列印cur7中的11被消耗了

依次往前推…

上面的細推如果看懂了,那就基本理解了整個的處理思想和流程,大道化簡

cur=numberfrom() -> cur2=filter(context,cur,2) -> cur3=filter(context,cur2,3) -> cur5=filter(context,cur3,5) -> cur7=filter(context,cur5,7)....

//再化簡

cur=numberfrom() -> cur2=filter(cur,2) -> cur3=filter(cur2,3) -> cur5=filter(cur3,5) -> cur7=filter(cur5,7)....

//再化簡

filter(7,filter(5,filter(3, filter(2, numberfrom))))....

流水線排程

n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a i 和b i 你可以安排每個作業的執行順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。求這個最少的時間...

流水線冒險

流水線冒險 回顧一下常用五階段流水線 f 取指 d 解碼 e 執行 m 訪存 w 寫回 注意 對暫存器檔案的寫只有在時鐘上公升的時候才會更新!資料冒險的原因 對暫存器檔案的讀寫是在不同階段進行的 1.用暫停來避免資料冒險 暫停時,處理器會停止流水線中一條或多條指令,直到冒險條件不再滿足。在本該正常處...

渲染流水線

應用階段 cpu準備資料,skinmeshrender,meshfilter,meshrender 頂點資料,三角形資料,法線資料,切線資料,渲染設定指令,紋理資料,uv資料 由cpu傳送給gpu,即一次drawcall 幾何階段 頂點變換,計算頂點顏色 如逐頂點光照 齊次裁剪空間,透視除法,歸一化...