алгоритм интерполяционной поверхности на нерегулярной сетке на графических ускорителях

Разработка метода построение интерполяционного сплайна на нерегулярной сетке с использованием технологии CUDA. Создание веб-сервиса для предоставления доступа клиентам к ресурсам вычислительного узла. Визуализация сплайн-поверхностей на языке MatLab.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 28.05.2018
Размер файла 2,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

3.1.1 Решение СЛАУ на графических ускорителях

В CUDA, названия данных команд заимствованы со ставшего стандартом библиотеки LAPACK. LAPACK - это библиотека на языке Fortran 90 содержащая набор подпрограмм для решения наиболее часто встречающихся задач линейной алгебры. Она разрабатывалась с учетом свойств большинства современных архитектур для достижения наивысшей производительности.

C помощью LAPACK можно решать системы линейных уравнений, линейные задачи наименьших квадратов, находить собственные значения и вектора матриц, их сингулярные значения. Также возможно решение сопутствующих задач, таких как факторизация матриц или вычисление числа обусловленности.

В библиотеке LAPACK используется особенная конвенция именования функций. Название каждой подоперации является закодированной спецификацией расчетов, выполняемых данной подоперацией. Все названия содержат шесть символов в формате TXXYYY. Первая буква, T, показывает тип данных, с которыми оперирует подпрограмма:

Таблица 3.1.1 - Обозначение типа подоперации в LAPACK.

S

REAL

D

DOUBLE PRECISION

C

COMPLEX

Z

COMPLEX*16

Буквы XX обозначают тип матрицы с которой работает подпрограмма:

Таблица 3.1.2 - Обозначение типа матрицы в LAPACK.

BD

двухдиагональная

DI

диагональная

GE

произвольная матрица

GT

трехдиагональная

PO

симметричная, положительно определенная

SY

симметричная

TG

треугольная

Буквы ZZZ обозначают тип проводимых вычислений, например TRF обозначает LU разложение, EV - поиск собственных значений. Более подробный перечень обозначений можно найти в справке LAPACK [14].

Для решения системы линейных алгебраических уравнений на графической карте, используя библиотеку cuSOLVER, нам необходимо выполнить три основные подоперации:

1. gerf.

2. ormqr.

3. trsm.

Рассмотрим каждый шаг.

Geqrf. Данная команда выполняет QR разложение матриц, возвращая верхнюю треугольную матрицу R в верхней треугольной части матрицы A и матрицу Q в форме Хаусхолдера, размещенной в нижней треугольной части матрицы A.

Код QR разложения матрицы на языке CUDA:

cusolveSafeCall(cusolverDnDgeqrf(solver_handle, Nrows, Ncols, d_A, Nrows, d_TAU, work, work_size, devInfo));

int devInfo_h = 0;

gpuErrchk(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));

if (devInfo_h != 0) std::cout << "Unsuccessful gerf execution\n\n";

Листинг 3.1.1 - QR разложение матрицы на языке CUDA.

Интерфейс подпрограммы cusolverDnDgeqrf:

Таблица 3.1.3 - Интерфейс подпрограммы cusolverDnDgeqrf.

Параметр

Память

In/out

Описание

handle

host

input

Указатель на контекст библиотеки cuSolverDN.

m

host

input

Число строк матрицы A.

n

host

input

Число столбцов матрицы A.

A

device

in/out

<type> массив размерности lda * n, где lda не меньше, чем max(1,m).

lda

host

input

Ведущая размерность двумерного массива используемой для записи матрицы A.

TAU

device

output

<type> массив с размерностью минимум min(m,n).

Workspace

device

in/out

Рабочее пространство, <type> массив с размером L.

Lwork

host

input

Размер рабочего массива Workspace.

devInfo

device

output

if info = 0, LU разложение прошло успешно.

if info = -i, i-й параметр неверен.

После выполнения данного кода верхняя треугольная часть матрицы A содержит элементы R. Также возвращает матрицу Q в форме Хаусхолдера в нижней треугольной части матрицы A, в то время как коэффициент масштабирования возвращается через параметр TAU.

Ormqr возвращает произведение матриц A и Q.

Код произведение матриц на языке CUDA:

