Автоматическое распараллеливание программ для распределенных систем. Статическое построение расширенного графа управления

Основные направления развития параллелизма, модели параллельного программирования. Автоматические средства разработки параллельного ПО, анализ последовательной программы. Разработка системы автоматического распараллеливания программ на языке Fortran77.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 14.10.2010
Размер файла 57,7 K

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

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

int Variant () - тэг вида элемента: переменная или массив.

int Type - код типа.

char *Name - строка имени.

int Dim () - размерность (для массива).

int DimLen (int i) - длина по i-му измерению (для массива).

cSymbolSg *LinkRight () - следующий в списке элемент.

cSymbolSg *LinkLeft () - предыдущий в списке элемент.

long int ExportData (ofstream&) - экспорт элемента в файловый поток.

int operator == (cSymbolSg&), operator != (cSymbolSg&)

8) Класс cExpressionSg - представляет выражение. Текущая реализация класса позволяет хранить только выражения вида c1*V+c0, где c1,c0 - константы, V - переменная.

cExpressionSg (SgExpression*, cSymbolTabSg*) - конструктор класса, параметрами являются подлежащее разбору выражение, представленное объектом Sage++, и таблица символов, которая будет дополнена входящим в состав выражения идентификатором.

int Variant () - тэг вида выражения.

cSymbolSg *poVariable - ссылка на переменную выражения.

int IntC0 (), IntC1 () - значения констант, приведенные к типу int.

float RealC0 (), RealC1 () - аналогично, float.

double DoubleC0 (), DoubleC1 () - аналогично, double.

long int ExportData (ofstream&) - экспорт выражения в файловый поток.

int operator == (cExpressionSg&), operator != (cExpressionSg&)

9) Класс cArrayRefSg - представляет ссылку на элемент массива.

cArrayRefSg (SgArrayRefExp*, cSymbolTabSg*) - конструктор класса, параметрами являются подлежащая разбору ссылка на элемент массива, представленная объектом Sage++, и таблица символов, в которую будут добавлены входящие в ссылку переменные и имя массива.

SgArrayRefExp *poSgArrRef - исходный объект Sage++.

cSymbolSg *poSym - идентификатор массива.

int SubscrNum - количество индексных выражений в ссылке.

cExpressionSg* SubscrList [df_MAX_DIM] - массив индексных выражений.

long int ExportData (ofstream&) - экспорт в файловый поток.

int operator == (cArrayRefSg&)

int operator != (cArrayRefSg&)

10) Класс cVarListElemSg - представляет элемент списка обращений к переменным и массивам.

cVarListElemSg (SgVarRefExp*, cSymbolTabSg*), cVarListElemSg (SgArrayRefExp*, cSymbolTabSg*) - конструкторы класса, 1-й для разбора обращения к переменной, параметрами являются ссылка на переменную, представленная объектом Sage++, и таблица символов, в которую будут добавлены идентификаторы; 2-й для разбора ссылки на массив, параметры имеют тот же смысл.

int Variant () - тэг вида элемента (ссылка на переменную или на массив).

cSymbolSg *poSym - идентификатор переменной для ссылки 1-го вида.

cArrayRefSg *poArr - ссылка на массив для 2-го вида.

long int ExportData (ofstream&) - экспорт в файловый поток.

int operator == (cVarListElemSg&)

int operator != (cVarListElemSg&).

Для каждого из описанных классов существует его аналог во втором наборе, имеющий такое же имя за исключением постфикса “Sg”. В классах-аналогах отсутствуют методы для построения структур и конструкторы разбора. Корректная инициализация объектов этих классов производится только за счет введенных методов импорта из файлового потока. В классе cProgramGraphNode добавлены члены-данные для хранения директив FortranDVM, формирование которых осуществляет блок распределения вычислений и данных, и методы для их вставки, а также реализован экспорт этих комментариев в файл.

3.3 Алгоритмы

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

На самом внешнем уровне программы построения и экспорта всех структур находится функция main(). Ее основное содержание заключается в следующих строках:

cSourceProgramSg TestProg(projfile);

TestProg.PrepareAll();

TestProg.BuildAll();

TestProg.PrintAll(cout);

TestProg.ExportData(trgfile);

В первую очередь создается объект класса cSourceProgramSg, параметром конструктора которого является имя файла-проекта Sage++. Далее вызываются методы этого класса:

PrepareAll() - предварительная обработка Sage++ представления исходного приложения;

BuildAll() - построение всех структур;

PrintAll(cout) - вывод в поток cout построенных структур для просмотра;

ExportData(trgfile) - экспорт данных в файлы.

void cSourceProgramSg::PrepareAll()

Вызывает методы того же класса:

PrepareConsts(); - подготовка констант.

PrepareLoops(); - подготовка циклов.

void cSourceProgramSg::PrepareConsts()

Осуществляет замену обращений к константам их значениями. Алгоритм:

Просмотр таблицы имен Sage++ и составление списка объявленных констант и их значений.

Обход всех операторов программы и поиск во входящих в них выражениях использования каждой из констант.

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

При таком алгоритме, например, выражение 2*N+M+t, где N=100, M=5, будет заменено выражением 205+t.

void cSourceProgramSg::PrepareLoops().

Приводит все циклы программы к виду DO-ENDDO. Просматривает операторы программы. Для найденных циклов применяет метод Sage++, выполняющий такое преобразование.

void cSourceProgram::BuildAll().

BuildLoopList(); - построение списка циклов.

BuildProgGraph(); - построение графа.

void cSourceProgram::BuildLoopList().

LpList()->Build(FirstSt(), LastSt(), 0); - построение списка циклов.

LpList()->Analyse(); - анализ построенного списка.

void cLoopListSg::Build(SgStatement *first_line, SgStatement *last_line, int cur_lev).

Этот метод производит последовательный просмотр операторов в промежутке от first_line до last_line включительно с обеих сторон. При обнаружении оператора-заголовка цикла, осуществляется добавление к списку циклов нового элемента, в качестве его уровня вложенности принимается значение cur_lev. Затем метод вызывает себя со следующими параметрами: следующий оператор после обнаруженного заголовка цикла - first_line, оператор завершения найденного цикла - last_line, cur_lev+1 - для cur_lev в новом вызове. После возвращения из рекурсивного вызова просмотр продолжается с оператора завершения найденного цикла. Метод добавления нового элемента к списку цикла устроен так, что текущий указатель списка перемещается на вновь добавленный.

void cLoopListSg::Analyse().

Для каждого элемента списка:

AnalyseHead(SymTab()); - анализ заголовка.

AnalyseBodyVars(SymTab()); - анализ обращений к переменным и массивам в теле.

AnalyseRedVars(SymTab()); - поиск редукционных переменных.

AnalyseIoOp(); - поиск операторов ввода\вывода.

AnalyseGotoOp(); - анализ операторов перехода.

void cLoopListSg::AnalyseRedVars(cSymbolTabSg*).

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

перем = {перем} {операция} {выражение}, или (1)

перем =min/max({выражение} {перем}), или (2)

IF ({перем}{.GT.|.LT.}{выражение})

{перем}={выражение} (3)

{операция}="+"|"*" (4)

где {выражение} не содержит {перем}, а также {перем} нигде больше не используется в данном цикле. Условие (3) есть другая реализация условия (2). Также необходимо обнаруживать редукционные переменные в выражениях вида:

{перем}={выражение}{операция}{перем}{операция}{выражение} (5), где выполняются те же условия, что и в (1)-(4), но при этом {операция} стоящая по обе стороны {перем} одинакова и если {операция} ="+", то {выражения} не содержат операций умножения и деления.

void cSourceProgramSg::BuildProgGraph().

PrgGraph()->Build(FirstSt(), LastSt(), 0, sy_DIR_RIGHT1); - построение графа.

PrgGraph()->Analyse(); - анализ построенного графа.

void cProgramGraphSg::Analyse().

CountOpers();

void cProgramGraphSg::Build (SgStatement *first_line, SgStatement *last_line, int cur_lev, int cur_dir).

Для идентификации каждого из возможных направлений добавления новых элементов определены константы:

sy_DIR_RIGHT1, sy_DIR_RIGHT2, sy_DIR_DOWN

Добавление нового звена в некотором направлении осуществляется при помощи методов cProgramGraphSg::AddNewRight1 ();

cProgramGraphSg::AddNewRight2 ();

cProgramGraphSg::AddNewRightFull (); - специальное добавление для блока слияния;

cProgramGraphSg::AddNewDown ();

При этом текущий указатель графа перемещается на новый блок.

Поскольку в графе отсутствует заглавное звено, первый узел графа строится особым образом независимо от указанного направления.

