Задание 1. Многопоточное умножение матриц

advertisement
Задание 1. Многопоточное умножение матриц. (Многопоточность. Класс Parrallel).
Модифицируйте домашнее задание после первой лекции (умножение матриц) или пример
из лекции 1 для многопоточного выполнения перемножения матриц. Сравните время
выполнения умножения матриц в 1 поток и несколько. Для оптимального исполнения
умножения рекомендуется использовать класс Parallel. (Parrallel.For()). Постарайтесь
оптимально подобрать блок кода выполняемый в одном потоке (не слишком маленький,
чтобы уменьшить накладные расходы).
Задание 2. Копирование файлов. (Многопоточность. Синхронизация потоков). Реализуйте
копирование файла большого размера блоками в 2 потока (один поток читает, другой
параллельно пишет). Чтение файла и запись необходимо проводить блоками. Размер блока
можно задавать константой. Прочитанные и незаписанные в новый файл блоки можно
хранить, например, в очереди. Ограничьте размер очереди, например, 10 прочитанными, но
не записанными блоками (считаем, что память не безгранична). Организуйте безопасное
взаимодействие потоков с очередью. Копируемый файл и место копирования желательно
задавать в командной строке. Сравните время копирования большого файла в 1 поток и в 2.
Примечание.

Файл и место копирования должны располагаться на разных Физических дисках (иначе
выигрыша от параллельного копирования может вообще не быть, может даже быть
медленнее). Если на вашем компьютере всего 1 физический диск, копируйте файл с него
на флешку или наоборот
8860
Эффективность языка C#.
Напишите на языке C# программу, которая умножает две матрицы, заданные в виде
прямоугольных двумерных массивов (практически написана в примере) и при помощи вложенных
массивов, и засекает время, необходимое для выполнения умножения матриц на данной машине.
Размер матрицы задается как параметр командной строки, программа должна распечатать время
(в секундах), требуемое для умножения матриц, а также производительность процедуры
умножения матриц на вашем компьютере (в ГФлопс, т.е. миллиардах вещественных операций в
секунду). Инициализация матрицы должна проводится случайным образом (время
инициализации во время решения не включать).
Примечания:
1. Для преобразования строки в целое число можно использовать статический метод
int int.Parse(string s)
Например:
string Chislo = "3000";
int i = int.Parse(Chislo);
2. Для генерации случайных чисел можно использовать класс Random в пространстве имен System
и его метод
double Random.NextDouble(),
который возвращает случайное вещественное число в диапазоне от 0 до 1.
Пример
Random rnd = new Random();
double d = rnd.NextDouble();
3. Для замера времени можно использовать свойство TickCount класса Environment – оно
возвращает количество миллисекунд, прошедших с момента запуска системы до настоящего
времени. Обложив этими вызовами ваш код умножения матриц, а затем вычитая одно значение
из другого, можно получить общее время выполнения кода.
Например:
int start = Environment.TickCount;
/* вычисления */
int time = Environment.TickCount - start;
Поскольку разрешающая способность этого таймера низка, размер матрицы должен быть
большим (скажем, 1000 х 1000), чтобы погрешность была маленькой. Количество операций при
умножении матриц N x N считается примерно как 2 * N * N * N, для получения ГФлопс нужно
разделить количество операций на время (в секундах).
8861
Задание 1. Комплексные числа (структуры, перегрузка операций, приведения типов, методы
object)
Разработайте структуру Complex, которая хранит в себе комплексное число (в виде вещественной
и мнимой части). Эта структура должна поддерживать следующие операции:






Арифметические операции (реализованы через перегрузку операций)
Получение вещественной и мнимой части, а также модуля и аргумента (реализованы
через свойства)
Конструктор комплексного числа из одного и двух вещественных, а также функцию,
создающую комплексное число по модулю и аргументу
Операции сравнения (равенство-неравенство), при этом соответствующим образом
должны быть перегружены методы Equals() и GetHashCode(). Посмотрите примеры на
MSDN или в хелпе.
Преобразование в красивую (т.е. 1-2i, например, а не 1 + -2i, или 1, а не 1+0i, или 2i, а не
0+2i, или 1+i, а не 1+1i) строку при помощи перегрузки метода ToString().
Преобразование в вещественное число (явное) и из вещественного в комплексное
(неявное) при помощи перегрузки преобразований
Задача 2. Трехмерные геометрические фигуры (классы, наследование, абстрактные и
виртуальные методы, свойства)
Реализовать базовый класс Body3D, который поддерживает основные операции с трехмерными
фигурами (площадь поверхности, объем, сумма длин ребер и т.д.). Реализовать производные
классы для конкретных фигур. Должны быть реализованы как минимум следующие фигуры:
 Параллелепипед прямоугольный
 Шар
 Тэтраэдр (не обязательно правильный)
Задача 3. Различные типы матриц (классы, наследование, абстрактные и виртуальные
методы, перегрузка операций)
Разработать базовый абстрактный класс для работы с матрицами. Он не должен содержать
никаких данных – только объявления методов и стандартные операции для работы с матрицами.
Реализовать конкретные классы для конкретных типов матриц:
 Полная матрица (хранится в виде двумерного массива)
 Диагональная матрица (хранятся только диагональные элементы, остальные все нули)
 Трехдиагональная матрица (хранятся только главная диагональ и 2 диагонали вокруг нее;
остальные элементы – нули).
Реализовать арифметические операции для работы с матрицами (сложение, умножение). При
этом конкретная вызываемая операция определяется в зависимости от типа времени выполнения
обоих аргументов. Например, если складываются 2 диагональные матрицы, то должна получаться
диагональная матрица, при этом нулевые элементы, складываться не должны. Если же
складывается диагональная матрица с обычной, то должна получаться обычная матрица.
Примечание. Это можно реализовать, например, следующим образом. Пусть требуется
переопределить операцию Matrix operator*(Matrix a, Matrix b), чтобы она работала указанным
образом. Тогда определяются следующие операции:
 Операция умножения по умолчанию Matrix defmul(Matrix a, Matrix b), которая просто
строит новую полную матрицу и вычисляет каждый ее элемент по обычному алгоритму.
 Специальные операции умножения. Например, DiagMatrix diagmul(DiagMatrix a, DiagMatrix
b) принимает только диагональные матрицы, и в результате возвращает диагональную
матрицу, учитывая только диагональные элементы при перемножении.
 В операторе operator* организовать выбор нужной операции по типам (a.GetType() и
b.GetType(), соответственно), и в зависимости от пары типов, выбирать специальную
реализацию. Если специальной реализации нет – выбирать обычную.
Download