cusolveSafeCall(cusolverDnDormqr(solver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_N, Nrows, Ncols, min(Nrows, Ncols), d_A, Nrows, d_TAU, d_Q, Nrows, work, work_size, devInfo));

Листинг 3.1.2 - произведение матриц на языке CUDA.

Интерфейс подпрограммы cusolverDnDormqr:

Таблица 3.1.4 - Интерфейс подпрограммы cusolverDnDormqr.

Параметр

Память

In/out

Описание

handle

host

input

Указатель на контекст библиотеки cuSolverDN.

side

host

input

Обозначает, находится ли матрица Q левой или правой стороне C.

trans

host

input

Операция op(Q), которая не- или (conj.) транспонированная.

m

host

input

Число строк матрицы A.

n

host

input

Число столбцов матрицы A.

k

host

input

Число отражений элементов.

A

device

in/out

<type> массив размерности lda * n, где lda не меньше, чем max(1,m).

lda

host

input

Ведущая размерность двумерного массива используемой для записи матрицы A.

if side == CUBLAS_SIDE_LEFT, lda >= max(1,m);

if side == CUBLAS_SIDE_RIGHT, lda >= max(1,n).

tau

device

output

<type> массив с размерностью минимум min(m,n).

C

device

in/out

<type> массив с размером ldc * n. При завершении, C перезаписывается операцией op(Q)*C.

ldc

host

input

Ведущая размерность двумерного массива используемой для записи матрицы C. ldc >= max(1,m).

work

device

in/out

Рабочее пространство, <type> массив с размером L.

lwork

host

input

Размер рабочего массива Workspace.

devInfo

device

output

if info = 0, LU выполнение прошло успешно.

if info = -i, i-й параметр неверен.

Trsm. Еще одной часто используемой BLAS-функцией 3-го уровня является TRSM(s,ul,tz,d,m,n,б,Z,lz,Y,ly). Она предназначена для решения левостороннего (ZЧX=б•Y) или правостороннего (XЧZ=б•Y) матричного уравнения для всевозможных вариантов представления треугольной матрицы Z. Установкой параметров можно задать не только, с какой стороны (s) в этом уравнении участвует матрица Z, но и уточнить, является она нижней или верхней треугольной (ul), транспонированная ли она (tz) или сопряж?нная (для комплексных), единичная ли у не? диагональ (d) или нет. Функция может применяться не только к матрицам целиком, но и к отдельным матричным блокам, поэтому при е? вызове задаются также параметры (lz,ly), уточняющие размеры строк используемых матриц.

const double alpha = 1.;

cublasSafeCall(cublasDtrsm(cublas_handle, CUBLAS_SIDE_LEFT, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N, CUBLAS_DIAG_NON_UNIT, Ncols, Ncols,

&alpha, d_R, Ncols, d_B, Ncols));

Листинг 3.1.3 - Решение верхне-треугольной линейной системы на языке CUDA.

Таблица 3.1.5 - Интерфейс подпрограммы cublasDtrsm.

Параметр

Память

In/out

Описание

handle

input

Указатель на контекст cuBLAS.

side

input

Обозначает с какой стороны А от Х.

uplo

input

Обозначает, верхняя или няжняя часть матрицы А записана.

trans

input

Операция op(A), которая не- или (conj.) транспонирована.

diag

input

Обозначает, являются ли элементы главной диагонали матрицы 1.

m

input

Число строк В.

n

input

Число столбцов В.

alpha

host or device

input

<type> множитель

A

device

input

<type> массив размерности lda x m, где lda>=max(1,m) if side == CUBLAS_SIDE_LEFT

и lda x n, где lda>=max(1,n) иначе.

lda

input

Ведущая размерность двумерного массива, в котором записана матрица А

B

device

in/out

<type> массив. Он имеет размерность ldb x n, где ldb>=max(1,m).

ldb

input

Ведущая размерность двумерного массива, в котором записана матрица В

Проделав данные шаги, мы можем находим коэффициенты, значения которых и определяют сплайн-поверхность. Их нужно передать клиенту.

3.1.2 Создание веб-службы с помощью gSOAP

