This course is intended to Ph.D. level students whose main theme of research is related to parallel and distributed systems in a broad context. As such, the course is structured in 3 main parts. The first part is dedicated to basic concepts of parallel and distributed computing focusing on parallel programming models, parallel architectures, including modern multi-cores and multi-processors, performance metrics, performance analysis, parallel benchmarks, and state-of-the-art in parallel and distributed computing. The second part shifts to what is currently considered the main stream in distributed computing worldwide: cluster computing. In this part of the course, the student will have the opportunity to understand what is a cluster, how to develop applications for a cluster, how to configure a cluster, which is not merely to join off-the-shelf computers in a room or shelf or buying an expensive ready solution, and limitations imposed by applications that demand more resources than those available in a local network. In the third part of the course, we will concentrate on today's hot topics, which are grid computing and data grid, where the student will have the opportunity to understand what is a grid, its functioning, and will be able to appreciate current developments in grid computing and data grid, as well as to identify limitations of the algorithms and techniques used to implement grid-aware systems.