Развитие современнных графических процессоров для видеокарт привело к тому, что вычислительная мощность видеокарты зачастую превышает вычислительную мощность центрального процессора. Например, в видеочипах NVIDIA основной блок — это мультипроцессор с несколькими десятками ядер. Кроме того, видеокарта содержит быструю глобальную память с доступом к ней всех мультипроцессоров, локальную память в каждом мультипроцессоре, а также специальную память для констант. Самое главное — эти несколько ядер мультипроцессора в GPU являются SIMD (одиночный поток команд, множество потоков данных) ядрами. И эти ядра исполняют одни и те же инструкции одновременно, такой стиль программирования является обычным для графических алгоритмов и многих научных задач.
Зададимся вопросом, а нельзя ли для уменьшения времени счета наших программ использовать мощности графических процессоров (GPU)? Оказывается можно и достаточно просто. В этом разделе мы расскажем о технологии CUDA, которая разрабтывается корпорацией NVIDIA.
NVIDIA CUDA – это "архитектура, т.е. совокупность программных и аппаратных средств, которые позволяют производить на GPU вычисления общего назначения". Официально аббревиатура CUDA расшифровывается так: Compute Unified Device Architecture. На данный момент есть готовый SDK, для языков программирования C, C++ и Fortran.
CUDA — это доступная каждому разработчику ПО технология, её может использовать любой программист, знающий язык Си или Fortran. Придётся только привыкнуть к иной парадигме программирования, присущей параллельным вычислениям. Но если алгоритм в принципе хорошо распараллеливается, то изучение и затраты времени на программирование на CUDA вернутся в многократном размере.
Ещё один ключевой момент архитектуры CUDA – лёгкая масштабируемость. Единожды написанный код будет запускаться на всех устройствах, поддерживающих CUDA. Для разработки и отладки кода для запуска на GPU можно использовать обычные видеокарты. А когда продукт готов – запускать его уже на мощных Tesla. Это очень удобно.
В следующем параграфе мы рассмотрим способ распараллеливания решения задачи Эйлера с помощью CUDA.