Введение
В начале 20 века математиками и инженерами было четко осознано, что существует классы задач( к примеру: мат моделирование, численное решение задач), которые в принципе не решаются аналитически. Решение некоторые из них связано с опасностью или невозможностью проводить эксперименты по изучения процесса(формирование черных дыр, погодные изменения, квантово-молекулярная химия). Так же существуют классы задач, решение которых аналитическими методами является крайне затруднительным.
Считалось, что эти задачи не могут быть решены в принципе. Но ближе к середине 20 века на сцену вышла вычислительная техника. Прогресс вычислительной техники и породил понятие - Высокопроизводительные вычисления(High-performance computing). Все дальнейшее развитие науки тесно связано с компьютерной техникой и высокопроизводительной техникой.
Существует пирамида компьютерной техники:
На самой вершине пирамиды находится то, о что обычно представляют, когда говорят о высокопроизводительных вычислениях. Это Суперкомпьютеры. Они отражены в списке TOP500, составляющемся 2 раза в год на основе теста LINPACK (теста основой которого является решения систем линейных уравнений. Этот тест выбран по тому, что он может быть распараллелен прекрасно на огромное число вычислительных ядер. Ранее применялся другой тест для составления определения мощности супер компьютеров, заключавшийся в генерировании максимально больших простых чисел, но он как правило плохо подвергается распараллеливанию.)
Именно на этих компьютерах проводят основные эксперименты современной науки:
1. численное моделирование
2. расчет графики высокой четкости
В списке супер компьютеров представлены, как правило компьютеры построенные по принципу КЛАСТЕРОВ
Эти машины производят вычисления для крупных научных проектов таких, как создание новых материалов, гидро-газодинамика, моделирования компонентов двигателей, прогнозы изменения климата, обработка данных с космических телескопов.
Существует множество численноёмких задач производства, которые так же необходимо решать. Звучит смешно, но компания P&G проводит оптимизационные расчеты для многих своих продуктов, от создания чистящих средств и их моделирования методами математики и химии, до расчеты оптимальных упаковок для жвачки. Эти исследования ставятся компанией в качестве приоритета, и все эти задачи экономически обоснованы. Выигрыш в 1 цент на каждую единицу товара, который производится в миллионном количестве оправдывает затраты как на специалистов проводящих исследования, так и на оборудование. Этот пример подтверждает необходимость использования высокопроизводительных вычислений в научных и прикладных целях.
Операционные системы
Корпорация Microsoft, представляет в качестве составной части кластерной инфраструктуры Microsoft HPC SERVER (2003/2008/2008r2 cpt). Система основана на Windows Server, оптимизированном для работы в корпоративной среде и проведения математических расчетов. На борту сразу после установке находится средстава исполнения программ написанных для вычислительных систем с разделенной памяти- MSMPI(соответствующая версии стандарты MPICH2), средства запуска и мониторинга исполнения задач. Microsoft позиционирует эту систему, как основу компьютерных вычислений уровня предприятия. На уровень суперкомпьютерных вычислений, пока официальных притязаний нет, хотя и в TOP500 находится на 23(осенью 2009 года был на 9 ) месте кластер под управлением MS HPC SERVER, установленный в Китае.
В качестве примера использования можно привести
“Кластер под управлением Windows Compute Cluster Server позволяет Институту Космических Исследований РАН оценить состояние и изменения растительности на планете.”
Существует масса других примеров, прочитать о которых вы можете на сайте проекта: http://www.microsoft.com/rus/hpc/
Существует целые курсы по для желающих изучить эту технологию Microsoft.
- channel9
- windows hpc
- webcasts
Система MS HPC Server состоит из 2 компонентов
- MS HPC SERVER
- HPC PACK
Пример запуска задач с помощью Cluster Manager (из блога на msdn)
Для успешных расчётов на кластере необходимо, чтобы файл программы и все входные данные были доступны всем узлам. В данном случае (и в любом другом) наиболее оптимально использовать файлы, лежащие в сети, куда имеют доступ все узлы (включая главный узел).
CM находится в Start=>Programs=>HPC Pack 2008=>HPC Cluster Manager. После запуска необходимо выбрать Job Management в левом нижнем углу, после чего откроется консоль управления задачами. Все задачи разделены на «все», «мои», каждый вид подразделяется на «Настраиваемые в данный момент», «Выполняющиеся», «Закончившиеся», «Закончившиеся с ошибкой», «Отменённые».
Для добавления задач необходимо использовать консоль справа Actions, подменю Job Submission. В зависимости от тип задачи, можно выбрать new Job, new Single-Task Job, new Parametric Sweep job
New Job: диалог для создания задачи, в которой может быть несколько подзадач. Из необходимых для выбор полей отметим Job resources: может быть «ядро», «сокет», «узел». Use assigned resourses exclusively for this job указывает менеджеру задач, что выбранные ресурсы будут заняты данной задачей эксклюзивно.

Следующая вкладка Task List, отвечает за добавление подзадач:

Добавить можно Basic Task, Parametric Task, Task From File.

