- •Руководство программиста
- •1. Назначение программы
- •1.1. Назначение
- •1.2. Условия применения
- •2. Характеристика программы
- •2.1. Программа и параллельный алгоритм
- •2.2. Особенности функционального подхода к распараллеливанию
- •2.3. Примеры программ
- •2.3.1. Числа Фибоначчи
- •2.3.3. Рекурсивный обход дерева
- •2.5. Особенности реализации в различных операционных системах
- •2.5.1. OpenTs для Windows
- •2.5.1.1. Платформа Windows Compute Cluster Server
- •2.5.1.2. Инсталлятор
- •2.5.1.3. Набор для разработчика (sdk)
- •2.5.1.4. Интеграция с Visual Studio 2005
- •2.5.1.5. Сборка t-приложений
- •2. Локально в параллельном режиме, используя mpiexec:
- •3. На кластере, используя приложение Cluster Job Submission and Monitoring Console, которое поставляется вместе с Compute Cluster Pack:
- •2.6. Особенности организации параллельных вычислений при помощи т- системы
- •2.7. Программное обеспечение т-системы и дополнительные возможности
- •2.7.2. Архитектура ядра т-системы
- •2.8. Сервисные возможности т-системы
- •2.9. Алгоритм поддержки общей памяти
- •2.9.1. Решения, использованные при построении Суперпамяти
- •2.9.2. Описание архитектуры и программной реализации Суперпамяти
- •2.9.3. Передача значений с узла на узел
- •2.9.4. Алгоритм работы сборщика программного мусора
- •2.9.5. Операции присваивания и «замораживания» неготовых величин
- •2.9.6. Возможное расширение адресного пространства суперпамяти для поддержки распределенных вычислительных сетей
- •2.10. Планирование в OpenTs
- •2.10.1. Постановка задачи
- •2.10.2. Алгоритм планирования
- •Допустим, мы имеем данные t1, t2 и d(t). Рассмотрим эффект от пересылки некоторой задачи с узла 1 на узел 2. Предположим,
- •Где δi зависят от сложности задачи и ее сетевой активности. При этом:
- •2.11. Метапланировщик OpenTs
- •2.12. Поддержка отказоустойчивости исполнения т-приложений
- •2.12.1. Неготовые значения и незавершенные по причине сбоя вычисления
- •2.12.2. Вектор перерождений
- •2.12.3. Вектор посещений
- •2.12.4. Классы повреждений т-функции в случае сбоя
- •3. Обращение к программе
- •3.2. Пример программы, использующей суперпотоки (уровень s)
- •3.3. Использование т-структур и массивов переменного размера
- •3.4. Описание классов реализации системы OpenTs
- •3.4.1. Уровень суперпамяти и суперпотоков
- •3.4.2. Уровень мобильных объектов, мобильных ссылок и мобильных заданий
- •3.4.3. Уровень поддержки т-семантики
- •3.4.4. Сервисные классы
- •3.6. Определение т-контекста во время исполнения программы
- •4. Сообщения
- •4.1. Цветовая схема
- •4.2. Сообщения о фатальных ошибках
- •4.3. Информационные сообщения
- •5. Приложение a. Пример вставки и замены листьев в дереве.
- •6. Приложение b. Использование динамического массива.
4.2. Сообщения о фатальных ошибках
"Regexp `%s' compilation failed!"
указанное регулярное выражение-фильтр для визуализации системных событий (режим отладки) не удалось откомпилировать.
”Unknown TCT option %s !"
неизвестная опция командной строки (следует за ключом -tct), определяющей начальный Т-контекст времени исполнения
"Internal feature failed"
одно из встроенных расширений Т-микроядра не удалось проинициализировать
"Stack overflow"
недостаточно памяти для требуемого программой количества суперпотоков
“Threads initialization failed"
Ошибка на стадиии инициализации подсистемы поддержки суперпотоков
"Out of memory"
недостаточно памяти для программы
“MPI_Error[%d != %d]: %.*s"
сбой подсистемы обмены сообщений MPI
"No free MPI_Request (%d tries)"
недопустимая задержка в подсистеме коммуникаций
”Out of supermemory"
исчерпан лимит ячеек суперпамяти. Необходимо увеличить размер суперматрицы.
“Deadlock detected" - внутреняя ошибка синхронизации.
"Drop or freeze on unitialized T-value!" - Т-функция не проинициализировала один из своих выходных аргументов
4.3. Информационные сообщения
Эта группа сообщений сигнализирует либо об исключительно важных для оператора событиях, либо выводятся в режиме отладки (опция компилятора -dbg)
“MemoryLeak: ...”
в программе осталась неосвобожденная память в момент завершения
“main result is ready and %d TFuns are still working. Memory leaks are possible”
в момент завершения головной функции tfun main остались работающие Т-функции.
“Leaked cell %x,%lld with data %s (%d bytes)”
в программе осталась неосвобожденная суперпамять в момент завершения
“local memo works”
началось повторное использование результатов мемо-функций на одном узле
“global memo works”
началось повторное использование результатов мемо-функций, вычисляющихся на других узлах
5. Приложение a. Пример вставки и замены листьев в дереве.
Файл trefal.tcc
#include <iostream>
#define DBG fprintf(stderr,"%d: %d\n",ts::myRank,__LINE__)
using namespace std;
struct Expr;
typedef ts::TVar<Expr> TExpr;
struct Expr : private ts::TExtData
{
private:
TExpr* terms;
void copyFrom (const Expr& e, size_t start, size_t length) {
TExpr* p = *this;
const TExpr* q = e;
q += start;
for (unsigned i = 0; i < length; i++)
new (p++) TExpr(*q++);
}
void clear () {
if (terms) {
delete[] terms;
terms = 0;
} else {
TExpr* p = *this;
for (unsigned i = 0; i < getLength(); i++)
p++->~TExpr();
}
}
public:
Expr () : terms(0) {};
void init (size_t s) {
assert(!terms);
terms = new TExpr[s];
extDataSize() = s * sizeof(TExpr);
};
operator const TExpr* () const { return terms ? terms : (TExpr*)extData(); }
operator TExpr* () { return terms ? terms : (TExpr*)extData(); }
Expr (const Expr& e) : terms(0) {
copyFrom(e, 0, e.getLength());
}
Expr& operator= (const Expr& e) {
if (this != &e) {
clear();
init(e.getLength());
copyFrom(e, 0, e.getLength());
}
return *this;
}
Expr subexpr (size_t start, size_t length) const {
Expr e;
e.init(length);
e.copyFrom(*this, start, length);
return e;
}
size_t getLength () const {
return extDataSize() / sizeof(TExpr);
}
TExpr& operator[] (int i) {
return ((TExpr *)*this)[i];
}
~Expr () {
clear();
}
};
// e is intentionally not const!
ostream& operator< (ostream& os, Expr& e) {
os < e.getLength();
TExpr* p = e;
for (unsigned i = 0; i < e.getLength(); i++)
os < " (" < (Expr &)*p++ < ")";
return os;
}
istream& operator> (istream& is, Expr& e) {
size_t len;
char c1, c2;
is > len;
e.init(len);
TExpr* p = e;
for (unsigned i = 0; i < len; i++) {
is > c1 > (Expr &)*p++ > c2;
assert (c1 == '(' & c2 == ')');
}
return is;
}
Expr operator+ (const Expr& e1, const Expr& e2) {
Expr e;
e.init(e1.getLength() + e2.getLength());
TExpr* p = e;
const TExpr* q = e1;
for (unsigned i = 0; i < e1.getLength(); i++)
new (p++) TExpr(*q++);
q = e2;
for (unsigned i = 0; i < e2.getLength(); i++)
new (p++) TExpr(*q++);
return e;
}
tfun int insert (TExpr e, TExpr s, Expr tout out) {
Expr& x = (Expr&) e;
if (x.getLength() == 0) {
out = (Expr&) s;
} else {
TExpr z;
Expr& o = (Expr&) z;
o.init(x.getLength());
TExpr* p = o;
TExpr* q = x;
for (unsigned i = 0; i < x.getLength(); i++)
insert(*q++, s, *p++);
out = o;
}
return 0;
}
Expr empty;
tfun int subst (TExpr e, TExpr s, Expr tout out) {
Expr& x = (Expr&) e;
if (x.getLength() == 0) {
out = empty;
} else {
TExpr out1;
TExpr* q = x;
if (((Expr&)*q).getLength() == 0)
out1 = s;
else {
TExpr o;
subst(*q, s, o);
((Expr&) out1).init(1);
((TExpr*)(Expr&) out1)[0] = o;
}
TExpr out2;
TExpr e2;
((Expr&) e2) = x.subexpr(1, x.getLength() - 1);
subst(e2, s, out2);
out = (Expr&)out1 + (Expr&)out2;
}
return 0;
}
tfun int main (int argc, char *argv[]) {
TExpr s;
TExpr e;
TExpr out;
cin > e > s;
cerr < "expr: " < e < endl < "subst: " < s < endl;
insert(e, s, out);
cerr < "after insert: " < out < endl;
TExpr out2;
insert(e, s, out2);
subst(out2, s, out2);
cerr < "after subst.insert: " < out2 < endl;
return 0;
}
