Array ( [0] => 15561283 [id] => 15561283 [1] => cswiki [site] => cswiki [2] => CUDA [uri] => CUDA [3] => CUDA processing flow (En).PNG [img] => CUDA processing flow (En).PNG [4] => [day_avg] => [5] => [day_diff] => [6] => [day_last] => [7] => [day_prev_last] => [8] => [oai] => [9] => [is_good] => [10] => [object_type] => [11] => 1 [has_content] => 1 [12] => CUDA (Compute Unified Device Architecture) je výkonný paralelní výpočetní model vyvinutý společností NVIDIA, který umožňuje programátorům využívat grafické procesory (GPU) pro obecné výpočty. Tento inovativní přístup přináší výrazné zrychlení výpočetních operací, což otevírá nové možnosti v různých oblastech, od vědeckého výzkumu po pokročilé grafické aplikace. Spuštění technologií CUDA přineslo revoluci ve způsobu, jakým se realizují náročné výpočty. Díky možnosti zpracovávat velké objemy dat v paralelním režimu mohou vývojáři lépe využívat potenciál moderních GPU. Tento proces významně zvyšuje rychlost a efektivitu, což má pozitivní dopad na široké spektrum aplikací, jako jsou strojové učení, simulace, grafika nebo zpracování obrazu. CUDA se také může pochlubit silnou komunitou a rozsáhlou podporou vývojářských nástrojů, což uživatelům usnadňuje práci a umožňuje jim rychleji dosahovat skvělých výsledků. Počet knihoven a frameworků orientovaných na CUDA neustále roste, což zvyšuje dostupnost a flexibilitu pro programátory napříč různými odvětvími. Přestože každá technologie má své výzvy, výhody, které CUDA přináší, daleko převyšují potenciální překážky. Komunita se aktivně podílí na rozvoji a zlepšování této technologie, což zajišťuje její udržitelnost a přizpůsobivost měnícím se potřebám uživatelů. V srdečném spojení s předními výzkumníky a profesionály z různých oborů se CUDA stává klíčovým nástrojem pro inovaci a pokrok. Tato technologie umožňuje lidem realizovat své nápady a posouvat hranice toho, co je možné, čímž přispívá k optimističtějšímu pohledu na budoucnost výpočetní techniky. [oai_cs_optimisticky] => CUDA (Compute Unified Device Architecture) je výkonný paralelní výpočetní model vyvinutý společností NVIDIA, který umožňuje programátorům využívat grafické procesory (GPU) pro obecné výpočty. Tento inovativní přístup přináší výrazné zrychlení výpočetních operací, což otevírá nové možnosti v různých oblastech, od vědeckého výzkumu po pokročilé grafické aplikace. Spuštění technologií CUDA přineslo revoluci ve způsobu, jakým se realizují náročné výpočty. Díky možnosti zpracovávat velké objemy dat v paralelním režimu mohou vývojáři lépe využívat potenciál moderních GPU. Tento proces významně zvyšuje rychlost a efektivitu, což má pozitivní dopad na široké spektrum aplikací, jako jsou strojové učení, simulace, grafika nebo zpracování obrazu. CUDA se také může pochlubit silnou komunitou a rozsáhlou podporou vývojářských nástrojů, což uživatelům usnadňuje práci a umožňuje jim rychleji dosahovat skvělých výsledků. Počet knihoven a frameworků orientovaných na CUDA neustále roste, což zvyšuje dostupnost a flexibilitu pro programátory napříč různými odvětvími. Přestože každá technologie má své výzvy, výhody, které CUDA přináší, daleko převyšují potenciální překážky. Komunita se aktivně podílí na rozvoji a zlepšování této technologie, což zajišťuje její udržitelnost a přizpůsobivost měnícím se potřebám uživatelů. V srdečném spojení s předními výzkumníky a profesionály z různých oborů se CUDA stává klíčovým nástrojem pro inovaci a pokrok. Tato technologie umožňuje lidem realizovat své nápady a posouvat hranice toho, co je možné, čímž přispívá k optimističtějšímu pohledu na budoucnost výpočetní techniky. ) Array ( [0] => {{Infobox - software [1] => | jméno = CUDA [2] => | vývojář = [[nVIDIA]] Corp. [3] => | operační systém = [[Microsoft Windows|MS Windows]], [[macOS]], [[Linux|GNU/Linux]] [4] => | platforma = [http://developer.nvidia.com/cuda-gpus podporovaná GPU] [5] => | typ softwaru = [[GPGPU]] [6] => | licence = [[freeware]] [7] => | lokalizace = [8] => | web = [http://www.nvidia.com/object/cuda_home_new.html www.nvidia.com] [9] => }} [10] => '''CUDA''' ([[akronym]] z [[Angličtina|angl.]] '''C'''ompute '''U'''nified '''D'''evice '''A'''rchitecture, výslovnost [ˈkjuːdə]) je hardwarová a softwarová architektura, která umožňuje na vybraných [[GPU]] spouštět programy napsané v jazycích [[C (programovací jazyk)|C]]/[[C++]], [[Fortran]] nebo programy postavené na technologiích [[OpenCL]], [[DirectCompute]] a jiných. Použití této architektury je omezeno pouze na [[Grafická karta|grafické akcelerátory]] a výpočetní karty společnosti [[nVIDIA]], která ji vyvinula. Konkurenční technologie společnosti [[Advanced Micro Devices|AMD]] se nazývá [http://en.wikipedia.org/wiki/AMD_FireStream AMD FireStream] (dříve ''Close To Metal''). Obě společnosti jsou také členy [[Khronos Group]], která zajišťuje vývoj OpenCL. [11] => [12] => == Historie == [13] => Technologii představila společnost nVIDIA v roce 2006. Následujícího roku bylo uvolněno [[Software development kit|SDK]] ve verzi 1.0 pro karty [[nVIDIA Tesla]] založené na architektuře G80. Ještě v prosinci téhož roku vyšla verze CUDA SDK 1.1, která přidala podporu pro GPU série [[GeForce#GeForce 8|GeForce 8]]. Se správným ovladačem grafické karty přibyla podpora pro překrývání paměťových přenosů výpočtem a podpora pro více GPU akcelerátorů. [14] => [15] => V roce 2008 bylo vydáno současně s architekturou G200 SDK 2.0. Postupně s verzemi SDK 2.0–2.3 přibývala podpora pro emulovaný výpočet s [[double precision|dvojnásobnou přesností]] (double-precision) a podpora pro C++ šablony v rámci kernelu. [16] => [17] => V roce 2010 bylo spolu s mikroarchitekturou Fermi vydáno SDK 3.0, obsahující nativní podporu pro výpočty s dvojnásobnou přesností, podporu pro ukazatele na funkce a podporu rekurze. Vylepšeny byly též profilovací nástroje a [[debugger]]y pro CUDA / OpenCL. [18] => [19] => V květnu 2011 byla vydána verze CUDA SDK 4.0. Největší změnou je zde unifikace paměťových prostorů a masivní podpora [[Scalable Link Interface|MultiGPU]]. [20] => [21] => Nejnovější verzí je CUDA SDK 9.0 ze září roku 2017. [22] => [23] => == Mikroarchitektura GPU == [24] => [[Soubor:Cpu-gpu.svg|náhled|270px|CPU vs. GPU]] [25] => Drtivou většinu plochy [[Integrovaný obvod|čipu]] grafického akcelerátoru od nVidie zabírá velké množství relativně jednoduchých [[Skalární procesor|skalárních procesorů]] (na rozdíl od architektur konkurenční firmy AMD, jejíž GPU jsou tvořeny [[Very long instruction word|VLIW]] [[SIMD]], resp. [[RISC]] [[SIMD]] jednotkami, tzv. stream procesory), které jsou organizovány do větších celků zvaných [[streaming multiprocesor]]y. Vzhledem k tomu, že se jedná o [[Single Instruction Multiple Threads|SIMT]] architekturu, řízení jednotek a plánování instrukcí je jednoduché a spolu s velmi malou [[Cache|vyrovnávací pamětí]] zabírá malé procento plochy GPU čipu. To má bohužel za následek omezené predikce skoků a časté zdržení výpadky cache (některé typy pamětí dokonce nejsou opatřeny cache). Poslední významnou částí, která je rozměrově velice podobná CPU je [[RAM]] [[řadič]]. [26] => [27] => === Struktura multiprocesoru === [28] => [[Soubor:Fermi.svg|náhled|270px|Schéma streaming multiprocesoru architektury Fermi]] [29] => Obecně se multiprocesor skládá z několika (dnes až ze 32) stream procesorů, pole registrů, sdílené paměti, několika load/store jednotek a Special Function Unit – jednotky pro výpočet složitějších funkcí jako [[Sinus|sin]], [[Kosinus|cos]], [[Přirozený logaritmus|ln]]. [30] => [31] => === Výpočetní možnosti (Compute capability) === [32] => Výpočetní možnosti popisují vlastnosti zařízení a množinu instrukcí, které jsou podporovány. Některé z těchto vlastností jsou shrnuty v tabulce níže, ostatní lze nalézt v oddílu F nVIDIA CUDA C Programming Guide. [33] => [34] => {| class="wikitable" style="text-align: center; margin: 0 auto;" [35] => |+ Výpočetní možnosti zařízení (''compute capability'') [36] => ! Vlastnost [37] => ! 1.0 [38] => ! 1.1 [39] => ! 1.2 [40] => ! 1.3 [41] => ! 2.x [42] => |- [43] => ! Maximální dimenze mřížky bloků [44] => | colspan="4" | 2 [45] => | 4 [46] => |- [47] => ! Maximální x-, y- nebo z- rozměr mřížky bloků [48] => | colspan="5" | 65 535 [49] => |- [50] => ! Maximální dimenze bloku vláken [51] => | colspan="5" | 3 [52] => |- [53] => ! Maximální x-, y- rozměr bloku vláken [54] => | colspan="4" | 512 [55] => | 1 024 [56] => |- [57] => ! Maximální z-rozměr bloku vláken [58] => | colspan="5" | 64 [59] => |- [60] => ! Maximální počet vláken v bloku [61] => | colspan="4" | 512 [62] => | 1 024 [63] => |- [64] => ! Velikost warpu [65] => | colspan="5" | 32 [66] => |- [67] => ! Maximální počet bloků přidělených na multiprocesor [68] => | colspan="5" | 8 [69] => |- [70] => ! Maximální počet warpů přidělených na multiprocesor [71] => | colspan="2" | 24 [72] => | colspan="2" | 32 [73] => | 48 [74] => |- [75] => ! Maximální počet vláken přidělených na multiprocesor [76] => | colspan="2" | 768 [77] => | colspan="2" | 1 024 [78] => | 1 536 [79] => |- [80] => ! Počet 32bitových registrů na multiprocesor [81] => | colspan="2" | 8 000 [82] => | colspan="2" | 16 000 [83] => | 32 000 [84] => |- [85] => ! Maximální množství sdílené paměti na multiprocesor [86] => | colspan="4" | 16 KiB [87] => | 48 KiB [88] => |- [89] => ! Počet sdílených paměťových banků [90] => | colspan="4" | 16 [91] => | 32 [92] => |- [93] => ! Množství lokální paměti na vlákno [94] => | colspan="4" | 16 KiB [95] => | 512 KiB [96] => |- [97] => ! Velikost konstantní paměti [98] => | colspan="5" | 64 KiB [99] => |- [100] => ! Velikost cache pro konstantní paměť na multiprocesor [101] => | colspan="5" | 8 KiB [102] => |- [103] => ! Velikost cache pro texturovací paměť na multiprocesor [104] => | colspan="5" | Závislé na zařízení, mezi 6 KiB a 8 KiB [105] => |- [106] => ! Maximální počet textur na jeden kernel [107] => | colspan="5" | 128 [108] => |- [109] => ! Maximální počet instrukcí na jeden kernel [110] => | colspan="5" | 2 000 000 [111] => |- [112] => ! Podpora výpočtů v double-precision [113] => | colspan="3" | Ne [114] => | colspan="2" | Ano [115] => |} [116] => [117] => == Programovací model == [118] => [[Soubor:Block-thread.svg|náhled|270px|Uspořádání vláken a bloků]] [119] => CUDA aplikace je složena z částí, které běží buď na host ([[Centrální procesorová jednotka|CPU]]) nebo na CUDA zařízení (GPU). Části aplikace běžící na zařízení jsou spouštěny hostem zavoláním [[CUDA Kernel|kernelu]], což je funkce, která je prováděna každým spuštěným [[Vlákno (informatika)|vláknem]] (thread [θred]). [120] => [121] => ; Blok (''thread block'') : Vlákna jsou organizována do 1D, 2D nebo 3D bloků, kde vlákna ve stejném bloku mohou sdílet data a lze synchronizovat jejich běh. Počet vláken na jeden blok je závislý na výpočetních možnostech zařízení. Každé vlákno je v rámci bloku identifikováno unikátním indexem přístupným ve spuštěném kernelu přes zabudovanou [[Proměnná|proměnou]] threadIdx. [122] => [123] => ; Mřížka (''grid'') : Bloky jsou organizovány do 1D, 2D nebo 3D mřížky. Blok lze v rámci mřížky identifikovat unikátním indexem přístupným ve spuštěném kernelu přes zabudovanou proměnou blockIdx. Každý blok vláken musí být schopen pracovat nezávisle na ostatních, aby byla umožněna škálovatelnost systému (na GPU s více jádry půjde spustit více bloků paralelně oproti GPU s méně jádry, kde bloky poběží v sérii). [124] => [125] => ; Warp : Balík vláken zpracovávaných v jednom okamžiku se nazývá warp. Jeho velikost je závislá na počtu výpočetních jednotek. [126] => [127] => Počet a organizace spuštěných vláken v jednom bloku a počet a organizace bloků v mřížce se určuje při volání kernelu. [128] => [129] => === Typický průběh GPGPU výpočtu === [130] => # Vyhrazení paměti na GPU [131] => # Přesun dat z hlavní paměti RAM do paměti grafického akcelerátoru [132] => # Spuštění výpočtu na grafické kartě [133] => # Přesun výsledků z paměti grafické karty do hlavní RAM paměti [134] => [135] => === Ukázka kódu v CUDA C === [136] => Převzato z . [137] => [138] => // Kód pro GPU [139] => __global__ void VecAdd(float* A, float* B, float* C, int N) [140] => { [141] => int i = blockDim.x * blockIdx.x + threadIdx.x; [142] => if (i < N) [143] => C[i] = A[i] + B[i]; [144] => } [145] => // Kód pro CPU [146] => int main() [147] => { [148] => int N = …; [149] => size_t size = N * sizeof(float); [150] => // Alokace vstupních vektorů h_A and h_B v hlavní paměti [151] => float* h_A = (float*)malloc(size); [152] => float* h_B = (float*)malloc(size); [153] => // Inicializace vstupních vektorů [154] => … [155] => // Alokace paměti na zařízení [156] => float* d_A; [157] => cudaMalloc(&d_A, size); [158] => float* d_B; [159] => cudaMalloc(&d_B, size); [160] => float* d_C; [161] => cudaMalloc(&d_C, size); [162] => // Přesun vektorů z hlavní paměti do paměti zařízení [163] => cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice); [164] => cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice); [165] => // Volání kernelu [166] => int threadsPerBlock = 256; [167] => int blocksPerGrid = (N + threadsPerBlock – 1) / threadsPerBlock; [168] => VecAdd<<>>(d_A, d_B, d_C, N); [169] => // Přesun výsledků z paměti zařízení do hlavní paměti [170] => cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost); [171] => // Uvolnění paměti na zařízení [172] => cudaFree(d_A); [173] => cudaFree(d_B); [174] => cudaFree(d_C); [175] => // Uvolnění hlavní paměti [176] => … [177] => [178] => [179] => == Paměťový model == [180] => [[Soubor:Memory.svg|náhled|270px|Hierarchie pamětí]] [181] => Na grafické kartě je 6 druhů paměti, se kterými může programátor pracovat. [182] => [183] => ; Pole registrů : je umístěno na jednotlivých stream multiprocesorech a jejich rozdělení mezi jednotlivé stream procesory plánuje překladač. Každé vlákno může přistupovat pouze ke svým [[Registr procesoru|registrům]]. [184] => [185] => ; Lokální paměť : je užívána v případě, že dojde k vyčerpání registrů. Tato paměť je také přístupná pouze jednomu vláknu, je ale fyzicky umístěna v globální paměti akcelerátoru a tak je přístup k ní paradoxně pomalejší než např. ke sdílené paměti. [186] => [187] => ; Sdílená paměť : je jedinou pamětí kromě registrů, která je umístěna přímo na čipu streaming multiprocesoru. Mohou k ní přistupovat všechna vlákna v daném bloku. Ke sdílené paměti se přistupuje přes brány zvané ''banky''. Každý bank může zpřístupnit pouze jednu adresu v jednom taktu a v případě, že více streaming procesorů požaduje přístup přes stejný bank, dochází k paměťovým konfliktům, které se řeší prostým čekáním. Speciálním případem je situace, kdy všechna vlákna čtou ze stejné adresy a bank hodnotu zpřístupní v jednom taktu všem streaming procesorům pomocí [[broadcast]]u. [188] => [189] => ; Globální paměť : je sdílená mezi všemi streaming multiprocesory a není ukládána do cache paměti. [190] => [191] => ; Paměť konstant : je paměť pouze pro čtení, stejně jako globální paměť je sdílená s tím rozdílem, že je pro ni na čipu multiprocesoru vyhrazena L1 cache. Podobně jako sdílená paměť umožňuje rozesílání výsledku broadcastem. [192] => [193] => ; Paměť textur : je také sdílená mezi SMP, určena pro čtení a disponuje cache pamětí. Je optimalizována pro 2D prostorovou lokalitu, takže vlákna ve stejném warpu, které čtou z blízkých texturovacích souřadnic dosahují nejlepšího výkonu. [194] => [195] => {| class="wikitable" style="text-align: center; margin: 0 auto;" [196] => |+ Shrnutí vlastností pamětí [197] => ! Typ paměti [198] => ! Umístění [199] => ! Uložení do cache [200] => ! Přístup [201] => ! Viditelnost [202] => ! Životnost [203] => |- [204] => ! Registry [205] => | Na čipu [206] => | style="background-color: #ff9090" | Ne [207] => | Čtení/Zápis [208] => | 1 vlákno [209] => | Vlákno [210] => |- [211] => ! Lokální [212] => | Mimo čip [213] => | style="background-color: #ff9090" | Ne Od compute capabilities 2.0 je ukládání do cache umožněno [214] => | Čtení/Zápis [215] => | 1 vlákno [216] => | Vlákno [217] => |- [218] => ! Sdílená [219] => | Na čipu [220] => | style="background-color: #ff9090" | Ne [221] => | Čtení/Zápis [222] => | Všechna vlákna v bloku [223] => | Blok [224] => |- [225] => ! Globální [226] => | Mimo čip [227] => | style="background-color: #ff9090" | Ne [228] => | Čtení/Zápis [229] => | Všechna vlákna a host [230] => | Do uvolnění [231] => |- [232] => ! Paměť konstant [233] => | Mimo čip [234] => | style="background-color: #90ff90" | Ano [235] => | Čtení [236] => | Všechna vlákna a host [237] => | Do uvolnění [238] => |- [239] => ! Paměť textur [240] => | Mimo čip [241] => | style="background-color: #90ff90" | Ano [242] => | Čtení [243] => | Všechna vlákna a host [244] => | Do uvolnění [245] => |- [246] => | colspan="6" style="text-align: left;" | [247] => |} [248] => [249] => == Spolupráce s OpenGL a Direct3D == [250] => Některé prvky [[OpenGL]] a [[Direct3D]] mohou být mapovány do adresního prostoru CUDA aplikace, což umožňuje výměnu dat bez nutnosti jejich přenosu do hlavní paměti. Pro spolupráci s OpenGL lze mapovat OpenGL buffery, textury a renderbuffer objekty, pro spolupráci s Direct3D lze mapovat Direct3D buffery, textury a povrchy. Před samotným použitím v CUDA aplikaci je nutné nejprve prvek registrovat. Protože samotná registrace je výpočetně náročnou operací, je prováděna pouze jednou pro každý prvek. Registrované prvky lze poté podle potřeby přidávat a odebírat z adresního prostoru CUDA aplikace. [251] => [252] => == Přehled nástrojů pro debugging a profiling == [253] => Nedílnou součástí programování je [[Profilování|profiling]] a debugging. Profiling je zvlášť důležitý pro optimalizaci velikosti bloků a počtu vláken, což má za následek lepší překrývání paměťových operací výpočtem. [254] => [255] => Profilovací nástroje: [256] => * [http://developer.nvidia.com/nvidia-nsight-visual-studio-edition NVIDIA Nsight Visual Studio Edition] [257] => * [http://developer.nvidia.com/nvidia-visual-profiler nVIDIA Visual Profiler] [258] => * [http://www.cs.uoregon.edu/research/tau/home.php TAU Performance system] [259] => * [http://www.vampir.eu Vampir 9.1 – Performace Optimization] [260] => * [http://icl.cs.utk.edu/papi/index.html The PAPI CUDA Component] {{Wayback|url=http://icl.cs.utk.edu/papi/index.html |date=20111110124230 }} [261] => [262] => Nástroje pro debugging: [263] => * [http://developer.nvidia.com/nvidia-nsight-visual-studio-edition nVIDIA Parallel Nsight] [264] => * [http://developer.nvidia.com/cuda-gdb CUDA-GDB] [265] => * [http://developer.nvidia.com/cuda-memcheck CUDA-MEMCHECK] [266] => * [http://www.roguewave.com/products-services/totalview/features/cuda-debugging TotalView] [267] => * [http://www.allinea.com/products/ddt Allinea DDT] [268] => [269] => == Externí odkazy == [270] => * {{Commonscat}} [271] => [272] => {{Citace elektronické monografie [273] => | titul = CUDA Toolkit Documentation [274] => | url = http://docs.nvidia.com/cuda/index.html#axzz3wagwJWX1 [275] => | další = nVIDIA Developer [276] => | vydavatel = nVIDIA Corporation [277] => | datum aktualizace = 2018-01-24 [278] => | datum přístupu = 2018-02-13 [279] => | jazyk = en [280] => }} [281] => {{Citace elektronické monografie [282] => | titul = CUDA Toolkit Documentation v9.1.85 [283] => | url = http://docs.nvidia.com/cuda/index.html#axzz4QZxUCmXI [284] => | další = nVIDIA Developer [285] => | vydavatel = nVIDIA Corporation [286] => | datum aktualizace = 2018-01-24 [287] => | datum přístupu = 2018-02-13 [288] => | jazyk = en [289] => }} [290] => [291] => [292] => {{Autoritní data}} [293] => [294] => [[Kategorie:NVIDIA]] [] => )
good wiki

CUDA

CUDA (akronym z angl. Compute Unified Device Architecture, výslovnost [ˈkjuːdə]) je hardwarová a softwarová architektura, která umožňuje na vybraných GPU spouštět programy napsané v jazycích C/C++, Fortran nebo programy postavené na technologiích OpenCL, DirectCompute a jiných.

More about us

About

Tento inovativní přístup přináší výrazné zrychlení výpočetních operací, což otevírá nové možnosti v různých oblastech, od vědeckého výzkumu po pokročilé grafické aplikace. Spuštění technologií CUDA přineslo revoluci ve způsobu, jakým se realizují náročné výpočty. Díky možnosti zpracovávat velké objemy dat v paralelním režimu mohou vývojáři lépe využívat potenciál moderních GPU. Tento proces významně zvyšuje rychlost a efektivitu, což má pozitivní dopad na široké spektrum aplikací, jako jsou strojové učení, simulace, grafika nebo zpracování obrazu. CUDA se také může pochlubit silnou komunitou a rozsáhlou podporou vývojářských nástrojů, což uživatelům usnadňuje práci a umožňuje jim rychleji dosahovat skvělých výsledků. Počet knihoven a frameworků orientovaných na CUDA neustále roste, což zvyšuje dostupnost a flexibilitu pro programátory napříč různými odvětvími. Přestože každá technologie má své výzvy, výhody, které CUDA přináší, daleko převyšují potenciální překážky. Komunita se aktivně podílí na rozvoji a zlepšování této technologie, což zajišťuje její udržitelnost a přizpůsobivost měnícím se potřebám uživatelů. V srdečném spojení s předními výzkumníky a profesionály z různých oborů se CUDA stává klíčovým nástrojem pro inovaci a pokrok. Tato technologie umožňuje lidem realizovat své nápady a posouvat hranice toho, co je možné, čímž přispívá k optimističtějšímu pohledu na budoucnost výpočetní techniky.

Expert Team

Vivamus eget neque lacus. Pellentesque egauris ex.

Award winning agency

Lorem ipsum, dolor sit amet consectetur elitorceat .

10 Year Exp.

Pellen tesque eget, mauris lorem iupsum neque lacus.

You might be interested in

,'SIMD','nVIDIA','debugger','Soubor:Cpu-gpu.svg','nVIDIA Tesla','Software development kit','GeForce#GeForce 8','AMD FireStream','Advanced Micro Devices','Khronos Group','Soubor:Block-thread.svg','Kosinus'