  Definition of an algorithm; Algorithm design and techniques, such as sequential versus divideandconquer; Algorithm analysis; Concept of basic operations; Concept of worst, best, and average case analysis; Complexity analysis: big O, Omega and Theta notations; Recurrence equations and recursive algorithms; Searching and sorting algorithms; Concept of graphs; Graph algorithms.  Undergraduate Level  Third Year    Introduction, Hardware and Software Concepts, Processes and Threads, Synchronous Concurrent Execution, Deadlock and Indefinite Postponement, Processor Scheduling, Physical and Virtual Memory, Disk Performance Optimization, Performance and Processor Design, Multiprocessor Management, Distributed Systems.  Undergraduate Level  Fourth Year    Study of parallel processing hardware, memory, buses, multistage networks. Pipeline, array and associate processor, bus based systems, crossbar systems, grids, systolic arrays, trees, and dataflow architecture. Processors for parallel architectures, memory structures, cache memory, bus structures. Arbitration and synchronization. Dynamically reconfigurable architecture.  Graduate Level  Master    The course is centered in three concepts: Architectures, Algorithms and Programming. Parallel and Distributed Architectures: Parallel and Distributed computer taxonomy, example of Parallel and Distributed computers, fundamental communication operations, and performance metrics. Parallel algorithms: design and analysis of parallel algorithms with emphasis on sorting, matrix problems, and graph problems. Parallel programming: types of parallelism, parallel programming paradigms, message passing programming, data and parallel programming.  Graduate Level  Master    Main concepts of computer architecture; Hardware components of a computer; Instruction set: instruction formats, encoding of instructions, types; Execution unit: registers design, combinational shifters, ALU, division and multiplication algorithms; Control unit: register transfer language, hardwired and microprogrammed control unit; Memory unit: RAM, cache memory, associative memory, virtual memory; Input/output processors; Introduction to Assembly Language; Introduction to multiprocessor systems and parallel processing.  Undergraduate Level  Third Year    Introduction to highperformance computing, processor architectures, memory systems, data and parallel decompositions, parallel languages and architectures, multiprocessors, multicomputers; routing topologies; shared memory and passage passing parallel processing, PRAM model (exclusive versus concurrent reads and writes) and sample applications.  Undergraduate Level  Fourth Year    Students will study advanced operating system topics and be exposed to recent developments in operating systems research. In addition to being conversant in classic and recent research papers, this course aims to teach students to read research papers critically, formulate new research questions, and evaluate these questions experimentally. A study of specific topics of modern distributed and realtime systems, the theory behind them, and their implementation. Topics may include advanced concepts in distributed systems, wireless sensor networks, resource management in multi core and in distributed systems, and memory management, protection and security.  Graduate Level  PhD    This is an advanced graduate level course on algorithms, with the emphasis on computational problems that are central to both theory and practice, and on developing techniques for the design and the rigorous analysis of algorithms and data structures for such problems. It discusses topics such as network flows (max flow and mincost flow/circulation), data structures (Fibonacci heaps, splay trees, dynamic trees), linear programming (structural results, algorithms), dealing with intractability, approximation algorithms, dealing with large data sets and computational geometry.  Graduate Level  PhD    This course provides strategies of algorithms synthesis and analysis. Design methodologies of classical algorithm categories such as: divideandconquer, greedy method, dynamic programming, search and traversal, backtracking, and branchandbound. Computational complexity and important theoretical results from lowerand upperbound studies, NPhard, and NPcomplete problems will be addressed.  Graduate Level  Master    This course examines the advances of sequential computers for gaining speed and application of these techniques to highspeed supercomputers of today. Programming methodologies of distributed and shared memory multiprocessors, vector processors and systolic arrays are compared. Performance analysis methods for architectures and programs are described. Research papers of high impact published recently in the literature will be provided as reading assignments.  Graduate Level  PhD    This course presents the fundamental concepts of programming using C++. It covers the basic structures of the programming tools such as variable names; data types; control structures; arrays; and functions.  Undergraduate Level  First Year 
