Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компьютерлік бағдарламалау тілі
Computer programming language
Брук бағдарламалау тілі және оның BrookGPU іске асырылуы графикалық процессорларда жалпы мақсаттағы есептеулерді жүзеге асыру бойынша алғашқы және маңызды әрекеттер болды. Стэнфорд университетінің графикалық тобында жасалған Брук, ATI немесе Nvidia графикалық карталарындағыдей, қазіргі заманғы, жоғары параллель GPU-ларға бағытталған ағын бағдарламалау тілінің компиляторы және орындалу ортасы еді. BrookGPU, Брук ағын бағдарламалау тілінде жазылған бағдарламаларды компиляциялады, ол ANSI C нұсқасы болып табылады. Ол есептеу үшін OpenGL v1.3+, DirectX v9+ немесе AMD-нің Close to Metal-ін қолдап, Microsoft Windows және Linux жүйелерінде жұмыс істеді. Қателерді жою үшін BrookGPU CPU-да виртуалды графикалық картаны модельдеуге де қабілетті болды.
The Brook programming language and its implementation BrookGPU were early and influential attempts to enable general purpose computing on graphics processing units. Brook, developed at Stanford University graphics group, was a compiler and runtime implementation of a stream programming language targeting modern, highly parallel GPUs such as those found on ATI or Nvidia graphics cards. BrookGPU compiled programs written using the Brook stream programming language, which is a variant of ANSI C. It could target OpenGL v1.3+, DirectX v9+ or AMD's Close to Metal for the computational backend and ran on both Microsoft Windows and Linux. For debugging, BrookGPU could also simulate a virtual graphics card on the CPU.
Мәртебе
Соңғы ірі бета-релиз (v0.4) 2004 жылдың қазанында шықты, бірақ жаңа даму 2007 жылдың қарашасында v0.5 бета 1 релизімен қайта басталды да, тоқтатылды. V0.5 нұсқасының жаңа мүмкіндіктеріне PBuffers орнына фреймбуфер объектілерін пайдаланатын, сондай-ақ жекеше жеткізушілердің кеңейтімдерін пайдаланудың орнына стандартты OpenGL интерфейстеріне негізделген, жақсартылған және жылдам жұмыс істейтін OpenGL бэкенді кіреді. GLSL қолдауы қосылды, бұл бұрын тек DirectX 9 қолдаған функционалдықтың барлығын (күрделі тармақтану және циклдар) OpenGL-ге әкелді. Атап айтқанда, енді Brook Linux жүйесінде Windows сияқты тиімді жұмыс істей алады. V0.5 сериясындағы басқа да жақсартуларға бірнеше бэкендті бірдей пайдалану мүмкіндігі кіреді, яғни әртүрлі жіптер бір мезгілде әртүрлі Brook бағдарламаларын іске асыру арқылы көп GPU орнатудың мүмкіндіктерін толық пайдалануға болады, сонымен қатар CPU бэкенді үшін SSE және OpenMP қолдауы да қосылды (бұл қазіргі заманғы процессорларды толыққанды пайдалануға мүмкіндік береді).
The last major beta release (v0.4) was in October 2004 but renewed development began and stopped again in November 2007 with a v0.5 beta 1 release. The new features of v0.5 include a much upgraded and faster OpenGL backend which uses framebuffer objects instead of PBuffers and harmonised the code around standard OpenGL interfaces instead of using proprietary vendor extensions. GLSL support was added which brings all the functionality (complex branching and loops) previously only supported by DirectX 9 to OpenGL. In particular, this means that Brook is now just as capable on Linux as Windows. Other improvements in the v0.5 series include multi backend usage whereby different threads can run different Brook programs concurrently (thus maximising use of a multi GPU setup) and SSE and OpenMP support for the CPU backend (this allows near maximal usage of modern CPUs).
Жүруді салыстыру
Үстел үсті компьютерлік процессорлар (CPU) мен GPGPU арасындағы тікелей салыстыру алгоритмдік және құрылымдық айырмашылықтарға байланысты қиындық тудырады. Мысалы, 2.66 ГГц Intel Core 2 Duo, егер SSE және ағынды жадқа қолжеткізуді тиімді пайдаланса, секунд сайын 25 GFLOP (25 миллиард бір дәлдікті қозғалатын нүктелік операция) орындай алады, бұл ретте алдын ала жүктеуші (prefetcher) өте жақсы жұмыс істейді. Дегенмен, дәстүрлі түрде (көлеңкелік бағдарламалардың ұзындығымен шектелгендіктен) көптеген GPGPU ядролары үлкен деректер жиынтығында салыстырмалы түрде аз жұмыс істеуге бейім, сондықтан GPGPU алгоритмдерін тікелей үстел үсті компьютерлік процессорда орындаудағы басты мәселе – жадтың өте төмен өткізу қабілеті. Себебі, процессор көп уақытын RAM күтуге жұмсайды. Мысалы, екі каналды PC2 6400 DDR2 RAM шамамен 11 Гбит/с өнімділік бере алады, бұл оқу және жазу операцияларын ескергенде, шамамен 1.5 GFLOP-қа тең (жалпы өткізу қабілеті 3 GFLOP). Осылайша, егер жад өткізу қабілеті шектелсе, Brook-тың процессорлық бөлімі 2 GFLOP-тан аспайды. Іс жүзінде, көрсеткіш тіпті төмен, әсіресе float4 дерек типінен басқа нәрселер үшін, себебі тек осы дерек типі ғана SSE арқылы үдетіледі. ATI HD 2900 XT (740 МГц ядро, 1000 МГц жад) DirectX 9 арқылы Brook ең көп дегенде 410 GFLOP орындай алады. OpenGL (драйвер мен Cg компиляторының шектеулеріне байланысты) қазіргі уақытта GPGPU үшін бұл GPU-да тиімді емес, сондықтан OpenGL қолданғанда Brook 210 GFLOP-ты ғана басқара алады. Қағазда бұл процессордан 20 есе жылдам көрінеді, бірақ бұл оңай емес. Қазіргі GPU-ларда тармақтану және оқу/жазу операцияларында үлкен кешігулер бар, сондықтан нақты кодта ең жоғарғы көрсеткіштің үштен бірін күтуге болады. Бұл ATI картасын Intel Core 2 Duo-дан шамамен 125 GFLOP жылдамдықпен бес есе жылдам қалдырады. Алайда, бұл деректерді өңдеу үшін GPU-ға және одан қайтарудың маңызды бөлігін ескермейді. PCI Express 1.0 x8 интерфейсі арқылы ATI HD 2900 XT жадына шамамен 730 Мбит/с жылдамдықпен жазуға және 311 Мбит/с жылдамдықпен оқуға болады, бұл стандартты компьютерлік жадтан әлдеқайда баяу. Үлкен деректер жиынтығы үшін бұл GPU-ны пайдаланудың жылдамдық артықшылығын жақсы баптаулы процессорлық шешімге қарағанда азайтуы мүмкін. Әрине, GPU-лар процессорлардан әлдеқайда жылдамдап дамиды және PCI Express интерфейсі жақсара түссе, үлкен өңдеу жүктемесін GPU-ға жүктеудің мағынасы арта түседі.
A like for like comparison between desktop CPUs and GPGPUs is problematic because of algorithmic & structural differences. For example, a 2.66 GHz Intel Core 2 Duo can perform a maximum of 25 GFLOPs (25 billion single precision floating point operations per second) if optimally using SSE and streaming memory access so the prefetcher works perfectly. However, traditionally (due to shader program length limits) most GPGPU kernels tend to perform relatively small amounts of work on large amounts of data in parallel, so the big problem with directly executing GPGPU algorithms on desktop CPUs is vastly lower memory bandwidth as generally speaking the CPU spends most of its time waiting on RAM. As an example, dual channel PC2 6400 DDR2 RAM can throughput about 11 Gbit/s which is around 1.5 GFLOPs maximum given that there is a total of 3 GFLOPs total bandwidth and one must both read and write. As a result, if memory bandwidth constrained, Brook's CPU backend won't exceed 2 GFLOPs. In practice, it's even lower than that most especially for anything other than float4 which is the only data type which can be SSE accelerated. On an ATI HD 2900 XT (740 MHz core 1000 MHz memory), Brook can perform a maximum of 410 GFLOPs via its DirectX 9 backend. OpenGL is currently (due to driver and Cg compiler limitations) much less efficient as a GPGPU backend on that GPU, so Brook can only manage 210 GFLOPs when using OpenGL on that GPU. On paper, this looks like around twenty times faster than the CPU, but as just explained it isn't as easy as that. GPUs currently have major branch and read/write access penalties so expect a reasonable maximum of one third of the peak maximum in real world code this still leaves that ATI card at around 125 GFLOPs some five times faster than the Intel Core 2 Duo. However this discounts the important part of transferring the data to be processed to and from the GPU. With a PCI Express 1.0 x8 interface, the memory of an ATI HD 2900 XT can be written to at about 730 Mbit/s and read from at about 311 Mbit/s which is significantly slower than normal PC memory. For large datasets, this can greatly diminish the speed increase of using a GPU over a well tuned CPU implementation. Of course, as GPUs become faster far more quickly than CPUs and the PCI Express interface improves, it will make more sense to offload large processing to GPUs.