Budapesti Műszaki Főiskola Neumann János Informatikai Kar
Vastagbél daganatok diagnosztikájának automatizálása
Projektnév: Colon Készítők: Bándi István (W9D47U) Reményi Attila (YELLJ8)
2008.
Tartalomjegyzék 1.
2.
BEVEZETÉS ............................................................................................................................................... 2 1.1.
PROBLÉMALEÍRÁS: ............................................................................................................................... 2
1.2.
MEGOLDÁS: .......................................................................................................................................... 2
1.3.
CÉLKITŰZÉS:......................................................................................................................................... 3
A VASTAGBÉL SZERKEZETE, BETEGSÉGEI ................................................................................... 4 2.1.
A VASTAGBÉL ....................................................................................................................................... 4
2.2.
A VASTAGBÉL NYÁLKAHÁRTYA (MUCOSA) .......................................................................................... 4
2.3.
A VASTAGBÉL BETEGSÉGEI [2] ............................................................................................................. 6
2.3.1. 2.3.2.
Gyulladásos betegségek: ................................................................................................................. 6 A diszplázia: .................................................................................................................................... 9
3.
ELŐZMÉNYEK ........................................................................................................................................ 10
4.
CUDA (COMPUTE UNIFIED DEVICE ARCHITECHTURE) ........................................................... 12 4.1.
CUDA ALAPJAI .................................................................................................................................. 12
4.2.
A GPU ÉS A PÁRHUZAMOS PROGRAMOZÁS ......................................................................................... 12
4.3.
PROGRAMOZÁSI MODELL [9] .............................................................................................................. 14
4.3.1. A szálak hierarchiája .................................................................................................................... 14 4.4. AZ OPTIMÁLIS ALGORITMUS: .............................................................................................................. 15 5.
FELHASZNÁLT IRODALOM ................................................................................................................ 17
1
1. Bevezetés 1.1.
Problémaleírás
Napjainkban a szövetminták mikroszkopikus vizsgálata túlnyomórészt manuálisan történik. A kutatónak, vagy orvosnak a mikroszkóp fölé kell hajolnia, egy kényelmetlen testhelyzetben, szemével a mikroszkópban végtelenbe kell fókuszálnia, majd a jegyzeteire tekintve közelre, ez a szemnek és az agynak megterhelő. Egy minta manuális kielemzése, akár több 10 percet is igénybe vehet, így egy teljes mintasor elemzése fárasztó, valamint sok időt és energiát emészt fel. Arról nem is beszélve, hogy az orvos is ember, így pár órás munka után, a fáradtsági faktor miatt megnő a valószínűsége, hogy a mintából hibás diagnózist állít fel. A probléma egy másik olvasata a gazdaságosság. A költségek csökkentése érdekében a kórházak, kutatóintézetek sok esetben csökkentik a laboratóriumok, ill. a kutatók, orvosok számát. Ez a módszer a költségeket látszólagosan csökkenti, mert a túlterheltség miatt megnő a hibaarány. Egy laboratóriumban sokféle mintát elemeznek, ezek vizsgálata különböző módszert igényel, mi a vastagbél daganatok diagnosztikájára koncentrálunk.
1.2.
Megoldás
A problémára megoldást nyújt egy szövettani immundiagnosztikai kiértékelő és speciálisan a vastagbél daganatok differenciáldiagnosztikáját, prognosztikáját támogató szoftvercsomag. A program feladata szöveti képek számítógépes feldolgozása. A szoftver a 3DHistech Kft. által több év óta fejlesztett MIRAX szoftver termékcsaláddal együttműködve hatékony módon képes a digitális szöveti képeket elemezni. A számítógépes elemzés megteremti annak a lehetőségét, hogy az eredmények nem a teljes szöveti mintára vonatkozóan kerülnek kiszámításra, hanem csak az orvosi szempontból érdekes szövetekre. A feladat során két módszer alkalmazása merül fel: HE (Haematoxylin and Eosin) festés esetén hám detekció elvégzése morfológiai paraméterek alapján (felszíni hám, mirigy detekció), ill. autofluoreszcencia segítségével. A szöveti képek feldolgozását követően diagnosztikai elemzés készül a szegmentált szövettípusokra a diagnosztikai paraméterek alapján célzottan az ép, gyulladásos, hyperplasztikus és daganatos elváltozások azonosítására.
2
1.3.
Célkitűzés
A szövetkomponensek felismerését és szegmentációját támogató algoritmusok implementálása. A szoftver használatát segítő grafikus felhasználói felület tervezése. Meghatározásra kerülnek a diagnosztikai elemzéshez szükséges, ill. indikátorként alkalmazható paraméterek definiálása és kvantitatív értékeik meghatározása, melyek segítségével a szoftver a későbbiekben döntéstámogatást biztosíthatna az orvos felhasználók számára. Paraméter kidolgozás, klasszifikációs algoritmus fejlesztés és optimalizálása. A szoftver használatához és továbbfejlesztéséhez szükséges dokumentációs anyagok kialakítása. A kialakított szoftvercsomag tesztelése.
Az algoritmusnak képesnek kell lennie: -HE festett rutin metszetek analízisére: felszíni hám, mirigyek, lamina muscularis, submucosa azonosítására -HE festett metszetek autofluoreszcenciás analízisére: hám, mirigy struktúrák, lamina musculáris, submucosa azonosítására -hámon belüli sejttípusok azonosítására -hám és szöveti struktúrák azonosítására -ép, gyulladásos, daganatos szöveti strukturák megkülönböztetésére.
A szoftver képfeldolgozó algoritmusait, a gyorsabb futás érdekében, az nVidia által megalkotott CUDA technológiát felhasználva fogjuk implementálni. Ez a technológia kiválóan alkalmas a számítás intenzív, jól párhuzamosítható feladatok, így a képfeldolgozás felgyorsítására. A CUDA-val kihasználható a számítógépekben lévő, eddig leginkább megjelenítésre használt GPU-k számítási kapacitása. Ezzel a program futása gyorsabb, és (a CPU tehermentesítése miatt) használata kényelmesebb lesz. A szoftver kevésbé időkritikus részeit, C#-ban, a .Net keretrendszert felhasználva fogjuk megvalósítani.
3
2. A vastagbél szerkezete, betegségei
2.1.
A vastagbél
A vastagbél az emésztőrendszer utolsó szakasza, átmérője átlagosan 5-6 cm, hossza 150-180 cm [4]. Bélrendszer feladatai a táplálék emésztése, felvétele, felszívása és az emészthetetlen salakanyag külvilágra juttatása. A vastagbélrák az egyik leggyakoribb daganatfajta, Magyarországon évente 7000 – 8000 új megbetegedést diagnosztizálna, amivel a 2. leggyakoribb daganat a tüdőrák után. A vastagbél szöveti szerkezetét az alábbi ábra szemlélteti.
A bél lumene
1. ábra Vastagbél szöveti szerkezete [3]
Mivel a vastagbél daganat a nyálkahártyából – mucosa – fejlődik ki, ennek a felépítését részletesebben is megvizsgáljuk.
2.2.
A vastagbél nyálkahártya (mucosa)
A vastagbél nyálkahártyája az alábbi rétegekből épül fel[3]: hámsejt réteg propria réteg: a nyálkahártya kötőszöveti rétege [1] 4
lamina muscolaris mucosae: nyálkahártya izomrétege
2. ábra Vastagbél nyálkahártyájának szerkezete [3]
A hámréteg jellemzője, hogy a sejtek közötti távolság kicsi, szorosan egymás mellet helyezkednek el, megnyúlt hasáb alakúak, és sejtmagjaik egyvonalban vannak [2]. A nyálkahártyába betüremkedő „képződmények” mirigyek, melyek feladata, hogy nyák termelésével síkosítsák a vastagbél falát. A mirigyek alsó részén egy osztódó sejtréteg, a germinatív vagy generatív réteg található.
5
Mirigy
Hám
3. ábra Hámréteg, és egy mirigy
Az egészséges nyálkahártya tulajdonságai [3]: a nyálkahártya felszíne sima a mirigyek sűrűsége 6 - 8 db / mm a mirigyek mérete normális, a nyálkahártyáig érnek, irányultságuk párhuzamos, és nem ágaznak el csak a mirigy alsó részén található osztódó sejtréteg sejtjeik száma és felépítése normális a kötőszövetben és az izomrétegben nincs elváltozás
2.3.
A vastagbél betegségei [2]
Egy egészséges vastagbél nyálkahártya sejt daganatos elváltozását több ok is előidézheti. Az elváltozás hatására a sejt bizonyos tulajdonságai megváltoznak, így képes lesz magát kivonni a saját, és a környező sejtek növekedési kontrolja alól. Ezek a sejtek új populációt hoznak létre, és a túlnövik a környezetüket, ún. polip vagy hiperplázia jön létre. A hiperplázia azt jelenti, hogy a sejtek normálisnál ugyan gyorsabban szaporodnak, de felépítésük nem változik. Ha a folyamat itt nem áll meg, diszplázia alakul ki, amikor már a sejtek szerkezetében is változások történnek. Később ebből alakulhat ki a rák.
2.3.1. Gyulladásos betegségek A vastagbél gyulladásos betegségei a rák kialakulásának szempontjából fontosak, hosszabb ideig tartó gyulladás esetén megnő a rák kockázata. A gyulladás a hámsejtek szerkezetének megváltozásával jár, ami elősegíti a mutációt, és így áttételesen a rák kialakulását. A gyulladt nyálkahártya az alábbiakban különbözik az egészségestől: a nyálkahártya felszíne megváltozik 6
a mirigyek sűrűsége csökken a mirigyek párhuzamos, egyenes lefutása megváltozik
A nyálkahártya felületének simasága megszűnik, bizonyos helyeken kitüremkedések, máshol hámsejthiány, bemaródás alakul ki. A mirigyek sűrűsége az 7 - 8 db / mm-ről 4-5 db / mm-re csökken, a távolság közöttük megnő. Nemcsak a mirigyek helyzete, de a szerkezetük is drasztikusan megváltozik: a mirigyek párhuzamossága megszűnik, átmérőjük megváltozik. a mirigyek egyenes lefutása megszűnik, elágazások jönnek létre az izomréteg és a mirigy alapja közötti távolság megnő, és mirigyenként különbözik A gyulladás során a kötőszövetben – propira réteg – is elváltozások jelennek meg, a sejtek száma megnő, egészséges egyenletes eloszlásuk megváltozik. Ez minden vastagbél gyulladás esetén megjelenik, a fent felsorolt morfológia változások nem feltétlenül!
4. ábra A mirigyek párhuzamossága megszűnik
7
5. ábra A mirigyekben elágazások jelennek meg
6. ábra Az izomréteg és a mirigyek alapja közti távolság megnő, és mirigyenként különbözik
8
2.3.2. A diszplázia A diszplázia által okozott elváltozások túlnyomórészt megegyeznek a gyulladás által okozottakkal, de a diszplázia a gyulladástól függetlenül is kialakulhat. A diszpláziából közvetlenül is kialakulhat rákos daganat. A diszplázia az alábbi elváltozásokat okozza (a gyulladásnál már megismerteken kívül): a hámréteg sejtmagjai megnyúlnak, sűrűn helyezkednek el nincsenek egy vonalban a sejtmagok megnagyobbodnak, alakjuk megváltozik a sejtmagok jobban festődnek a mirigyek generatív sejtrétege megvastagszik, és a sejt felsőbb részein is megjelenhet
7. ábra A generatív réteg a sejt felső részén is megjelenik
9
3. Előzmények Rendszerünktől azt reméljük, hogy használatával jelentősen megkönnyíthetjük az orvosok munkáját azzal, hogy a vizsgált mintákon lévő struktúrákat elkülönítünk egymástól és meghatározzuk azok mennyiség paramétereit (területét, kerületét, legrövidebb-leghosszabb átmérőjét). Léteznek már olyan rendszerek, melyek képesek sejtek detektálására, azok paramétereinek meghatározására. Ezen rendszerek működésének alapja két fő algoritmus melyek célja a képek szegmentálása. Ezen algoritmusoknak segítségével meghatározzuk a kép gradiensét, ebből megállapíthatóak az objektumok szegélyei. A szegélyeket pixel vastagságúra konvertáljuk. [5] Mivel célunk egy olyan orvost támogató rendszer kiépítése, amellyel lehetőségünk nyílik nem sejt, hanem szöveti szinten végezni a vizsgálatokat, és a kapott eredményeket összefüggéseiben értékelni, ezért ez a megoldás nem elégíti ki teljes mértékben célkitűzéseinket, így más megoldást kell keresnünk. Létező szövet diagnosztikai rendszereket használnak manapság nőgyógyászati szűrések során vett minták feldolgozására. Mammográfiai felvételek alapján detektálják a daganatot, az így kapott mintákban csak a sejtmagok vannak jelen, megfosztva természetes környezetüktől. Ez azért nem előnyős számunkra, mert mint később látni fogjuk, két minta bonyolultsági foka jelentős mértékben eltérhet, ezért ezek az algoritmusok jelen esetben nem képesek megfelelő hatékonysággal működni. Az Amerikai Élelmiszer- és Gyógyszerhatóság (Food and Drug Administration) 2004-ben hagyott jóvá egy olyan eljárást, amelynek segítségével az orvosok meg tudják becsülni a vérben keringő tumorsejtek számát. A vérben talált tumorsejtek számából jól lehet következtetni a betegség fázisára illetve jó módszer egy gyógyítási mód sikerességének ellenőrzésére. A módszer nagy előnye hogy könnyen hozzáférhető testfolyadékból képes tumoros sejteket kiszűrni. Az eredeti módszer önmagában nem használható, mert sejtek vérből való kinyerésének hatásfoka nagyon alacsonynak bizonyult. A módszert úgy módosították, hogy a vért vékony kapilláriscsöveken préselték át. A kapilláriscsövek felszínére olyan antitestet kötöttek, amely a hámsejtek egyik jellemző sejtfelszíni fehérjéjével reagál, így a hámeredetű tumorsejtek - például tüdő- és emlődaganatok esetében - a csövekben ragadtak és összegyűltek. Így elegendő mennyiségű és jó minőségű izolált sejt állna rendelkezésre a további vizsgálatokhoz Egy másik módszer olyan antitesteket használ melyek fluoreszcens tulajdonságúak, így láthatóvá teszik a daganatos sejteket lézersugárzás segítségével. Előnye, hogy ezzel az eljárással nem csak kis mennyiségű mintából, hanem a teljes váráramból következtethetünk a daganatos sejtek számára. Ezen módszerek használhatóságát megkérdőjelezi az a tény, hogy daganatok vérből való kimutatása csak akkor lehetséges, ha a daganat már olyan helyre is betört ahol erek vannak, tehát amíg csupán a hámréteget érinti, addig ezekkel a módszerekkel nem lehet a vastagbélrákot kimutatni. A vérben talált daganatos sejtek számából nem lehet következtetést levonni a daganat és az áttétek helyére sem.
10
A rák jól kezelhető korai fázisban (Dukes A, vagy B stádium), ilyenkor pusztán sebészeti eljárást alkalmaznak. Dukes C, D stádiumban már áttétképzés is van. ekkor sebészeti, és kemo, vagy sugárterápát alkalmaznak esetleg kombinálva.[3] A vérben való kimutathatóság fontos idővesztést jelent tudva azt, hogy a vastagbélrák kialakulásának időtartama általában 5-10 év között van. Vastagbélrák esetén ezt az időt meg tudjuk spórolni, ha endoszkópos vizsgálatot, alkalmazunk. Mintavételezés történhet bélsárból is, de ez vér tartalmú ételek fogyasztása esetén hamis eredményt adhat. Igazán megbízható eredmény kizárólag szövettani mintából adható. A szövettani elemzés sok lehetőséget nyújt új, egymástól nagyon eltérő algoritmusok kifejlesztésére, használatára. A kvantitatív paraméterek meghatározása már bevált módszer a mikroszkópos képek digitális analízisére. A módszer minden esetben egy adott környezetben és egy adott problématerületen alkalmazható. A kvantitatív paramétereket főleg nagy nagyításban (kb. 400x) vizsgáljuk. Jó ötletnek tűnik megvizsgálni a feldolgozandó képeket más felbontásban is. A minta alacsonyabb felbontásban (kb. 200x) jó inputot jelent az architektúrális vizsgálatokhoz. Peter W. Hamilton és munkatársai egy új módszert alkalmaztak diszpláziás területek detektálására. Neurális hálózatokkal vizsgálták a képeket minden egyéb alacsony szintű képanalízis és képszegmentálás nélkül.[6] Ezt a digitális médiát használva ugyanazon a mintán vizsgálhatjuk a szövet architektúrális felépítését, valamint a benne található mirigyeket, follikulusokat és a sejtalkotókat (sejtmag citoplazma) is. A fent említett algoritmusok önmagukban nem nyújtanak kielégítő eredményt ezért a már meglévő algoritmusok kombinációjára és újak kifejlesztésére van szükség.
11
4. CUDA (Compute Unified Device Architechture) 4.1.
CUDA alapjai
A CUDA egy párhuzamos programozási modell és szoftverkörnyezet, amely a nem grafikus jellegű feladatok számára is megnyitja a GPU-ban rejlő számítási teljesítményt [8]. Egy CUDA kompatibilis GPU-nak több száz magja van, és ezek több ezer párhuzamos szálat képesek futtatni. Mindegyik mag hozzáfér megosztott erőforrásokhoz: regiszterekhez, chipre integrált memóriához. Ez lehetővé teszi, hogy az egyes taszkok adatot osszanak meg egymás között, anélkül hogy a rendszer memória buszát használniuk kéne. A CUDA támogatja, hogy egy program párhuzamosan fusson a GPU-n és a CPU-n. Így egy szoftver egyes részeit a CPU futtathatja, míg a jól párhuzamosítható részeit párhuzamosan a GPU. A CUDA előnye, hogy a már megszokott és elterjedt C nyelvhez képest kevés kiterjesztést, módosítást tartalmaz.
4.2.
A GPU és a párhuzamos programozás
A piac kielégíthetetlen igénye a valós idejű, nagy felbontású 3D grafika iránt vezetett oda, hogy a programozható GPU egy erősen párhuzamosított, sokmagos processzorrá fejlődött, óriási számítási teljesítménnyel és memória sávszélességgel [9]. Napjainkban egy GPU lebegőpontos számítási teljesítménye és memória sávszélessége sokszorosan meghaladja egy CPU-ét.
8. ábra: Lebegőpontos számítási teljesítmény [9]
12
9. ábra: Memória sávszélesség [9]
A különbség oka az, hogy a GPU-t számítás intenzív, párhuzamos feladatok végrehajtására specializálták, ezért több tranzisztort szenteltek az adatfeldolgozásra, mint a folyamatirányításra és a gyorsítótárakra.
10. ábra: CPU ill. GPU vázlatos felépítése [9]
Mivel ugyanazt az algoritmust hajtjuk végre minden egyes adatelemen, nincs szükség annyira kifinomult folyamatirányításra, mint a CPU-nál. A CUDA programozási modellje jól illeszkedik a párhuzamos feldolgozásra optimalizált GPU-hoz. 13
A párhuzamos adatfeldolgozás lényege, hogy a párhuzamosan futó szálakhoz, a teljes feldolgozandó adat egy-egy adatelemét rendeljük, és mindegyik adatelemen ugyanazt a műveletet hajtjuk végre. Ebből adódik a felhasználási terület is: 3D renderelés, képfeldolgozás, videó kódolás és dekódolás, ahol egy adatelem egy pixel, vagy egy vertex. Elrugaszkodva a megjelenítéstől, még több felhasználási területet találhatunk: jelfeldolgozás, fizikai, kémiai, biológiai folyamatok szimulációja, orvosi informatikai, pénzügy.
4.3.
Programozási modell [9]
A CUDA a C nyelvet az alábbi elemekkel egészíti ki: függvény típusokkal, amikkel meghatározhatjuk, hogy egy függvény hol fusson, és honnan legyen hívható (CPU vagy GPU) változó típusokkal, amikkel meghatározhatjuk egy változó helyét a GPU memóriájában a kernel hívási direktívájával négy beépített változóval, amikkel meghatározhatók a grid és a blokk dimenziói, valamint a blokkok és a szálak indexei A kernel egy olyan függvény, amit a CPU hív, de a GPU hajt végre, hívásakor meg kell adnunk, hogy hány párhuzamos szálon szeretnénk egyszerre futtatni. A kernelre az alábbi megszorítások érvényesek: csak a GPU memóriáját érheti el nem lehet visszatérési értéke (void) nem lehet rekurzív a statikus változók használata nem megengedett A GPU szálak ún. „könnyű” szálak, létrehozásukhoz, és a szálak közti váltásokhoz szükséges idő jóval kevesebb, mint a CPU-n futatott szálak esetén, és kevésbé erőforrás igényesek. Egy kernel hívása az alábbi módon történik: kernelnnév<<>>(paraméterek) A gridDim-mel és a blockDim-mel a szálak hierarchiáját határozhatjuk meg, a memSize-zal pedig az osztott memória méretét; ez opcionális. A gridDim és a blockDim típusa dim3, ami a CUDA egy beépített típusa: vektor, ami egy-, kettő- vagy háromelemű.
4.3.1. A szálak hierarchiája A szálak hierarchiáját az alábbi ábra szemlélteti:
14
11. ábra: Szálhierarchia [7]
A szálakat un. blokkokba rendezzük. Minden blokk ugyanannyi szálat tartalmaz, ezek számát és dimenzióit adjuk meg a blockDim-mel a kernel hívásakor. Egy blokkban a szálakat egy, kettő vagy három dimenzióba rendezhetjük, egy blokk a mai GPU-k esetén maximum 512 szálat tartalmazhat. Minden blokknak külön osztott memóriája van, így csak az azonos blokkban lévő szálak képesek ezen keresztül együttműködni. A gridDim-mel a blokkok számát és dimenzióit határozhatjuk meg, ahol a dimenziók száma maximum 2, a blokkok száma dimenziónként 65535. A kernelek egy gridben futnak, és egy GPU egy időben csak egy kernelt futtathat. Egy mag egy időben egy blokkot futtat, de tartozhat hozzá több blokk is, ilyenkor sorban futtatja őket. A blokkok és a blokkon belüli szálak száma kritikus a futási idő szempontjából, de számukat mindig az aktuálisan feldolgozni kívánt adat struktúrájához kell igazítani, és nem a hardverhez. A hardver osztja be, hogy melyik blokkot, melyik maghoz rendeli.
12. ábra: Blokkok kiosztása a magokhoz különböző GPU-knál (Device) [7]
4.4.
Az optimális algoritmus:
Nyilvánvaló, hogy ugyanannak a feladatnak a megoldásához teljesen más szemlélet és algoritmus szükséges akkor, ha a CPU helyett a GPU-t használjuk. Ennek oka az architektúrális különbségekben keresendő. Szeretnék visszautalni a már korábban leírtakra: a GPU-n csak a jól párhuzamosítható feladatok oldhatók meg hatékonyan. Azonban ezek is csak akkor, ha az algoritmussal tényleg képesek vagyunk kihasználni a GPU nyújtotta 15
előnyöket, és optimalizáljuk. Az optimális algoritmus fogalma azonban nem triviális, feladatonként más és más szempontokat kell figyelembe venni, ezért csak bizonyos ajánlásokat tudunk megfogalmazni [7]: törekedni kell, hogy a feladatot a lehető legkisebb párhuzamosan elvégezhető részfeladatokra bontsuk szét az algoritmus tervezésénél törekedni kell arra, hogy a GPU minél több időt töltsön a matematikai számításokkal, adatmásolás helyett gyakran érdemesebb újraszámolni, mint eltárolni o 3. ábra: több tranzisztor foglalkozik számolással, mint tárolással
16
5. Felhasznált irodalom 1.: Fehér György: A háziállatok funkcionális anatómiája, Mezőgazda Kiadó, 2004 2.: Röhlich Pál: Szövettan. Egyetemi Tankönyv, Budapest 1999 3.: Valcz Gábor, Az ép és a beteg vastagbél szövettani felépítése, http://biotech.nik.bmf.hu/web/uploads/slides/DKM/2007_11_05_Az_ep_es_a_beteg_vastagbe l_szovettani_szerkezete.pdf, 2008. október 4: Mairass Márta, Vastagbélrák, http://biotech.nik.bmf.hu/web/uploads/slides/DKM/2007_11_05_Az_ep_es_a_beteg_vastagbe l_szovettani_szerkezete.pdf, 2008. október 5: Ficsor Levente: Colonbiopsziás hisztológiai metszetek számítógéppel automatizált kiértékelése, 2003 6: Levente Ficsor, Viktor Varga, Lajos Berczi, Pal Miheller, Attila Tagscherer, Mark Licheng Wu, Zsolt Tulassay, Bela Molnar: Automated Virtual Microscopy of Gastric Biopsies, 2006 7.: Introductory CUDA trainin courses: Volume1, Introduction to CUDA programming, http://www.nvidia.com/docs/IO/47904/VolumeI.pdf 8.: CUDA 2.0 Quickstart Guide for Windows, http://developer.download.nvidia.com/compute/cuda/2.0Beta2/docs/CUDA_2_Quickstart_Guide.pdf 9.: CUDA 2.0 Programming Guide for Windows, http://developer.download.nvidia.com/compute/cuda/2_0/docs/NVIDIA_CUDA_Programmin g_Guide_2.0.pdf
17