Сложение векторов

Опубликовано марта 6, 2018 в Технология CUDA

Мы рассмотрим простой пример, на котором продемонстрируем использование нитей1 в программе на CUDA С. Предположим, что есть два списка чисел, мы хотим сложить соответствующие элементы из каждого списка и сохранить результат в третьем списке.

Весь процесс показан на рисунке ниже. Если вы чуть-чуть знакомы С линейной алгеброй, то легко распознаете в этой операции сложение двух векторов.

Сложение векторов на CPU

Сначала покажем, как реализуется сложение векторов в традиционной программе на С:

Сложение векторов

Большая часть кода не нуждается в пояснениях, но функцию add () мы все же рассмотрим и объясним, зачем мы ее так усложнили.

А наш более запутанный вариант рассчитан для показа возможности распараллеливания кода в системе с несколькими CPU или процессорными ядрами. Например, при наличии двухъядерного процессора можно было бы увеличивать индекс на 2, при этом первое ядро инициализировало бы tid значением 0, а второе -значением 1. Тогда первое ядро складывало бы элементы с четными индексами, а второе — с нечетными. И каждое из двух ядер выполняло бы такой код:

Сложение векторов

Разумеется, чтобы в действительности проделать это на CPU, пришлось бы написать гораздо больше. Нужно было бы добавить инфраструктурный код для создания рабочих нитей, исполняющих функцию add (), а также допустить, что нити и впрямь выполняются параллельно. Правда, это допущение об алгоритме планирования верно не всегда.