Алгоритм работы метода (рекурсивный):

Перемещение текущего указателя списка циклов на первый элемент.

Запомнить номер текущего элемента графа в переменной node1.

Начать цикл прохода с first_line.

switch

Если текущий оператор - заголовок цикла

Если перед этим прошли какое-то количество операторов, т.е. надо добавить линейный блок, определяем направление добавления следующим образом:

Если еще ничего не добавляли и cur_dir == sy_DIR_DOWN

Добавить вниз.

Иначе

Если ничего не добавляли и cur_dir == sy_DIR_RIGHT2

Добавить вправо2.

Иначе

Добавить вправо1.

{такой анализ связан с тем, что когда мы добавляем 1-е звено в данном вызове метода, мы должны учитывать переданное направление; в остальных случаях добавление блоков на одном уровне происходит вправо1}

Запомнить номер текущего (только что добавленного) элемента в node1.

Заполнить блок информацией.

{теперь надо добавить блок для найденного цикла}

Определить направление аналогично и добавить.

Заполнить блок информацией.

Добавить в него информацию из текущего элемента списка циклов и сдвинуться в списке вправо.

Вызвать рекурсивно Build с телом найденного цикла, cur_lev+1, sy_DIR_DOWN.

Установить указатель текущего оператора на конец цикла (ENDDO).

Если текущий оператор - заголовок ветвления

Проверка на необходимость добавления линейного блока - аналогично.

Добавить блок развилки в нужном направлении - аналогично.

Запомнить номер текущего блока (развилка) в переменной node2.

Заполнить блок информацией.

Добавить слияние.

Запомнить номер текущего блока (слияние) в переменной node3.

Вернуться влево (на развилку).

Вызвать Build с телом 1-й ветви, cur_lev, sy_DIR_RIGHT1.

Перейти на блок node2.

Вызвать Build с телом 2-й ветви, cur_lev, sy_DIR_RIGHT2.

Перейти на блок node3 (далее надо добавлять после слияния).

Установить указатель текущего оператора на конец ветвления (ENDIF).

Если текущий оператор - логический IF

Аналогично, только второй ветви нет.

Если текущий оператор - IF-ELSEIF

Аналогично, только ELSEIF обрабатывается как новый IF-THEN.

Конец switch

Если текущий оператор == last_line

Закончить цикл просмотра

Проверка на наличие линейного участка - аналогично.

Перейти на блок node1 (тот, на котором были перед вызовом).

Заключение

Реализованные в дипломной работе классы C++ выполняют следующие функции, соответствующие ее задачам:

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

экспорт этих структур в файлы;

предоставление блоку распределения вычислений и данных методов доступа к сохраненным структурам;

дополнение внутреннего представления программы директивами FortranDVM, сформированными блоком распределения вычислений и данных.

Общий объем разработанного программного кода - около 4500 строк на языке C++.

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

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

Библиография

“Sage++ user's guide (online)”, May 1995, Version 1.9

“Designing and Building Parallel Programs (Online) v1.3”, © Copyright 1995 by Ian Foster

“The Polaris Internal Representation.” Keith A. Faigin, Jay P. Hoeflinger, David A. Padua, Paul M. Petersen, and Stephen A. Weatherford. International Journal of Parallel Programming, October 1994.

“The Structure of Parafrase-2: An Advanced Parallelizing Compiler for C and Fortran” Constantine Polychronopoulos, Milind B. Girkar, Mohammad R. Haghighat, Chia L. Lee, Bruce P.Leung, Dale A. Schouten. Languages and Compilers for Parallel Computing, MIT Press, 1990

Приложение

В качестве одной из тестовых программ использовалась реализация на языке Fortran77 алгоритма Якоби поиска решения системы линейных уравнений A x = b.

PROGRAM JACOB

PARAMETER (L=8, ITMAX=20)

REAL A(L,L), EPS, MAXEPS, B(L,L)

W = 0.5

MAXEPS = 0.5E - 7

DO 1 I = 1, L

DO 1 J = 1, L

A(I,J) = 0.

B(I,J) = (1. +I+J)*2.3

1 CONTINUE

DO 2 IT = 1, ITMAX

EPS = 0.

DO 21 I = 2, L-1

DO 21 J = 2, L-1

EPS = MAX (EPS, ABS(B(I,J)-A(I,J)))

A(I,J) = B(I,J)

