Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:CUDA_full / P05_MinimalResudualMethod / CUDA_MinResidual_completed / minres
.cpp#include <cublas.h>
#include "minres.h"
/* Функция должна выполнить одну итерацию метода минимальных невязок для системы Ax = b.
A — матрица размера nxn (хранится по столбцам);
b — вектор размера n;
x — вектор размера n, на входе содержит текущее приближение,
на выходе должен содержать следующеее.
r, Ar — вспомогательные массивы размера n. В Ar на входе содержатся неопределённые,
но числовые значения.
*/
void min_residual_gpu(int n, const float * A, const float * b,
float * x, float * r, float * Ar)
{
// r <- b
cublasScopy(n, b, 1, r, 1);
// r <- Ax - r
cublasSgemv('N', n, n, 1.0f, A, n, x, 1, -1.0f, r, 1);
// Ar
cublasSgemv('N', n, n, 1.0f, A, n, r, 1, 0, Ar, 1);
// tau <- (Ar, r) / (Ar, Ar)
float tau = cublasSdot(n, Ar, 1, r, 1) / cublasSdot(n, Ar, 1, Ar, 1);
// x <- x - tau * r
cublasSaxpy(n, -tau, r, 1, x, 1);
}