Введение в CUDA: параллельные вычисления от NVIDIA

Автор: | 26 июня, 2025

Что такое CUDA?

CUDA (Compute Unified Device Architecture) — это платформа и программная модель от NVIDIA для высокопроизводительных параллельных вычислений на GPU (видеокартах).
С помощью CUDA вы можете задействовать графический процессор не только для рендеринга графики, но и для ускорения вычислений — от обработки изображений до нейросетей и научных расчетов.

Пример: Обычный CPU выполняет десятки потоков, а GPU — тысячи одновременно. CUDA позволяет этим тысячам потоков обрабатывать данные параллельно.


Почему CUDA?

CPUGPU (через CUDA)
Мало ядер, высокая частотаМного ядер, ниже частота
Сильный в последовательных задачахИдеален для параллельных вычислений
Подходит для логики, принятия решенийПодходит для математики, обработки данных

Что можно делать с помощью CUDA?

  • Обработка изображений и видео в реальном времени
  • Симуляции: физика, жидкости, экономика
  • Машинное обучение (нейросети, обучение моделей)
  • Биоинформатика (например, анализ ДНК)
  • Финансовое моделирование
  • Рендеринг и 3D-визуализация
  • Криптография и шифрование

Как устроена архитектура CUDA

Основные понятия:

ПонятиеОписание
KernelФункция, которая выполняется на GPU
ThreadОдин поток выполнения
BlockГруппа потоков
GridСетка блоков

GPU обрабатывает тысячи потоков одновременно. Вы управляете ими через блоки и сетку (grid).

Простой пример CUDA-кода: сложение массивов

__global__ void add(int *a, int *b, int *c, int N) {
    int idx = threadIdx.x + blockDim.x * blockIdx.x;
    if (idx < N)
        c[idx] = a[idx] + b[idx];
}

void run_addition() {
    int N = 1024;
    int *a, *b, *c;

    // выделение памяти на CPU
    a = (int*)malloc(N * sizeof(int));
    b = (int*)malloc(N * sizeof(int));
    c = (int*)malloc(N * sizeof(int));

    // инициализация
    for (int i = 0; i < N; ++i) {
        a[i] = i;
        b[i] = 2 * i;
    }

    // выделение памяти на GPU
    int *d_a, *d_b, *d_c;
    cudaMalloc(&d_a, N * sizeof(int));
    cudaMalloc(&d_b, N * sizeof(int));
    cudaMalloc(&d_c, N * sizeof(int));

    // копирование на GPU
    cudaMemcpy(d_a, a, N * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, b, N * sizeof(int), cudaMemcpyHostToDevice);

    // запуск ядра
    add<<<(N + 255) / 256, 256>>>(d_a, d_b, d_c, N);

    // копирование результата обратно
    cudaMemcpy(c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);

    // вывод
    for (int i = 0; i < 10; ++i)
        printf("%d + %d = %d\n", a[i], b[i], c[i]);

    // очистка
    cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
    free(a); free(b); free(c);
}

Что нужно для работы с CUDA?

  1. Видеокарта NVIDIA (проверь поддержку: список CUDA GPU)
  2. Драйвер NVIDIA — последний или совместимый
  3. CUDA Toolkit: включает компилятор nvcc, библиотеки, профилировщики
  4. IDE: можно использовать Qt Creator, Visual Studio, VS Code, CLion и др.
  5. Компилятор C/C++, совместимый с CUDA (например, MSVC, GCC, Clang)

Примеры реального использования

ОбластьПример
Обработка изображенийФильтры, распознавание лиц, размытие
НейросетиОбучение моделей в PyTorch, TensorFlow
ФинансыМонте-Карло моделирование портфеля
МедицинаСимуляция распространения лекарств
Игры / 3DФизика частиц, мягкие тела, дым

Заключение

CUDA — мощный инструмент для ускорения вычислений на GPU. Он идеально подходит для разработчиков, которые хотят добиться максимальной производительности от своего железа. Использовать его можно как в научных задачах, так и в графике, ML и играх.