Данное приложение разработано с использованием инструмента gSOAP, который облегчает разработку веб-службы и позволяет клиентам подключаться, используя стандарт SOAP.

Процесс формирования кода сервера в gSOAP почти полностью автоматизирован. Для него разработан свой язык описания сервисов, похожий по грамматике на C и C++. Благодаря чему, для разработки веб-службы не требуется знание структуры файла WSDL.

Разработка веб-службы с помощью gSOAP начинается с написания заголовочного файла с описанием функции, реализуемой на сервере:

//gsoap ns service name: spline

//gsoap ns service style: rpc

//gsoap ns service encoding: encoded

//gsoap ns service namespace: urn:spline

//gsoap ns service location: http://localhost:9999

//gsoap ns service method-action: spline urn:spline

struct Vector {

double *__ptr;

int __size;

};

int ns__BuildSpline(int size, struct Vector X, struct Vector Y, struct Vector F, struct Vector* result);

Листинг 3.1.4 - Содержание заголовочного файла CudaSpline.h.

С помощью команды soapcpp2.exe -2 -i -e CudaSpline.h создаем несколько файлов с исходным кодом, который нам необходимо лишь дополнить. Параметры команды значат следующее:

· -2 - использовать стандарт SOAP v1.2;

· -i - сгенерировать код классов, наследуемых от структуры soap;

· -e - использовать стиль SOAP RPC при определении типов.

· В результате данной команды создаются следующие файлы:

· spline.wsdl - файл с описанием сервиса в формате WSDL.

· t.xsd - пользовательские типы хранятся в этом файле.

· spline.req.xml и spline.res.xml - примеры запроса и ответа веб-службы.

· splineProxy.cpp и splineProxy.h - код для клиентской стороны. Поскольку мы используем MATLAB в качестве клиента, эти файлы нам не нужны.

· splineService.cpp и spline.h - код для серверной части.

· spline.nsmap - пространства имен используемые сторонами.

· soapStub.h - описание структур, используемых на сервере и клиенте.

Благодаря данному интерфейсу, к веб-службе можно обращаться из любого клиента поддерживающего интерфейс SOAP. На веб-службе на вычислительном узле с графическим ускорителем реализована единственная функция, которая находит коэффициенты сплайна: BuildSpline(int size, struct Vector X, struct Vector Y, struct Vector F, struct Vector *result). На вход данной функции подается массив точек. Функция возвращает массив коэффициентов сплайна.

Рисунок 12 - Схема WSDL описания веб-службы.

Рисунок 13 - Состав проекта веб-службы с использованием технологии CUDA.

Нам необходимо переопределить виртуальный метод класса spline: int spline::BuildSpline(int size, struct Vector X, struct Vector Y, struct Vector F, struct Vector *result). Согласно правилам gSOAP, данный метод должен возвращать значение через последний параметр. Сам метод должен возвращать значение SOAP_OK, если выполнение прошло без ошибок. Данная константа определена в файле stdsoap2.h.

3.2 Клиент на MATLAB

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

Данная среда содержит функции, которые позволяют обращаться напрямую к веб-службам SOAP:

· callSoapService - посылает SOAP сообщение сервису;

· createSoapMessage - создает SOAP сообщение;

function result = Utilits(X, Y, F)

values = { size(X, 2), X, Y, F };

names = { 'size', 'X', 'Y', 'F' };

types = { ...

'{http://www.w3.org/2001/XMLSchema}int', ...

'{http://www.w3.org/2001/XMLSchema}double[]', ...

'{http://www.w3.org/2001/XMLSchema}double[]', ...

'{http://www.w3.org/2001/XMLSchema}double[]' ...

};

soapMessage = createSoapMessage( 'urn:spline', 'BuildSpline', values, names, types, 'rpc');

response = callSoapService( 'http://localhost:9999', '', soapMessage); temp = parseSoapResponse(response); result = temp.item;

Листинг 3.2.1 - Скрипт MATLAB для обращения к нашей веб-службе.

