В этой статье мы рассмотрим:

1) Серийный код с кратким описанием

2) Параллельный код с кратким описанием

3) Сравните время параллельного кода и последовательного кода

4) сравните с графиком времени параллельного кода и времени последовательного кода

Краткое описание проблемы:

мы использовали три массива a, b, c. Добавление двух массивов и сохранение результата в третьем массиве. В этой задаче мы использовали другой размер задачи для сложения, например, началось с 2⁸ до 2², и измеряли время. Кроме того, здесь мы рассматривали время, которое одновременно является временем вычислений и временем доступа к памяти.

Цель этой постановки задачи - сравнить время последовательного кода с временем параллельного кода. Для параллельного программирования мы использовали компиляцию Cuda c / c ++.

Временная сложность задачи O (n)

  • 1) Серийный код с кратким описанием

Сначала мы начали с последовательного кода сложения векторов:

#include ‹stdio.h›
#include ‹math.h›
#include ‹time.h›
#include ‹stdlib.h›
void intialization ( int * a, int * b, int size1);
расчет void (int * a, int * b, int * c, int size);
int main () {

int min = pow (2,8);
int max = pow (2,29);
int size = 0;
int i = 0;
int * a, * b, * c;
clock_t start, end;
double walltime, th;
for (size = min ; size ‹max; size = size * 2) {

a = (int *) malloc (size * sizeof (int));
b = (int *) malloc (size * sizeof (int));
c = (int *) malloc (size * sizeof (int));
// printf («% d», size);
инициализация (a, b, размер);
start = clock ();
вычисление (a, b, c, size);
end = clock ();
walltime = (end-start ) / (double) CLOCKS_PER_SEC;
th = (max * sizeof (int)) / walltime;
// th = th / pow (10,9);
printf («% lf \ n ”, th);

бесплатно (a);
бесплатно (b);
бесплатно (c);
}

return 0;
}

недействительная инициализация (int * a, int * b, int size1) {
int i = 0;
for (i = 0; i ‹size1; i ++) {
a [i] = 1;
b [i] = 1;
}
}

расчет void (int * a, int * b, int * c, int size) {
int i = 0;
for (i = 0; i ‹ size; i ++) {
c [i] = a [i] + b [i];
}
}

Пояснение:

Над программой есть две функции. одна - это функция инициализации, которая инициализирует значение массива, соответствующее размеру проблемы, а другая - вычисление, которое складывает массив a и массив b и сохраняет его в массив c.

Для начала мы инициализируем min как 2⁸, а max как 2². Итак, мы используем один цикл for, чтобы увеличить размер проблемы, и для каждого размера проблемы мы выделяем память с помощью функции malloc. Помимо этого, мы инициализируем массив и вычисляем сложение векторов, а также измеряем время и пропускную способность кода. В итоге освобождаем память

Примечание: чтобы запустить программу c / c ++ в google colab, следуйте этой статье https://www.geeksforgeeks.org/how-to-run-cuda-c-c-on-jupyter-notebook-in-google-colaboratory/

2) Параллельный код с кратким описанием

  • Теперь приступим к параллельному программированию с помощью компилятора cuda. Я написал один код для того же, что и выше, но изменилось только использование программирования cuda.
  • Здесь мы используем одну дополнительную библиотеку - #include ‹cuda.h›

Чтобы показать параллельный код и сравнение последовательного кода и параллельного кода. Посетите эту статью: https://debuggingsolution.blogspot.com/2021/09/vector-addition-cuda-parallel.html