首頁(yè) > 評(píng)測(cè) > One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二

One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二

  • 作者:
  • 來(lái)源:21ic
  • [導(dǎo)讀]
  • 任務(wù)分配與同步是多核編程的最重要問(wèn)題

image1_copy.jpg

圖 任務(wù)分配與同步是多核編程的最重要問(wèn)題

多核心與并行概述

Single core processors are a shrinking minority of all the processors in the world. Multicore processors, offering parallel computing, have displaced single core processors permanently. The future of computing is parallel computing, and the future of programming is parallel programming.

-James Reinders. from Intel

為英文不熟的同學(xué)翻譯一下子:

單核處理器是處理器世界中正在不斷縮減規(guī)模的少數(shù)群體.多核處理器因?yàn)槟軌蛱峁┎⑿杏?jì)算,正在永久性地替代單核處理器的地位.未來(lái)的計(jì)算將是并行計(jì)算的天下,未來(lái)的編程亦將是并行編程的天下.

因?yàn)檎f(shuō)這話(huà)的人是Intel的工程師,所以嵌入式系統(tǒng)的工程師聽(tīng)起來(lái)多多少少可能覺(jué)得未免危言聳聽(tīng)了.但是從過(guò)去幾十年的科技發(fā)展經(jīng)驗(yàn)來(lái)看,嵌入式系統(tǒng)的發(fā)展總是慢慢會(huì)跟隨桌面計(jì)算,服務(wù)器計(jì)算的道路,只是稍稍慢那么一拍而已.考慮到硬件的發(fā)展速度終將不能以摩爾速度無(wú)限制的發(fā)展下去,多核與并行的概念引入在嵌入式系統(tǒng)中可能比大多數(shù)人預(yù)計(jì)的要更早一些吧.作者本人也覺(jué)得如同OS概念一樣,多核與并行的概念在嵌入式系統(tǒng)上與桌面/服務(wù)器系統(tǒng)上僅僅只是規(guī)模上的差別,不存在本質(zhì)的區(qū)別.

目前而言,作者認(rèn)為嵌入式系統(tǒng)的多核與桌面/服務(wù)器系統(tǒng)的多核有以下顯著的差別:

1. 相對(duì)而言,嵌入式系統(tǒng)對(duì)運(yùn)算的要求不是那么苛刻,所以數(shù)學(xué)運(yùn)算方面的庫(kù)函數(shù)暫時(shí)無(wú)需特別定制的并行版本;

2. 因?yàn)榍度胧较到y(tǒng)的多核心多采用big-LITTLE的非對(duì)稱(chēng)架構(gòu),故此一般有一個(gè)核心為主,其余核心都屬于從,比較類(lèi)似于協(xié)處理器的概念,但是與FPU等協(xié)處理器不同的是這些從核心自主性都很高;

3. 因?yàn)樯鲜龅腷ig-LITTLE的架構(gòu),故此任務(wù)的分配上從算法上來(lái)講要簡(jiǎn)單一些,但是與硬件耦合較為緊密;所以目前桌面/服務(wù)器系統(tǒng)上的多核框架如OpenMP,OpenCL還不能簡(jiǎn)單的搬來(lái)利用;

4. 操作系統(tǒng)中的thread概念一般被認(rèn)為是并行編程的低級(jí)別并行,桌面/服務(wù)器系統(tǒng)中目前的趨勢(shì)是拋棄thread這種低級(jí)操作,直接使用高級(jí)并行框架如OpenMP,Clik Plus等等將整個(gè)系統(tǒng)看作一個(gè)整體,由框架來(lái)分配任務(wù).嵌入式系統(tǒng)對(duì)應(yīng)thread的是各種RTOS的task,這種低等級(jí)的并行操作的標(biāo)準(zhǔn)度很低.所以如何將整個(gè)嵌入式處理器視作一個(gè)整體來(lái)隱式進(jìn)行并行編程可能是最后完成的任務(wù).

我們看一個(gè)例子:

 

TIM截圖20180123164326.jpg

 

這段代碼在桌面計(jì)算機(jī)中以注釋中的命令行build之后運(yùn)行:

Hello, world.

Hello, world.

Hello, world.

Hello, world.

這是Open MP架構(gòu)與工具鏈結(jié)合,將受控語(yǔ)句分別分配給四個(gè)核心(作者的實(shí)驗(yàn)電腦)運(yùn)行.這個(gè)例子如果使用thread來(lái)做,創(chuàng)建多個(gè)thread,那么移植到嵌入式平臺(tái)就好辦了.但是由于硬件,OS,Library等等的不標(biāo)準(zhǔn),目前在嵌入式系統(tǒng)的開(kāi)發(fā)中做到如上述代碼這樣的自動(dòng)化并行程度.

從上面的例子可以得知,嵌入式系統(tǒng)的并行計(jì)算還與桌面/服務(wù)器領(lǐng)域的發(fā)展趨勢(shì)還有一大段距離.感興趣的同學(xué)可以去自行了解一下子:Open MP, Open CL, Intel CLik Plus, MPI這幾個(gè)項(xiàng)目.目前看來(lái)嵌入式平臺(tái)的多核架構(gòu)類(lèi)似于操作系統(tǒng)的多個(gè)進(jìn)程.作者還是從這個(gè)層面來(lái)做一些實(shí)驗(yàn)來(lái)展示相關(guān)的并行概念.

Practice: Mutex-資源互鎖

PSoC6的特點(diǎn)是雙核心都能同時(shí)訪(fǎng)問(wèn)外設(shè)與內(nèi)存.上一集的Demo正是兩個(gè)內(nèi)核分別控制LED進(jìn)行閃爍.那么如果兩個(gè)內(nèi)核同時(shí)訪(fǎng)問(wèn)同一外設(shè)會(huì)怎樣,比如UART.以下做個(gè)實(shí)驗(yàn)試驗(yàn)一下子.

首先在上次實(shí)驗(yàn)的基礎(chǔ)上拖入一個(gè)UART來(lái),直接從右邊的工具盒子里面拖.

image2.png

圖 拖入一個(gè)UART

把波特率配置好之后,其余參數(shù)都用默認(rèn)的.

image3.png

圖 根據(jù)這個(gè)把引腳配置

用這個(gè)函數(shù)試驗(yàn)一下子簡(jiǎn)單的串口輸出是否OK,過(guò)程不多講:

uint32_t Cy_SCB_UART_Put      (CySCB_Type *base, uint32_t data);

確認(rèn)串口工作之后,重定向STDOUT到串口,也就是要用printf做輸出.(其實(shí)這實(shí)驗(yàn)直接使用底層串口輸出函數(shù)也可以進(jìn)行,只是重定向STDOUT這個(gè)以后要經(jīng)常使用,順帶一題.)

因?yàn)楸鞠盗形恼碌睦佣际褂肁RM-GCC工具鏈,故此只需要重寫(xiě)這個(gè)函數(shù)即可:

int _write(int fd, const void *buffer, size_t count);

(注:PDL中也有Retarget的實(shí)現(xiàn),兼容Keil MDK/IAR/GCC,但是如果只想使用printf,推薦使用本文的簡(jiǎn)單方法)

詳細(xì)代碼參見(jiàn)作者的git頁(yè)面.

之后Cortex M0+與Cortx M4以如下的流程運(yùn)行:

 

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評(píng)論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開(kāi)放投稿

熱門(mén)標(biāo)簽
項(xiàng)目外包 more+