4.2 Сума елементів вектора
Завдання. Потрібно обчислити суму елементів вектора розмірністю N елементів.
У самій програмі необхідно виконати наступні етапи: 1. Отримати дані для розрахунків. 2. Скопіювати ці дані в GPU пам'ять. 3. Провести обчислення в GPU через функцію ядра. 4. Скопіювати обчислені дані з GPU пам'яті в CPU. 5. Подивитися результати. 6. Звільнити використовувані ресурси.
Переходимо безпосередньо до написання коду:
Насамперед напишемо функцію ядра, яка і буде підсумовувати елементи вектора:
// Функція складання елементів вектора
__global__ void summOfVector (int * a. int * b) <
__shared__ int data [BLOCK_SIZE]; // створення масиву в Shared Memory девайса
int tid = threadIdx. x;
int idx = blockIdx. x * blockDim. x + threadIdx. x;
data [tid] = (idx 0; s = s / 2) <
if (tid
# include
# Define N (10000)
# Define BLOCK_SIZE 512
Виділимо окрему функцію на хості, в якій будуть инициализироваться дані:
// ініціалізація векторів
void initvector () <
vecTemp = (float *) malloc (N * sizeof (float));
vecX = (float *) malloc (N * sizeof (float));
vecP = (float *) malloc (N * sizeof (float));
vecR = (float *) malloc (N * sizeof (float));
vecB = (float *) malloc (N * sizeof (float));
for (int i = 0; i >> (dev_a. dev_b. dev_c);
cudaMemcpy (partial_c. dev_c. blocksPerGrid * sizeof (float). cudaMemcpyDeviceToHost);
floatdotres = 0;
for (int i = 0; i