В ходе выполнения данной работы выяснилась неполная совместимость этих функций с реализацией веб-службы с помощью gSOAP. При передаче массивов на веб-службу, не указывалась длина массива в запросе. В связи с этим была сделана корректировка вышеупомянутых стандартных функций для правильной работы с веб-службой, созданной с помощью gSOAP. Была изменена функция из стандартного набора MATLAB: функция populate(dom,node,values,names,types). Данная функция участвует в формировании XML документа, отправляемого в запросе на веб-службу. В стандартной реализации данной функции в описании массивов добавляются XML-атрибуты xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:double[]". Чтобы веб-служба на gSOAP обрабатывала данный запрос, требуется добавлять число элементов массива в XML-атрибут SOAP-ENC:arrayType. Например: SOAP-ENC:arrayType ="xsd:double[2]"

4. Тестирование

Для тестирования реализации алгоритма рассмотрим несколько поверхностей. Будем брать несколько произвольных точек на этих поверхностях и строить сплайн-поверхность на их основе разработанным методом. Для каждого сплайна измерим среднеквадратичное отклонение от тестируемой поверхности:

(4.1)

4.1 Эллиптический параболоид

Эллиптический параболоид -- поверхность, задаваемая функцией вида:

(4.1.1)

Эллиптический параболоид можно описать как семейство параллельных парабол с ветвями, направленными вверх, вершины которых описывают параболу, с ветвями, также направленными вверх.

Если a=b, то эллиптический параболоид представляет собой поверхность вращения, образованную вращением параболы вокруг её оси симметрии.

Построим несколько сплайн-поверхностей на основе эллиптического параболоида и измерим отклонение для каждого из них. a = b = 1.

Рисунок 4.1.1 - Сплайн-поверхность, построенная на 20 точках эллиптического параболоида

Цветом обозначена разница между сплайном и исходной поверхностью. Число узлов интерполяции - 20.

При N = 20, мера S = 1,2763.

Рисунок 4.1.2 - Сплайн-поверхность, построенная на 40 точках эллиптического параболоида

Цветом обозначена разница между сплайном и исходной поверхностью. Число узлов интерполяции - 40.

При N = 40, мера S = 0,6546.

Рисунок 4.1.3 - Сплайн-поверхность, построенная на 60 точках эллиптического параболоида

Цветом обозначена разница между сплайном и исходной поверхностью. Число узлов интерполяции - 60.

При N = 60, мера S = 0,1801.

Зависимость меры S от N изображено на рисунке 4.1.4.

Рисунок 4.1.4 - зависимость меры S от N для эллиптического параболоида.

4.2 Трансцендентная поверхность 1

Данная поверхность задается уравнением:

z = sin(x) + cos(y) (4.2.1).

Построим три сплайна с 20, 40 и 60 узлами интерполяции, принадлежащими данной поверхности. В следующих графиках цветом обозначена разница между оригинальной поверхностью и сплайн-поверхностью.

Рисунок 4.2.1 - Сплайн-поверхность, построенная на 20 точках. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 20, мера S = 0,6383.

Рисунок 4.2.2 - Сплайн-поверхность с числом узлов интерполяции - 40. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 40, мера S = 0,1251.

Рисунок 4.2.3 - Сплайн-поверхность с числом узлов интерполяции - 60. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 60, мера S = 0,0642.

График зависимости S от N изображен на рисунке 4.2.4.

Рисунок 4.2.4 - график зависимости S от N для первой трансцендентной поверхности.

4.3 Трансцендентная поверхность 2

В качестве второй трансцендентной поверхности возьмем поверхность, задающейся функцией:

z = sin(x) /(x2 + y2 + 0.3) (4.3.1).

Рисунок 4.3.1 - Сплайн-поверхность с числом узлов интерполяции - 20. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 20, мера S = 0,2043.

Рисунок 4.3.2 - Сплайн-поверхность с числом узлов интерполяции - 40. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 40, мера S = 0,0616.

Рисунок 4.3.3 - Сплайн-поверхность с числом узлов интерполяции - 60. Цветом обозначена разница между сплайном и исходной поверхностью.

При N = 60, мера S = 0,0818.

Рисунок 4.3.4 - график зависимости S от N для второй трансцендентной поверхности.

Очевидно, что с увеличением числа интерполяционных узлов отклонение сплайна от оригинальной поверхности уменьшается, что и подтвердилось на тестировании.