Command line: как необходимо запускать задачу.
mpiexec\\hnwindows\share\myMPIProject.exe*
(.exe можно опустить).
Working directory: рабочая директория, относительно которой будут определяться абсолютные пути для standard input/output/error.
Standard input: файл с входными данными
Standard output: файл для выходных данных
Standard error: файл для ошибок выполнения.
После нажатия Submit, если всё было заполнено верно, задача появится в вкладке Active:
После окончания расчётов задача сменит статус либо на Finished:

Поскольку не был указан файл для выходных данных, мы можем посмотреть их, два раза нажав на свойствах задачи в окне внизу.
Пример запуска параметрической задачи из командной строки:
Job submit /parametric:6-12:1 /jobname:”MyParametricSweep” mpiexec\\hnwindows\share\MyMPIProject.exe *

ИнтеграцияVisual Studio и mpiexec.
Есть также дополнительный способ интеграции Visual Studio и mpiexec, нестандартный, но, тем не менее, позволяющий оперировать кластерными вычислениями непосредственно из Visual Studio, без запуска HPC Cluster Manager, mpiexec и т.д.
Так, в подменю Tools находится раздел Other tools (в русской версии Сервис=>Внешние инструменты).

Command – путь к mpiexec от необходимой реализации MPI. В аргументах необходимо указать путь к проекту ($(TargetPath)), в Initial Directory – директорию проекта.
Из полезных дополнительных опций следует отметить use output window – использовать консоль для вывода результатов.
Таким образом, мы получаем полный доступ к функциональности mpiexec и других утилит, поставляемых с HPC Pack 2008. В качестве пример приведу настройку External tools для добавления и расчёта задачи на кластере в HPC Job Manager:
Command: C:\Program Files\Microsoft HPC Pack\Bin\job.exe
Arguments: submit /numcores:16 mpiexec\\hnwindows\share\MyMPIProject.exe
Программирование:
Существует 2 классических типа суперкомпьютерных систем.
- системы с общей памятью
- системы с разделяемой памятью.
Для систем с общей памятью характерно использование технологий создания потоков для 1 вычислительного узла, таких как openmp.
Для систем в разделяемой памятью, таких как кластера, характерно использование технологии межкомпьютерного взаимодействия -MPI.
Программы для кластеров можно конечно писать и в каком-нибудь блокноте, но лучше для этого использовать какую-нибудь IDE. До VS2010 можно было использовать обычные проекты программ на C++ подключив mpi.h. Сейчас в VS2010 можно создать проект типа mpi progect, и VS уже будет полноценно помогать вам всеми своими функциями в написании программ.
Пример кода на C++
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <math.h>
#include <windows.h>
#include <mpi.h>
using namespace::std;
int myRank;
int numProcs;
char host[256];
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs); // number of processes involved in run
MPI_Comm_rank(MPI_COMM_WORLD, &myRank); // my process id: 0 <= myRank < numProcs
gethostname(host, sizeof(host)/sizeof(host[0])); // machine we are running on
cout << "Process " << myRank << " of " << numProcs << " is running on '" << host << "'." << endl;
MPI_Finalize();
return 0;
}
Результат выполнения программы, собранной после выполнения на головном узле

GPGPU
Современный графические карты, ранее применявшиеся лишь для отрисовки графики, стали необычайно мощными и продвинутыми. Ранее использовать вершинные шейдерные было крайне тяжело, в связи с необходимостью работать на уровне ассемблера, и проводить можно было только графические преобразования. Современные GPGPU предоставляют широкие возможности вычислений более общего назначения чем расчет графики. Для задач, которые позволяют использовать принципы “массивно параллельной обработки” вполне может быть использованы GPGPU. Разные компании предоставляют свои API для работы с ними. CUDA, STREAM –это продукты g и AMD соответственно. OPENCL создан как стандарт программирования массивно параллельных систем(CELL, GPGPU). Он определяет определенную абстракцию, но в рамках этого стандарта можно оптимизировать программы для работы на определенных технологиях(CUDA, STREAM, CELL) без существенного ущерба для производительности.
Для программирования на CUDA с использованием CUDA SDK и CUDA TOOLKIT удобно применять VS2008. На сайте NVidia существует раздел для разработчиков на CUDA.
Для программистов на платформе .net создается прослойка абстракции над технологией CUDA, называемая CUDA.Net .Она предоставляет api для доступа к возможностям GPGPU.
Существует множество задач, которые вполне ложатся на архитектуру различных GPGPU, о которых можно прочитать на сайте производителей, к примеру NVIDIA. Могу привести пример, что Французская лаборатория по изучению течений и приливов, заменила свой вычислительный кластер стоимостью 5млн.$ и замени на систему из двух компьютеров по 2 серверных процессора XEON и по 4 GPGPU(tesla) в каждом. Цена такого решения на порядок дешевле оказалась, при увеличении скорости решения задач. Но повторюсь нужно внимательно смотреть на возможность использования GPGPU для каждой конкретной задачи.