21 CONTINUE

DO 22 I = 2, L-1

DO 22 J = 2, L-1

B(I,J) = (W/4)*(A(I-1,J)+A(I,J-1)+A(I+1,J)+A(I,J+1))+(1-W)*A(I,J)

22 CONTINUE

PRINT *, 'IT = ', IT, ' EPS = ', EPS

IF (EPS .LT. MAXEPS) THEN

GO TO 3

ENDIF

2 CONTINUE

3 OPEN (3, FILE='JACOBI.DAT', FORM='FORMATTED')

WRITE (3,*) B

END

Результат вывода в поток cout структур данных, построенных тестирующей программой.

Building Loop List

Building Loop List - ok

Building Prog Graph

Building Prog Graph - ok

Printing Loop List

Count= 7

Id= 1 Lev= 0 Counter: Id= 1 Name= i Start: 1 End: 8 Step: 1 IterNum: 8

Left vars: Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: i j

Id= 2 Lev= 1 Counter: Id= 3 Name= j Start: 1 End: 8 Step: 1 IterNum: 8

Left vars: Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: i j

Id= 3 Lev= 0 Counter: Id= 5 Name= it Start: 1 End: 20 Step: 1 IterNum: 20 Left vars: eps Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: eps Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0 w Array name= a Subscr0: 1*i+-1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+-1 Array name= a Subscr0: 1*i+1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+1

Id= 4 Lev= 1 Counter: Id= 1 Name= i Start: 2 End: 7 Step: 1 IterNum: 6

Left vars: eps Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: eps Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Id= 5 Lev= 2 Counter: Id= 3 Name= j Start: 2 End: 7 Step: 1 IterNum: 6

Left vars: eps Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: eps Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Id= 6 Lev= 1 Counter: Id= 1 Name= i Start: 2 End: 7 Step: 1 IterNum: 6

Left vars: Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: w Array name= a Subscr0: 1*i+-1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+-1 Array name= a Subscr0: 1*i+1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+1 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Id= 7 Lev= 2 Counter: Id= 3 Name= j Start: 2 End: 7 Step: 1 IterNum: 6

Left vars: Array name= b Subscr0: 1*i+0 Subscr1: 1*j+0

Right vars: w Array name= a Subscr0: 1*i+-1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+-1 Array name= a Subscr0: 1*i+1 Subscr1: 1*j+0 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+1 Array name= a Subscr0: 1*i+0 Subscr1: 1*j+0

Printing Loop List - ok

Printing Prog Graph

Count= 17

Id= 1 Lev= 0 Type= 1 Opers[4]=2 IsParal=0

Moving right1

Id= 2 Lev= 0 Type= 2 Loopid= 1 Opers[0]=16 Opers[2]=8 Opers[4]=16 IsParal=1

Moving down

Id= 3 Lev= 1 Type= 2 Loopid= 2 Opers[0]=2 Opers[2]=1 Opers[4]=2 IsParal=1

Moving down

Id= 4 Lev= 2 Type= 1 Opers[0]=2 Opers[2]=1 Opers[4]=2 IsParal=0

Moving up

Repeat Id= 3

Moving up

Repeat Id= 2

Moving right1

Id= 5 Lev= 0 Type= 2 Loopid= 3 Opers[0]=36 Opers[1]=24 Opers[2]=12 Opers[3]=6 Opers[4]=13 Opers[5]=1 Opers[6]=6 Opers[7]=6 IsParal=0

Moving down

Id= 6 Lev= 1 Type= 1 Opers[4]=1 IsParal=0

Moving right1

Id= 7 Lev= 1 Type= 2 Loopid= 4 Opers[1]=6 Opers[4]=12 Opers[6]=6 Opers[7]=6 RedVar[0]: var= eps op= 5 IsParal=1

Moving down

Id= 8 Lev= 2 Type= 2 Loopid= 5 Opers[1]=1 Opers[4]=2 Opers[6]=1 Opers[7]=1 RedVar[0]: var= eps op= 5 IsParal=1

Moving down

Id= 9 Lev= 3 Type= 1 Opers[1]=1 Opers[4]=2 Opers[6]=1 Opers[7]=1 IsParal=0

Moving up

Repeat Id= 8

Moving up

Repeat Id= 7

Moving right1

Id= 10 Lev= 1 Type= 2 Loopid= 6 Opers[0]=36 Opers[1]=18 Opers[2]=12 Opers[3]=6 IsParal=1