Заключение

В ходе данной работы был разработан метод построения интерполяционного сплайна на нерегулярной сетке с использованием технологии CUDA. Также, в частности, был разработан алгоритм решения системы линейных алгебраических уравнений на графических ускорителях с поддержкой CUDA для нахождения коэффициентов сплайн-поверхности Смоляка с помощью библиотек cuBLAS, cuSPARSE и cuSOLVER.

Разработан веб-сервис для предоставления доступа клиентам, у которых нет необходимых графических ускорителей, к ресурсам вычислительного узла с требуемой аппаратной поддержкой, посредством открытого протокола прикладного уровня SOAP.

Реализован клиент на скриптовом языке MATLAB, обращающийся к веб-сервису по протоколу SOAP. Клиент передает на сервер набор точек и получает от сервера коэффициенты сплайна. С помощью этих коэффициентов, клиент вычисляет отклонение сплайн-поверхности от начальной поверхности.

Сделана визуализация сплайн-поверхностей на языке MATLAB с цветовым кодированием отклонения сплайна от оригинальной поверхности.

Тестирование показало ожидаемое снижение отклонения сплайна с увеличением числа узлов интерполяции. Также тестирование подтвердило корректность реализации алгоритма нахождения коэффициентов сплайна Смоляка, и показало согласованное взаимодействие сетевых узлов по SOAP и модулей системы в целом.

Пригодность данного метода для построения сплайн-поверхности по нерегулярной интерполяционной узловой сетке позволяет избавиться от применяемых в горнодобывающих компаниях преобразований "облака" точек в регулярную сетку и последующее строение поверхности путем грубой триангуляции по этой регулярной сетке. Благодаря этому, разработанный метод позволит снизить ошибки в расчетах, проводимых на горнодобывающих предприятиях. Таким образом, все поставленные перед нами задачи были полностью выполнены.

Использование технологии CUDA для построения сплайн-поверхности позволяет использовать данную систему в режиме реального времени, что является критичным для горнодобывающих предприятий работающих годами непрерывно. интерполяционный сплайн вычислительный язык

Созданная библиотека построения сплайн-поверхности Смоляка является органичным дополнением к существующим библиотекам CUDA и может использоваться сообществом разработчиков CUDA для построения сплайнов на нерегулярной интерполяционной сетке. Отсутствие зависимости от сторонних библиотек и использование только стандартных библиотек самой CUDA (cuBLAS, cuSPARSE, cuSOLVER) способствует быстрому и легкому применению данной разработки.

Интерфейс SOAP позволяет использовать данную веб-службу с любым клиентом, поддерживающим данный стандарт, без изменений кода.

Использование инструментария gSOAP позволяет без труда вносить изменения в существующий веб-сервис не прибегая к программированию сетевого кода. Компилятор "soapcpp2" автоматически обновляет схему типов данных и функций XML веб-службы (WSDL) согласно коду программы на C/C++.

Список литературы

1. Козлов В. А. Открытые информационные системы. М.: ФиС, 1999.

2. Д. Каханер, К.Моулер, С.Нэш, Численные методы и программное обеспечение М.: Мир, 1998. 575 с

3. Калиткин Н.Н. Численные методы. / Калиткин Н.Н. - М.: Наука, 1978. - 512с.

4. Турчак Л.И. Основы численных методов. / Турчак Л.И. - М.: Наука, 1987. - 320с.

5. Самарский А.А. Численные методы / Самарский А.А., Гулин А.В. - M.: Наука, 1989. - 431c.

6. Стечкин С.Б. Сплайны в вычислительной математике. / Стечкин С.Б., Субботин Ю.Н. - М.: Наука, 1976. - 349с.

7. Шуп. Т.Е. Прикладные численные методы в физике и технике. / Т.Е.Шуп - М.: Высш. шк., 1990. - 255с.

8. Смоляк С.А. Оптимальное восстановление функций и связанные с ним геометрические характеристики множеств // Труды третьей зимней школы по математическому программированию и смежным вопросам (24 января - 3 февраля 1970 г.,г.Дрогобыч), вып.III. - М.: 1970. - С. 509-557.

