2010年4月28日 星期三

uCOS-II Win32 Port解析及改善 -- 4




將中斷改為其他程式觸發:

將中斷改由外部程式控制,其中Timer改為外部程式觸發可以改為可以停格的作業系統模擬,可以觀察各中斷程式是否有執行異常,或是驗證程式。結果如下:




改進資料傳輸:
資料傳輸功能主要是可以使uCOS-II可以模擬在大量資料輸入狀況下,測試程式是否正常,可以應用在有通信的狀況下,或有輸出入資料的狀況下,看程式對於資料處理的情況。也可以增加除錯的報告,將程式運作的各種狀況報告,增加對程式的除錯。實行則以選擇跨行程通信的方式來做,選擇使用Pipe。因為Pipe具有以下特性:



1.    WindowsLinux皆可以使用,具有平台轉移性。



2.    以檔案呼叫方式做為資料傳輸的方式,容易理解函式的用法。



因為檔案呼叫也會停止Thread,故Pipe實現在uC/OS-II中亦要一個獨立Task才不會干擾到其他的Task。結果如下:




可以發現兩支應用程式的資料為完全一樣,證明有寫到uC/OS Win32 Port。而且可以設定在Server程式關閉時,Client端亦可同時關閉。

加入此功能可以實現以軟體模擬外部環境對uC/OS-II做輸出入測試。





其他問題及改善提議:



Windows上模擬uC/OS仍和DOS上執行的uC/OS有些行為不同。



1.    random()行為不一樣:每一個Thread都有自己的random()的變數,和DOS不同是共用,所以不用保護也可以正常使用。但各Taskrandom()產出的數列完全相同,在DOS則完全不同。使得Win32 port模擬結果和DOS不同。



2.    Mutex功能使用後當機,經查原始碼,發現也是因為hTaskThread[]沒有同步更新造成。





若是將Win 32A PI Thread Handle放在TCB中管理也許可以解決,但要重新做核心除錯。其主要構想為:



1.        利用沒有用到的Stack做為Thread Handle存放地方,就可以經由TCB管理。而Stack在實體CPU會用到,但也不會亂改,所以是安全的。



2.        影響到函式有OSSchedulThread()OSTCBInitHook()



3.        需要修改的變數有二個hTaskThread[]taskSuspended[]



4.        taskSuspended[]是管理task是可以執行或是不可執行flag

hTaskThread[]Win32APIThread Handle。此二個變數要改用Stack做為存放的地方,故資料結構要做變動。



5.        OSTCBInitHook()是向Win32API申請Thread Handle的函式,要改成Handle改存到pTcb->OSTCBStkPtrtaskSuspended[]標記亦一併存入。



6.        OSSchedulThread()則要改成取用Handle時改由OSTCBCur->OSTCBStkPtr中取出Win32API Thread HandletaskSuspended[]標記亦一併取出。



實作驗證是成功的。









後記:在要發表這篇時,將舊程式拿出來Run時,結果是當機的。原因在於Bee換了一台雙核電腦。也就是原先在單核心上是可以正常執行。

也因這個原因,改善的部分延至今日發表。

因為已經找到當機原因,且有在研究解決方法了。

所以就再次發表。後面會加上新的版本。

2010年4月13日 星期二

ION跑Folding@Home

反正Bee的ION小桌機從不關機,那就加跑一些公益軟體。

一般掛機只會用到CPU,所以Bee想利用一下GPU。
ION架Folding@Home無法簡單完成。

有幾件事要做的。

1.調整ION的記憶體大小,至可以使用GPU運算。
  原設定為256MB,改到最大值512MB。這是因為256MB為顯示工作用,多的才是GPU運算用。
  不調應是發不動。

2.修改FAH的參數。
  因為認不出顯示卡型號,這點Bee是認為ION就是回傳"ION"導致無法比對出是那一等級的顯示卡。
  所以就加入強制開啟的參數。 -forcegpu nvidia_g80


設定好了終於可以跑了。
結果幾乎呈現當機的Lag。
原來和電驢相衝。調整啟動順序,先開好其他程式,最後再開Folding@Home。這樣就行了。

還是有點Lag,但好多了。
看一下溫度,比平常多了十度。但電力好像沒有多多少。

跑一段時間,待螢幕進入休眠,馬上啟動GPU-Z則可以測到只多五度。
這應該算是用最少的電力跑Folding@Home了。



經過一天的測試,發現可能跑不及格。也就是可能三天算不完。最後還是放棄了。


2010年4月6日 星期二

JAVA霸主地位不再

Bee常去看TIOBE的電腦語言排行。以了解電腦的走向。

這個月(2010/4)出現了令人意外的排名:JAVA不再是第一了。

而第一改為C語言。

不管如何,前二大語言的佔有率仍是沒有其他語言可以威脅的。

只是長期來看,用JAVA吃飯肯定比C來得難。



2010年3月31日 星期三

工作流模式(workflow pattern)相關資料

為了找出並行計算上的各種狀況,需要找到可以表達的模型。

目前已知並行狀態機可以使用Petri Net來表達。

在找Petri Net資料中,找到了工作流模式(workflow pattern)。

