Автор: Пользователь скрыл имя, 15 Сентября 2011 в 17:02, курсовая работа
Данная работа состоит из трех взаимосвязанных тематических разделов.
Первый из них содержит информацию о математическом обеспечении параллельных вычислительных систем, о способах приема, обработки, хранения информации, о функционировании элементов высокопроизводительных систем.
Второй раздел работы посвящен аппаратной части параллельных вычислений. В этой части содержится информация о технологиях параллельных вычислений, классификации процессоров, принципах работы высокопроизводительных систем.
Третий раздел включает в себя информацию, касающуюся практического использования ресурсов и возможностей параллельных вычислительных систем в решении задач из разных областей науки и техники. Также здесь приводятся примеры нескольких вычислительных алгоритмов.
isPrime = (n % primes[j] != 0);
return isPrime;
}
Async Sieve(handlerint[]() getNatPack, channel (int[]) sendPrimesPack)
{
//
Получаем первый пакет из
// извлекаем из него подпакет простых чисел
int[] head = SynchronousSieve((int[])
// Посылаем пакет простых чисел в выходной поток
sendPrimesPack(head );
// Фильтруем оставшиеся пакеты входного потока
// относительно пакета head
if ( head.Length != 0 )
{
New CSieve().Sieve( inter,sendPrimesPack);
filter ( head, getNatPack, cout );
}
}
Handler inter int[]() &channel cout ( int[] p) {
return ( x );
}
// Фильтрацияпотоков
void filter(int[] head, handler int[] () getNatPack, channel (int[]) cfiltered)
{
int[] al = (int[])Array.CreateInstance(ty
int ind = 0;
//
Для каждого пакета из
for( int[] p; (p = (int[])getNatPack() ).Length != 0;)
{
//
Выбираем простые числа,
for(int i = 0; i <p.Length&& p[i]!=0; i++)
{
if(isPrime(p[i],head))
{
al[ind++] = p[i];
// Если пакет заполнен, то посылаем его
// в поток отфильтрованных
if(ind == Config.MAX_LEN)
{
ind = 0;
cfiltered (al);
al = (int[])Array.CreateInstance(ty
}
}
}
}
// Посылаем последний пакет в поток
// отфильтрованных пакетов
if(al[0] != 0) cfiltered (al);
// Посылаем маркер конца потока пакетов
cfiltered(new int [ 0 ] );
}
Class Eratosthenes2 {
public static void Main(String[] args) {
Eratosthenes2 er2 = new Eratosthenes2();
CSievecsieve = new CSieve();
// Запускаемметод Sieve
csieve.Sieve( er2.getNatPack, er2.sendPrimePack);
int[] al = (int[])Array.CreateInstance(ty
//
Создаем поток пакетов
for (inti = 2; i<= Config.N; i++)
{
intind = (i-2)%Config.MAX_LEN;
al[ind] = i;
if(ind == Config.MAX_LEN - 1)
{
er2.Nats ( al );
al = (int[])Array.CreateInstance(ty
}
}
if(al[0] != 0)
er2.Nats(al);
er2.Nats ( newint [ 0 ] );
int[] p;
//
Распечатываем результирующие
while (( p = (int[])er2.getPrimePack()).
Config.print(p);
}
Handler getNatPackint[]() &channel Nats ( int[]p ) {
return( p );
}
Handler getPrimePackint[]() &channel sendPrimePack( int[]p ) {
return( p );
}
}
3.5.4 Обход бинарного дерева
Если
структура данных задачи организована
в виде дерева, то его обработку
легко распараллелить путем обработки
каждого поддерева отдельном as
Предположим, что
мы имеем следующее определение
бинарного дерева в виде класса BinTree.
Тогда просуммировать значения, находящиеся
в узлах такого дерева (и, в общем случае,
произвести более сложную обработку) можно
с помощью следующей программы, структура
которой, по существу, совпадает со структурой
предыдущей программы Fib.
Class BinTree {
Public BinTree left;
Public BinTree right;
Public int value;
public BinTree( int depth ) {
value = 1;
if ( depth <= 1 ) {
left = null;
right = null;
}
else {
left = new BinTree( depth – 1 );
right = new BinTree( depth – 1 );
}
}
}
public class SumBinTree {
public static void Main( String[] args ) {
int depth = System.Convert.ToInt32( args [0] );
SumBinTreesbt = new SumBinTree();
BinTreebtree = newBinTree( depth );
sbt.Sum(btree, sbt.c );
Console.WriteLine( “Sum = “ + sbt.Get() );
}
// Определениеканалаиобработчика
handler Get int() &channel c( int x )
{
return ( x );
}
// Определениеasync-метода
Public async Sum( BinTreebtree, channel (int) c ) {
if ( btree.left == null ) // Деревоестьлист
c ( btree.value );
else {
new SumBinTree().Sum( btree.left, c1 );
new SumBinTree().Sum( btree.right, c2 );
c(Get2() );
}
}
// Определение связки из двух каналов и обработчика
handler Get2 int() &channel с1( int x )
&channel с2(int y )
{
return ( x + y );
}
}
3.6
Пример работающей программы
Заключение
С развитием вычислительной техники стало возможным решить ряд задач, возникающих в процессе жизнедеятельности, облегчить, ускорить, повысить качество результата.
Навыки
параллельного программирования необходимы
любому профессиональному
Задачи
параллельного