9. Смоляк С.А. Сплайны и их применение // Экономика и математические методы. - 1971. - Т.7, вып.3. - . 419-431.

10. Harder R.L., Desmarais R.N. Interpolation using surface splines // Journal of Aircraft. - 1972. - Vol.9, № 2. - P. 189-191.

11. Ашкеназы В. О. А98 Сплайн-поверхности: Основы теории и вычислительные алгоритмы: Учебное пособие. - Тверь: Тверской гос. ун-т, 2003. - 82 с.

12. MATLAB - MathWorks [Электронный ресурс]. URL: http://www.mathworks.com/products/matlab/?s_tid=hp_fp_ml (дата обращения: 12.05.2016).

13. System Requirements & Platform Availability [Электронный ресурс]. URL: http://www.mathworks.com/products/availability/index.html#ML (дата обращения: 12.05.2016).

14. LAPACK Routines [Электронный ресурс]. URL: http://www.netlib.org/lapack/lawn41/node111.html (дата обращения: 12.05.2016).

15.

ПРИЛОЖЕНИЕ А

Код веб-службы.

/* Includes, system */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

/* Includes, cuda */

#include <cuda_runtime.h>

#include <cublas_v2.h>

#include <helper_cuda.h>

#include "LinSolver.cuh"

#include "spline.nsmap"

#include "soapsplineService.h"

int main(int argc, char **argv)

{

const int SERVICE_PORT = 9999;

printf_s("Started");

std::auto_ptr<splineService> srv(new splineService());

if (srv->run(SERVICE_PORT))

{

srv->soap_stream_fault(std::cerr);

exit(-1);

}

return 0;

}

int splineService::BuildSpline(int size, struct Vector X, struct Vector Y, struct Vector F, struct Vector *result) SOAP_PURE_VIRTUAL

{

int size_ext = size + 3;

double* A = new double[size_ext * size_ext];

for (int i = 0; i < size; ++i)

{

for (int j = 0; j < size; ++j)

{

A[i * size_ext + j] = 0.0;

if (i != j)

{

A[i* size_ext + j] = (X.__ptr[i] - X.__ptr[j]) * (X.__ptr[i] - X.__ptr[j]) + (Y.__ptr[i] - Y.__ptr[j]) * (Y.__ptr[i] - Y.__ptr[j]);

A[i* size_ext + j] = A[i* size_ext + j] * log(A[i* size_ext + j]);

}

}

}

for (int i = 0; i < size; ++i)

{

A[i * size_ext + size + 0] = 1.0;

A[i * size_ext + size + 1] = X.__ptr[i];

A[i * size_ext + size + 2] = Y.__ptr[i];

A[(size + 0) * size_ext + i] = 1.0;

A[(size + 1) * size_ext + i] = X.__ptr[i];

A[(size + 2) * size_ext + i] = Y.__ptr[i];

}

for (int i = size; i < size + 3; ++i)

{

for (int j = size; j < size + 3; ++j)

{

A[i * size_ext + j] = 0.0;

}

}

double* C = new double[size_ext * size_ext];

LinSolver(A, size_ext, size_ext, F.__ptr, C);

//result = new Vector();

result->__ptr = new double[size_ext];

result->__size = size_ext;

for (int i = 0; i < size_ext; ++i)

result->__ptr[i] = C[i];

free(A);

free(C);

return SOAP_OK;

}

ПРИЛОЖЕНИЕ Б

Код вычисления СЛАУ с использованием CUDA.

#include "cuda_runtime.h"

#include "device_launch_paraMeters.h"

#include <iostream>

#include <iomanip>

#include <stdlib.h>

#include <stdio.h>

#include <assert.h>

#include <cusolverDn.h>

#include <cublas_v2.h>

#include <cuda_runtime_api.h>

#include "Utilities.cuh"

#define BLOCK_SIZE 32

__global__ void copy_kernel(const double * __restrict d_in1, double * __restrict d_out1, const double * __restrict d_in2, double * __restrict d_out2, const int M, const int N)

{

const int i = blockIdx.x * blockDim.x + threadIdx.x;

const int j = blockIdx.y * blockDim.y + threadIdx.y;

if ((i < N) && (j < N))

{

d_out1[j * N + i] = d_in1[j * M + i];

d_out2[j * N + i] = d_in2[j * M + i];

}

}