也就是所有並行式工作流,都可以使用工作流模式內的模型來表達。


工作流模式基本模型有21種:

1. 順序(Sequence)

2. 平行拆分(Parallel Split)

3. 同步(Synchronization)

4. 排他選擇(Exclusive Choice)

5. 單合併(Single Merge)

6. 多選(Multi-choice)

7. 平行合併(Synchronize Merge)

8. 多合併(Multi-merge)

9. 鑒別器(Discriminator)

10. M中的N模式(N-out-of-M Join)

11. 強制循環(Arbitrary Cycles)

12. 隱式終止(Implicit Termination)

13. 非同步的多實例(Multiple Instances Without Synchronization)

14. 在設計期間預先確定的多實例(Multiple Instances With a Priori Design Time Knowledge)

15. 在運行期預先確定的多實例(Multiple Instances With a Priori Runtime Knowledge)

16. 無法在運行期預先確定的多實例(Multiple Instances Without a Priori Runtime Knowledge)

17. 延遲選擇(Deferred Choice)

18. 交替平行路由(Interleaved Parallel Routing)

19. 里程碑(Milestone)

20. 取消活動(Cancel Activity)

21. 取消實例(Cancel Case)


可以到
http://is.ieis.tue.nl/research/patterns/patterns.htm

上面有動畫實例,可以很容易的了解各模型的差異。

有了這個工作流模式,只要把各狀況找出解決方式,就不會用自己想的怪方法來解,然後遇到不明的問題。


2010年3月30日 星期二

多線程退出算法

取自"多核計算與程序設計"

第二章重點,主要在三張圖。



平行任務分層算法

取自"多核運算與程序設計"

1.先計算任務圖中所有頂點的入度

2.找出所有入度為0的頂點,放入第0層,這樣便得到一個分層

3.假設已得到第K個分層,考慮去除放入0~k層頂點外,其他剩下的頂點所組成的子圖,在子圖中尋找所有入度為0的頂點,放入第K+1層中。

4.令K=K+1,重覆步驟3,直到所有頂點都被放入分層中。


這對RTOS也是很有用的。



2010年3月16日 星期二

"多核計算與程式設計"介紹


1.讀書原由

  在CUDA程式設計上面遇到許多多核心程式計算的問題。個人從單核心作業系統一下子變成多核心程式設計,才發覺對於多核心知識的不足。

  而CPU多核心已流行數年,在新的PC硬體上,要使用雙核心已是基本配備。意指,多核心已經是免費午餐。

  但在軟體設計上,卻很少使用到雙核心,甚至四核心來做為加速。為何會如此?轉換程式是如此慢,其原因為何?

  在收集網路資料後發現,出在使用語言上的問題比作業系統支援多核心來得嚴重。但不管如何,中文資料一樣貧乏。


  a.作業系統支援及其問題
    過去:

    作業系統支援多核心是最早的,在Unix作業系統就已發展出支援多核心的方式。

    但是現代作業系統都有支援的狀況下,為何沒有什麼程式設計師願意使用?原因在於使用的門檻高,且其經濟效應不好。

    因為多核心程式在單核心的CPU運行效率不好,在市場尚未普及前,多數工程師仍未接受多核心程式訓練。

    現在:

    但現在環境已經不同了,多核心時代真的到來。


  b.電腦語言支援多核心問題
    過去:

    其實這才是目前多核心程式發展的最大阻礙。撰寫多核心程式只能使用作業系統支援的狀況下,困難度太高。

    而大部分使用者所使用的語言皆為對於單核心所設計。能使用在多核心的電腦語言則是太少。

    所以大部分程式設計仍然被單核心程式語言所限住。這才是多核心程式真正無法流行的原因。

    因為程式語言就是要讓使用者方便處理設計,若是學習門檻太高,就不易推行。

    現在:

    語言延伸:MPI、OpenMP
    平行語言:Erlang、Scala


  c.使用CUDA之後才發現的問題

    CUDA的推行以資料為主的平行計算。和之前在作業系統所提的工作為主的平行計算上有很大的不同。

    在超過八核心同時運算時,為了要增加產出率,勢必要採行以SIMD為主的語言架構,也就是資料為主的程式概念。

    但個人發現,可以找到的資料不多,所以轉以找多核心程式的資料,所以找到此書。


2.書本結構

  a.基礎知識
    多核計算概述
    多線程編程基礎
    OpenMP程式設計

  b.基礎資料結構及算法
    結構
    Link List
    Hash
    Tree
    AVL search tree
   
  c.平行運算法
    並行程式設計模式
    並行搜尋
    並行排序
    並行數值計算
   
  d.共享資源分散式計算
    分散式計算設計模式
    分散式陣列
    分散式查找
    分散式記憶體管理
   
  e.任務分解及調度
    任務圖分解及調度
    動態任務分解及調度
    Lock-Free編程基礎


3.比對CUDA

  a.有許多問題是一樣的

  b.CUDA中有些問題解法未表明產生原因,在多核心中則有解釋

  c.CUDA可視為多核心的一種實現

  d.可以有效利用CUDA中的原子函式

  e.免除遇到多核心問題,無從看出問題產生原因