Преимущества от использования cuda сильно зависят от используемых алгоритмов.
Редукция.
Пусть задан массив a0,a1,…,an-1. требуется выполнить некоторую бинарную ассоциативную операцию над ними. Редукцией данного массива относительно заданной операции будет следующая величина: A=(((a0+a1)+a2)+…+an-1).
Для редукции применим стандартный прием, при котором исходный массив делится на части, которым ставится в соответствие один блок сетки. Он будет считать сумму элементов данной части массива. Таким образом задача разбивается на набор независимых подзадач, а именно нахождение отдельных сумм массива. Далее разобьем соответствующий блок элементов массива на пары. Каждая пара параллельно складывается. В результате получается вдвое больше элементов, подлежащих суммированию. Для данной задачи главным фактором, ограничивающим быстродействие, является доступ к памяти. Поэтому удобно, чтобы каждый блок сразу скопировал элементы в разделяемую память и суммировал их уже в разделяемой памяти.
#define block_size 256
__global__ void reduce (int *inData, int *outData)
b = 878, T* = 283K, M = 75*10^(-6), B = 1,9, λ = 0,2, c = 1000, α = 4, DB = 10^(-9), ρ = 2450.
ПО, а именно качество, является сдерживающим фактором для развития параллельных систем. Основной характеристикой, определяющей стиль программирования, является наличие общей или распределенной памяти. Отличительной чертой этих систем является единая подсистема ввода-вывода, единая ОС, единая ОП. Обычно работа происходит с использованием Unix подобной ОС. Она функционирует в виде множества процессов. Каждая пользовательская программа также запускается как отдельный процесс. Механизм порождения процесса является главным принципом распараллеливания. Также его называют механизмом порождения нитей. Нить в данном контексте – это легковесный процесс, для которого не порождается отдельного адресного пространства.
В языке Си возможно прямое использование механизма порождения нитей для распараллеливания программы посредством вызова системных функций: Все производители SMP-систем включают в свое ПО распараллеливающие компиляторы. Наиболее часто поставщики SMP-систем предусматривают в компиляторах директивы для распараллеливания цикла. Довольно часто эти наборы директив не совместимы между собой, поэтому приходится распараллеливать программу отдельно для каждой платформы.
Open MP – система, являющаяся расширением и обобщением этого набора директив. Интерфейс этой системы задуман как стандарт для программирования в модели общей памяти. Он реализует идею инкрементального распараллеливания, позаимствованную из языка HPF. Согласно этой системе разработчик не создает новую параллельную программу, а добавляет в текст последовательной программы Open MP директивы. Вся программа делится на последовательные и параллельные области. Все последовательные области выполняет главная нить, порождаемая при запуске. При входе в параллельную часть главная нить порождает дополнительные нити. Наличие общей памяти не препятствует использованию технологий, разработанных для систем с распределенной памятью. Многие производители SMP предоставляют такие технологии, как MPI. В случае таких систем при использовании данной технологии в качестве коммуникационной среды выступает разделяемая память.