void LinSolver(double *h_A, int Nrows, int Ncols, double *h_C, double *h_B)

{

int work_size = 0;

int *devInfo;

gpuErrchk(cudaMalloc(&devInfo, sizeof(int)));

cusolverDnHandle_t solver_handle;

cusolverDnCreate(&solver_handle);

cublasHandle_t cublas_handle;

cublasSafeCall(cublasCreate(&cublas_handle));

double *d_A;

gpuErrchk(cudaMalloc(&d_A, Nrows * Ncols * sizeof(double)));

gpuErrchk(cudaMemcpy(d_A, h_A, Nrows * Ncols * sizeof(double), cudaMemcpyHostToDevice));

double *d_TAU;

gpuErrchk(cudaMalloc((void**)&d_TAU, min(Nrows, Ncols) * sizeof(double)));

cusolveSafeCall(cusolverDnDgeqrf_bufferSize(solver_handle, Nrows, Ncols, d_A, Nrows, &work_size));

double *work; gpuErrchk(cudaMalloc(&work, work_size * sizeof(double)));

cusolveSafeCall(cusolverDnDgeqrf(solver_handle, Nrows, Ncols, d_A, Nrows, d_TAU, work, work_size, devInfo));

int devInfo_h = 0;

gpuErrchk(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));

if (devInfo_h != 0)

std::cout << "Unsuccessful gerf execution\n\n";

double *h_Q = (double *)malloc(Nrows * Nrows * sizeof(double));

for (int j = 0; j < Nrows; j++)

{

for (int i = 0; i < Nrows; i++)

{

if (j == i) h_Q[j + i*Nrows] = 1.;

else h_Q[j + i*Nrows] = 0.;

}

}

double *d_Q;

gpuErrchk(cudaMalloc(&d_Q, Nrows * Nrows * sizeof(double)));

gpuErrchk(cudaMemcpy(d_Q, h_Q, Nrows * Nrows * sizeof(double), cudaMemcpyHostToDevice));

cusolveSafeCall(cusolverDnDormqr(solver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_N, Nrows, Ncols, min(Nrows, Ncols), d_A, Nrows, d_TAU, d_Q, Nrows, work, work_size, devInfo));

double *d_C;

gpuErrchk(cudaMalloc(&d_C, Nrows * Nrows * sizeof(double)));

gpuErrchk(cudaMemcpy(d_C, h_C, Nrows * Nrows * sizeof(double), cudaMemcpyHostToDevice));

cusolveSafeCall(cusolverDnDormqr(solver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_T, Nrows, Ncols, min(Nrows, Ncols), d_A, Nrows, d_TAU, d_C, Nrows, work, work_size, devInfo));

double *d_R;

gpuErrchk(cudaMalloc(&d_R, Ncols * Ncols * sizeof(double)));

double *d_B;

gpuErrchk(cudaMalloc(&d_B, Ncols * Ncols * sizeof(double)));

dim3 Grid(iDivUp(Ncols, BLOCK_SIZE), iDivUp(Ncols, BLOCK_SIZE));

dim3 Block(BLOCK_SIZE, BLOCK_SIZE);

copy_kernel << <Grid, Block >> >(d_A, d_R, d_C, d_B, Nrows, Ncols);

const double alpha = 1.;

cublasSafeCall(cublasDtrsm(cublas_handle, CUBLAS_SIDE_LEFT, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N, CUBLAS_DIAG_NON_UNIT, Ncols, Ncols,

&alpha, d_R, Ncols, d_B, Ncols));

gpuErrchk(cudaMemcpy(h_B, d_B, Ncols * Ncols * sizeof(double), cudaMemcpyDeviceToHost));

cusolverDnDestroy(solver_handle);

}

ПРИЛОЖЕНИЕ В

Код клиента на MATLAB.

clear;

colormap gray;

% 20 40 60

n = 60;

for i = 1 : n

theta = (rand() - 0.5) * 6;

phi = (rand() - 0.5) * 6;

X(i) = theta;

Y(i) = phi;

F(i) = SurfaceEq(theta, phi);