Moving down

Id= 11 Lev= 2 Type= 2 Loopid= 7 Opers[0]=6 Opers[1]=3 Opers[2]=2 Opers[3]=1 IsParal=1

Moving down

Id= 12 Lev= 3 Type= 1 Opers[0]=6 Opers[1]=3 Opers[2]=2 Opers[3]=1 IsParal=0

Moving up

Repeat Id= 11

Moving up

Repeat Id= 10

Moving right1

Id= 13 Lev= 1 Type= 1 IsParal=0

Moving right1

Id= 14 Lev= 1 Type= 3 Opers[5]=1 IsParal=0

Moving right1

Id= 16 Lev= 1 Type= 1 IsParal=0

Moving right1

Id= 15 Lev= 1 Type= 4 IsParal=0

Moving left1

Repeat Id= 16

Moving left1

Repeat Id= 14

Moving right2

Repeat Id= 15

Moving left2

Repeat Id= 14

Moving left1

Repeat Id= 13

Moving left1

Repeat Id= 10

Moving left1

Repeat Id= 7

Moving left1

Repeat Id= 6

Moving up

Repeat Id= 5

Moving right1

Id= 17 Lev= 0 Type= 1 IsParal=0

Moving left1

Repeat Id= 5

Moving left1

Repeat Id= 2

Moving left1

Repeat Id= 1

Printing Prog Graph - ok

Printing Symbol Table

Id= 1 Name= i

Id= 2 Name= a Dim= 2 DimLen0= 8 DimLen1= 8

Id= 3 Name= j

Id= 4 Name= b Dim= 2 DimLen0= 8 DimLen1= 8

Id= 5 Name= it

Id= 6 Name= eps

Id= 7 Name= w

Printing Symbol Table - ok

Export Data

Export Data - ok

Opers[0] - `+'

Opers[1] - `-'

Opers[2] - `*'

Opers[3] - `/'

Opers[4] - `:='

Opers[5] - `<', `>',…

Opers[6] - ABS()

Opers[7] - MAX()

Redop=5 - MIN

Соответствующий распечатке граф.


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

  • Обзор существующих моделей параллельного программирования, основные средства отладки эффективности MPI-программ, общие проблемы всех средств трассировки. Создание экспериментальной системы отладки эффективности MPI-программ, этапы работы анализатора.

    дипломная работа [767,2 K], добавлен 14.10.2010

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

    курсовая работа [73,7 K], добавлен 15.10.2010

  • Модели параллельного программирования; отладка параллельных программ. Реализация экспериментальной версии системы сравнительной отладки Fortran-OpenMP программ: получение, сбор и запись трассы, инструментарий программ, используемый формат файлов трассы.

    дипломная работа [92,8 K], добавлен 17.10.2013

  • Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.

    курсовая работа [742,6 K], добавлен 03.07.2011

  • Оценка временной сложности алгоритма. Механизм сортировки пузырьком и вставками. Основные положения технологии параллельного программирования Ореn MР. Оценка временной сложности некоторых классов алгоритма с помощью параллельного программирования.

    дипломная работа [1,7 M], добавлен 27.10.2017

  • Элементы структурной схемы. Передаточная функция параллельного–согласованного, параллельного-встречного и последовательного соединений. Преобразование структурных схем. Передаточная функция замкнутой системы. Прямые и обратные связи, узлы разветвления.

    реферат [52,4 K], добавлен 15.08.2009

  • Разработка блока распараллеливания последовательной программы с языка Fortran на язык Fortran-DVM/OpenMP. Реализация блока DVM/OpenMP-эксперт на основе компонента DVM-эксперт. Тестирование системы алгоритмами Якоби, верхней релаксации и методом Гаусса.

    дипломная работа [218,3 K], добавлен 15.10.2010

  • Изучение средств распараллеливания, предоставляемых технологиями OpenMP. Исследование синтаксиса и семантики функций технологии OpenMP на языке программирования Visual C++). Проектирование интерфейса пользователя для взаимодействия с программой.

    контрольная работа [773,9 K], добавлен 12.07.2015

  • Роль распределенных вычислительных систем в решении современных задач. Инструментальная система DVM для разработки параллельных программ. Средства построения формальной модели графического интерфейса. Требования к графическому интерфейсу DVM-системы.

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

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

    лабораторная работа [2,1 M], добавлен 21.07.2012

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