最近閱讀了《GAME PROGRAMMING GEMS6》,頗有收獲,以筆記之。
首先是GENERAL PROGRAMMING SECTION。
1.2 Utilizing Multicore Processors with OpenMP
OpenMP是一個并行庫,和一般的多線程庫不同,OpenMP著重于局部和片斷的并行,目前VC8.0和GCC4.2均已支持了OpenMP。
(a)OpenMP的并行方式
在我未接觸OpenMP之前,我通過多線程只認(rèn)識到并行其實和多進程并行沒有什么區(qū)別,比如UI線程和工作線程,又比如渲染線程和后臺裝載線程。
它們是兩條生命期長得不得了的線程,通過臨界區(qū)和互斥體訪問共享變量,協(xié)同完成任務(wù)。
我一直覺得這樣的并行挺危險的,在這長長的生命周期中,它們無法判斷對方目前正處于何種狀態(tài),只能通過加鎖來解決溝通問題。
OpenMP的并行是局部的并行,線程的生命周期較短,并且處于同一狀態(tài)。在串行程序中,程序可以分為許多有序的任務(wù),像流水線般,如
step1->step2->step3->step4->step5。
OpenMP就是針對某一個step,來展開并行處理的。比如之前的5個step,其中step2和step5使用了并行處理,那么每一步都線程數(shù)量如下(假設(shè)是雙核,那進入并行時產(chǎn)生4個線程):
1->4->1->1->4。
一般能夠展開并行的任務(wù)最好是for循環(huán)的任務(wù),這種任務(wù)可以將被處理的數(shù)據(jù)均分到多個線程上,并行處理。
如:
for n=0,100
proc( data[n] );
就可以被OpenMP展開為以下4個循環(huán),每個循環(huán)分配一個線程:
for n=0,25
proc( data[n] );
for n=25,50
proc( data[n] );
for n=50,75
proc( data[n] );
for n=75,100
proc( data[n] );
(b)什么樣的task應(yīng)該交給OpenMP并行?
由上面的例子可以看到,一般是for循環(huán)的task,可以交給OpenMP。但是這里還是有些需要注意到地方的,比如在處理data[i]的時候,就不要去訪問data[j]的數(shù)據(jù),也就是盡量不要寫出一些需要加鎖訪問的代碼。即使在處理某個數(shù)據(jù)的時候要訪問其他相關(guān)的數(shù)據(jù),這樣的數(shù)據(jù)需要多數(shù)也是可以在進入并行區(qū)域前準(zhǔn)備好的:
獲取(串行)->處理(并行)->回寫(串行)
(c)OpenMP的使用接口
不要在正式程序中太著急的使用OpenMP,先老老實實的寫你的串行程序,然后在程序完成后經(jīng)過測量找出熱點,再對某些熱點使用OpenMP并行。說到這里,你應(yīng)該感覺到,OpenMP是一種想要就要,不破壞程序原有結(jié)構(gòu)的東西了吧。
沒錯,OpenMP簡單用的話簡單無比,復(fù)雜用的話也不是那么困難。
比如:
#pragma omp paralle for
for ( int i=0; i < 1000; ++i )
proc( data[i] );
#pragma omp指令在編譯器的支持下,就會展開成許多東西,并切實的發(fā)生并行。
由于并行一向不好調(diào)試,所以一開始要做的就是,串行編程,然后運行無措,最后才優(yōu)化,不是嗎?
(d)使用OpenMP的必要性
在游戲開發(fā)中,有兩種程序必然要OpenMP的并行,一種是MMOG的服務(wù)器程序,上面跑著近萬NPC和子物體,再加上幾千玩家,這樣的處理量,不需要多核不需要并行是不可能的。另一種就是游戲機游戲開發(fā),比如X360,就是幾個低能的CPU湊在一起拼出來的,這要是不并行,那鐵定沒法跑了。
高頻的CPU估計是很難再有了,進入多核時代,不用多線程,不用并行,出門都不好意思跟人打招呼····
PS:在看本書之前,我就已經(jīng)由X360的朋友介紹,進行了OpenMP的研究,有一種與主流同步的感覺+ω+
1.3Computer Vision in Games Using the OpenCV Library
(a)OpenCV是一個視覺,圖像處理庫,比如能從照片中識別出人臉之類的
(b)OpenCV是Intel發(fā)起的,所以在Intel的平臺上效率會優(yōu)于AMD平臺
(c)有興趣的可以用OpenCV做出itoy這樣的游戲,也就是使用camera操作的游戲
我個人對OpenCV目前不是很有興趣,不過公司里面還是有人玩過一段時間,又一次覺得和主流同步了+ω+
好,累了,今天先寫到這里,剩下的慢慢出。
posted on 2007-11-24 10:14
LOGOS 閱讀(2079)
評論(4) 編輯 收藏 引用 所屬分類:
《GAME PROGRAMMING GEMS6》讀書筆記