Рассмотрим решение известной квантовомеханической задачи об описании движения одномерной частицы. Для этого, как известно, необходимо найти комплексную волновую функцию , являющуюся решением нестационарного уравнения Шредингера:
(1) |
где - постоянная Планка, - масса частицы. Величина определяет вероятность нахождения частицы в момент времени в элементе "объема" в точке . Вероятностная интерпретация означает, что следует использовать нормированные волновые функции, т.е. функции, удовлетворяющие условию.
(2) |
Функции, удовлетворяющие условию нормировки (2), отличны от нуля в некоторой области конечной ширины и равны нулю вне данной области, поэтому говорят, что функция описывает волновой пакет, который характеризуется координатой центра, энергией и шириной. На основании приведенных выше рассуждений необходимо описать эволюцию во времени волнового пакета с известными в момент времени (координатой центра пакета, шириной пакета, энергией пакета) при падении на потенциальный барьер заданной формы [2].
Рассматривалась возможность взаимодействия MATLAB и GPU, для ускорения вычислений, производимых в среде MATLAB [3]. Написаны две программы, представляющие собой решение нестационарного уравнения Шредингера. Одна из них находит решение с использованием центрального процессора, другая – с использованием графического.
В таблице 1 приводится часть кода скрипт-файлов, в которых выполняется вызов двух основных функций. Различия между GPU и CPU версиями выделены полужирным начертанием.
Таблица 1
Версия GPU |
Версия CPU |
Np(1, Npoints) = 1 k_0(1, Npoints) = 1 x_0(1, Npoints) = -100 sigma(1, Npoints) = 2 xb = zeros(1, Npoints A_(1, Npoints) = 60 Nb(1, Npoints) = 3 v_0(1, Npoints) = 1.5 Norm_Coeff(1, Npoints) = 1; gx = gpuArray(x); L = zeros(1, Npoints); gV = gpuArray(L); gPsi = gpuArray(L); gV = arrayfun(@Barrier,x,v_0, xb, A_, Nb); gPsi = arrayfun(@Package_Norm, x, k_0, x_0, sigma, Norm_Coeff, Np); |
Np = 1; k_0 = 1; x_0 = -100; sigma = 2; xb = 0; A = 60; Nb = 3; v_0 = 1.5; Norm_Coeff = 1; parfor j = 1:Npoints V(j) = Barrier(x(j), v_0, xb, A, Nb); end parfor j = 1:Npoints Psi(j) = Package_Norm(x(j), k_0, x_0, sigma, Norm_Coeff, Np); end |
Следует отметить, что функции, предназначенные для GPU, незначительно отличаются от исходных из-за особенностей работы с графическим процессором. Так как искомая функция в общем случае комплексная, то удобно представить графики трех зависимостей: , и . Причем последний график, как говорилось ранее, будет представлять вероятность того, что частица находится в заданном объеме. Ниже представлены графики данных зависимостей в начальный момент времени .
Рис. 1. Действительная (слева) и мнимая (справа) часть волновой функции в момент времени
Рис. 2. Квадрат модуля волновой функции и потенциальный барьер в момент времени
Обработка результатов проводилась на персональном компьютере со следующими характеристиками:
Таблица 2
Системные характеристики: |
|
Производитель |
Acer |
Модель |
Aspire 5750G |
Оценка |
4,6 Индекс производительность Windows |
Процессор |
Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz |
Установленная память (ОЗУ) |
4,00 Гб (3,85 Гб доступно) |
Тип системы |
64-разрядная операционная системы |
Видеокарта |
NVIDIA GeForce GT 630M |
Тестирование быстродействия осуществлялось с помощью встроенной функции MATLAB profiler. Так была измерена скорость выполнения двух основных функций, представленных в таблице 1. Например, при задании 500 начальных точек, были получены следующие результаты:
Рис. 3. Время, затраченное на работу программы при использовании GPU
Рис. 4. Время, затраченное на работу программы без использования GPU
Результаты зависимости времени работы программы от количества обрабатываемых точек с использованием GPU и без представлены на рис. 5.
Рис. 5. Сравнение скорости выполнения программы.
Можно сделать вывод, что для относительно малого числа точек, в данном случае до 5000, не имеет смысла реализовывать алгоритм на GPU, так как время работы с данными для двух процессоров практически одинаковое. Однако при дальнейшем увеличении количества точек, скорость работы программы с использованием GPU становится в разы быстрее, чем без его использования. Так, например, при использовании 500000 точек, для их обработки CPU потребовалось 270,73 секунд, в то время как программа с использование GPU затратила на их обработку всего лишь 8,53 секунды. Это говорит о том, что скорость работы программы на GPU в 31,74 раза выше. Таким образом, при решении вычислительных задач, важно обращать внимание на объемы входных данных, поскольку значительный прирост в скорости можно достичь только при большом количестве исходных данных. Так же необходимо учитывать тот факт, что реализацию некоторых функции для GPU придется писать собственноручно из-за ограниченности встроенных функций для GPU. Можно говорить о том, что GPU и MATLAB действительно дают возможность производить сложные научные вычисления и при этом не используют огромные компьютерные мощности.
ЛИТЕРАТУРА
NVIDIA. [Электронный ресурс], режим доступа - http://www.nvidia.ru, свободный.
EXPonenta.ru, Образовательный математический сайт. [Электронный ресурс], режим доступа - http://www.exponenta.ru/educat/systemat/porshnev/shred1/main.asp, свободный.
ТУСУР ТОР, Кафедра телекоммуникаций и основ радиотехники, Использование технологии CUDA для ускорения пакета MATLAB. [Электронный ресурс], режим доступа - http://me.tusur.ru/index.php?option=com_content&view=article&id=87:cudst&catid=59:grkat&Itemid=59, свободный.
Многофункциональный сайт. [Электронный ресурс], режим доступа - http://habrahabr.ru/post/119892/, свободный.