Введение
Язык программирования
Язык программирования Brook и его реализация BrookGPU были одними из первых и оказавших значительное влияние попыток обеспечить вычисления общего назначения на графических процессорах. Brook, разработанный в графической группе Стэнфордского университета, представлял собой компилятор и среду выполнения потокового языка программирования, предназначенного для современных, высокопараллельных графических процессоров, таких как те, что используются в графических картах ATI или Nvidia. BrookGPU компилировал программы, написанные на языке потокового программирования Brook, который является вариантом ANSI C. Он поддерживал OpenGL v1.3+, DirectX v9+ или AMD Close to Metal в качестве вычислительного ядра и работал как в Microsoft Windows, так и в Linux. Для отладки BrookGPU также мог эмулировать виртуальную графическую карту на центральном процессоре.
Статус
Последний крупный бета-релиз (v0.4) состоялся в октябре 2004 года, но разработка была возобновлена и вновь приостановлена в ноябре 2007 года с выпуском v0.5 beta 1. Новые возможности версии 0.5 включают в себя значительно улучшенный и более быстрый графический бэкенд OpenGL, использующий объекты фреймбуфера вместо PBuffers и унифицирующий код вокруг стандартных интерфейсов OpenGL вместо проприетарных расширений производителей. Добавлена поддержка GLSL, что обеспечивает OpenGL всей функциональностью (сложным ветвлением и циклами), ранее доступной только в DirectX 9. В частности, это означает, что Brook теперь демонстрирует одинаковую производительность на Linux и Windows. Другие улучшения в серии v0.5 включают возможность использования нескольких бэкендов, позволяющую различным потокам одновременно выполнять разные программы Brook (максимизируя тем самым использование многопроцессорной графической системы), а также поддержку SSE и OpenMP для процессорного бэкенда (что позволяет почти полностью использовать возможности современных процессоров).
Сравнение результатов
Сравнение настольных процессоров и GPGPU затруднительно из-за алгоритмических и структурных различий. Например, Intel Core 2 Duo с частотой 2,66 ГГц может выполнять максимум 25 GFLOPs (25 миллиардов операций с плавающей точкой в секунду), при оптимальном использовании SSE и потокового доступа к памяти, чтобы префетчер работал идеально. Однако, традиционно (из-за ограничений длины шейдерных программ) большинство ядер GPGPU, как правило, выполняют относительно небольшой объем работы над большими объемами данных параллельно, поэтому основная проблема при непосредственном выполнении GPGPU-алгоритмов на настольных процессорах – значительно меньшая пропускная способность памяти, поскольку процессор в большинстве случаев тратит большую часть времени в ожидании оперативной памяти. Например, двухканальная оперативная память PC2 6400 DDR2 может обеспечивать пропускную способность около 11 Гбит/с, что соответствует примерно 1,5 GFLOPs максимум, учитывая общую пропускную способность в 3 GFLOPs и необходимость как чтения, так и записи данных. В результате, при ограничении пропускной способности памяти, бэкенд CPU в Brook не превысит 2 GFLOPs. На практике, этот показатель еще ниже, особенно для типов данных, отличных от float4, который является единственным типом, ускоряемым SSE. На ATI HD 2900 XT (ядро 740 МГц, память 1000 МГц), Brook может выполнять максимум 410 GFLOPs через бэкенд DirectX 9. OpenGL в настоящее время (из-за ограничений драйвера и компилятора Cg) гораздо менее эффективен в качестве бэкенда GPGPU для этой видеокарты, поэтому Brook может достигать только 210 GFLOPs при использовании OpenGL. На бумаге это выглядит примерно в двадцать раз быстрее, чем процессор, но, как было объяснено, это не так просто. Современные GPU имеют значительные штрафы за ветвления и доступ к памяти на чтение/запись, поэтому следует ожидать разумного максимума в одну треть от пиковой производительности в реальном коде. Это все равно оставляет видеокарту ATI примерно на уровне 125 GFLOPs, что примерно в пять раз быстрее, чем Intel Core 2 Duo. Однако это не учитывает важный аспект – передачу данных для обработки на GPU и обратно. С интерфейсом PCI Express 1.0 x8 память ATI HD 2900 XT может быть записана со скоростью около 730 Мбит/с и прочитана со скоростью около 311 Мбит/с, что значительно медленнее, чем обычная оперативная память ПК. Для больших наборов данных это может существенно снизить прирост скорости от использования GPU по сравнению с хорошо оптимизированной CPU-реализацией. Разумеется, по мере того как GPU становятся быстрее, опережая CPU по производительности, и интерфейс PCI Express улучшается, будет все более целесообразно переносить большие вычислительные задачи на GPU.