end

scatter3(X, Y, F, 40, [1, 0, 0], 'filled');

hold on;

F(size(X, 2) + 1) = 0.0;

F(size(X, 2) + 2) = 0.0;

F(size(X, 2) + 3) = 0.0;

C = Utilits(X, Y, F);

% [mX, mY] = meshgrid(min(X) : 0.5 : max(X), min(Y) : 0.5 : max(Y));

[mX, mY] = meshgrid(-3 : 0.2 : 3, -3 : 0.2 : 3);

S(size(mX, 1), size(mX, 2)) = 0.0;

for i = 1 : size(X, 2)

Q = (mX - X(i)) .^ 2 + (mY - Y(i)) .^ 2;

S = S + C(i) .* Q .* log(Q);

end

S = S + C(size(X, 2) + 1) + C(size(X, 2) + 2) .* mX + C(size(X, 2) + 3) .* mY;

for i = 1 : size(mX, 1)

for j = 1 : size(mX, 2)

O(i, j) = SurfaceEq(mX(i, j), mY(i, j));

end

end

mesh(mX, mY, S, abs(S - O));

alpha(0.1);

Diff = S - O;

r = sqrt(mean(Diff(:).^2));

disp(r);

disp(n);

Размещено на Allbest.ru


Подобные документы

  • Особенности графики системы MATLAB и ее основные отличительные черты. Построение графика функций одной переменной. Графики в логарифмическом масштабе, построение диаграмм, гистограмм, сфер, поверхностей. Создание массивов данных для трехмерной графики.

    реферат [1,4 M], добавлен 31.05.2010

  • Понятие и особенности организации технологии CUDA, принципы реализации алгоритма с его помощью. Генерация случайных чисел. Оценка производительности исследуемой технологии, специфика построения графических программ на основе, преимущества использования.

    контрольная работа [102,7 K], добавлен 25.12.2014

  • Последовательность построения поверхностей, картографирования значений глубин и сравнения полученных моделей при помощи модуля Geostatistical Analyst. Визуализация рельефа и создание 3D-моделей местности в ArcGIS. Создание видео-обзора 3D-поверхностей.

    курсовая работа [5,5 M], добавлен 23.04.2012

  • Возможности и синтаксис команд MATLAB, листинг программы и описание цикла. Порядок составления программы вычисления коэффициентов алгебраического интерполяционного многочлена и построения сплайн-функции, "склеенной" из кусков многочленов 3-го порядка.

    лабораторная работа [30,8 K], добавлен 04.07.2009

  • Преимущества архитектуры CUDA по сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических API. Создание CUDA проекта. Код программы расчёта числа PI и суммирования вектора CPU, ее технический вывод.

    курсовая работа [1,4 M], добавлен 12.12.2012

  • Анализ существующей технологии помощи клиентам в оформлении путевок. Обоснование требований к разрабатываемой сетевой технологии. Разработка графических форм интерфейса пользователя. Разработка новой технологии помощи клиентам в оформлении путевок.

    курсовая работа [4,7 M], добавлен 17.07.2014

  • Разработка вычислительного ядра для программного комплекса ModelBuilder. Общая архитектура взаимодействия с моделью. Подход для работы с двухмерной графикой. Визуализация модели в 3D. Алгоритм вставки цилиндра в модель. Матрица физических параметров.

    курсовая работа [2,2 M], добавлен 14.03.2012

  • Назначение и возможности пакета MATLAB. Цель интерполирования. Компьютерная реализация решения инженерной задачи по интерполяции табличной функции различными методами: кусочно-линейной интерполяцией и кубическим сплайном, а также построение их графиков.

    контрольная работа [388,3 K], добавлен 25.10.2012

  • Программно-аппаратный комплекс производства компании Nvidia. Код для сложения векторов, представленный в CUDA. Вычислительная схема СPU с несколькими ядрами SMP. Выделение памяти на видеокарте. Проведение синхронизации работы основной и GPU программ.

    презентация [392,5 K], добавлен 14.12.2013

  • Создание программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С# средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Определение математического аппарата, применение его в задаче.

    курсовая работа [500,4 K], добавлен 13.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.