15 research outputs found
Solapamiento transparente de tareas de comunicación y computación en dispositivos GPU CUDA
La computación paralela ha adquirido importancia significativa en diversos campos de la ciencia y la
tecnología, presente en el incremento de trabajos de investigación donde se consigue mejorar el rendimiento
del uso de los recursos de los diferentes dispositivos de un sistema. Estos trabajos son, como ejemplo, el
entrenamiento de grandes redes neuronales dedicadas al aprendizaje profundo, las simulaciones de fluidos
que exigen cada vez más precisión, o la creciente tendencia de uso de algoritmos paralelos para el minado
de cripto-monedas.
Actualmente, la programación paralela basa sus soluciones sobre todos los tipos de hardware existentes.
La construcción de granjas de computación –como las presentes en la lista TOP 500–, la fabricación de
unidades de proceso cada vez con mayor número de núcleos, el uso de unidades de computo gráfico –también
conocidas como GPU– para cálculos genéricos (General-Purpose Computing on Graphics Processing Units
ó GP-GPU) o el diseño de nuevos co-procesadores como Xeon Phi, muestran el amplio abanico de máquinas
y dispositivos donde se realizan las ejecuciones de dichos programas.
En particular, la diversidad de dispositivos GPU (compatibles con la computación de propósito general)
hace que se deba implementar soluciones específicas pensando en los dispositivos donde va a ser ejecutadas.
La programación de estos dispositivos necesita de unos conocimientos de alto nivel sobre la arquitectura y
las librerías de desarrollo de cada dispositivo, las cuales se renuevan cada poco tiempo. Esta dificultad
aumenta cuando se pretende explotar, de forma eficiente, los diferentes recursos hardware de un dispositivo.
Este trabajo propone un modelo de programación que permite el solapamiento de operaciones de
comunicación y computación en dispositivos GPU mejorando el rendimiento de las aplicaciones. Nuestro
estudio experimental muestra que este modelo oculta, de forma automática y transparente para el usuario,
el solapamiento de estas operaciones ahorrando esfuerzo de desarrollo al usuario. Con este modelo se
obtiene hasta un 50% de mejora de rendimiento comparado con una implementación puramente secuencial.Grado en Ingeniería Informátic
Holistic Characterization of Parallel Programming Models in a Distributed Memory Environment
The popularity of cluster computing has increased focus on usability, especially in the area of programmability. Languages and libraries that require explicit message passing have been the standard. New languages, designed for cluster computing, are coming to the forefront as a way to simplify parallel programming. Titanium and Fortress are examples of this new class of programming paradigms. This work holistically characterizes these languages and contrasts them with the standard model of parallel programming, and presents benchmark results of small computational kernels written in these languages and models
Evaluating the performance of legacy applications on emerging parallel architectures
The gap between a supercomputer's theoretical maximum (\peak")
oatingpoint
performance and that actually achieved by applications has grown wider
over time. Today, a typical scientific application achieves only 5{20% of any
given machine's peak processing capability, and this gap leaves room for significant
improvements in execution times.
This problem is most pronounced for modern \accelerator" architectures
{ collections of hundreds of simple, low-clocked cores capable of executing the
same instruction on dozens of pieces of data simultaneously. This is a significant
change from the low number of high-clocked cores found in traditional CPUs,
and effective utilisation of accelerators typically requires extensive code and
algorithmic changes. In many cases, the best way in which to map a parallel
workload to these new architectures is unclear.
The principle focus of the work presented in this thesis is the evaluation
of emerging parallel architectures (specifically, modern CPUs, GPUs and Intel
MIC) for two benchmark codes { the LU benchmark from the NAS Parallel
Benchmark Suite and Sandia's miniMD benchmark { which exhibit complex
parallel behaviours that are representative of many scientific applications. Using
combinations of low-level intrinsic functions, OpenMP, CUDA and MPI, we
demonstrate performance improvements of up to 7x for these workloads.
We also detail a code development methodology that permits application developers
to target multiple architecture types without maintaining completely
separate implementations for each platform. Using OpenCL, we develop performance
portable implementations of the LU and miniMD benchmarks that are
faster than the original codes, and at most 2x slower than versions highly-tuned
for particular hardware.
Finally, we demonstrate the importance of evaluating architectures at scale
(as opposed to on single nodes) through performance modelling techniques,
highlighting the problems associated with strong-scaling on emerging accelerator
architectures
Supporting intra-task parallelism in real-time multiprocessor systems
Os sistemas de tempo real modernos geram, cada vez mais, cargas computacionais pesadas e
dinâmicas, começando-se a tornar pouco expectável que sejam implementados em sistemas uniprocessador.
Na verdade, a mudança de sistemas com um único processador para sistemas multi-
processador pode ser vista, tanto no domínio geral, como no de sistemas embebidos, como uma
forma eficiente, em termos energéticos, de melhorar a performance das aplicações.
Simultaneamente, a proliferação das plataformas multi-processador transformaram a programação
paralela num tópico de elevado interesse, levando o paralelismo dinâmico a ganhar
rapidamente popularidade como um modelo de programação. A ideia, por detrás deste modelo,
é encorajar os programadores a exporem todas as oportunidades de paralelismo através da simples
indicação de potenciais regiões paralelas dentro das aplicações. Todas estas anotações são
encaradas pelo sistema unicamente como sugestões, podendo estas serem ignoradas e substituídas, por construtores sequenciais equivalentes, pela própria linguagem. Assim, o modo como
a computação é na realidade subdividida, e mapeada nos vários processadores, é da responsabilidade
do compilador e do sistema computacional subjacente.
Ao retirar este fardo do programador, a complexidade da programação é consideravelmente
reduzida, o que normalmente se traduz num aumento de produtividade. Todavia, se o mecanismo
de escalonamento subjacente não for simples e rápido, de modo a manter o overhead geral
em níveis reduzidos, os benefícios da geração de um paralelismo com uma granularidade tão fina
serão meramente hipotéticos.
Nesta perspetiva de escalonamento, os algoritmos que empregam uma política de workstealing
são cada vez mais populares, com uma eficiência comprovada em termos de tempo,
espaço e necessidades de comunicação. Contudo, estes algoritmos não contemplam restrições
temporais, nem outra qualquer forma de atribuição de prioridades às tarefas, o que impossibilita
que sejam diretamente aplicados a sistemas de tempo real. Além disso, são tradicionalmente implementados
no runtime da linguagem, criando assim um sistema de escalonamento com dois
níveis, onde a previsibilidade, essencial a um sistema de tempo real, não pode ser assegurada.
Nesta tese, é descrita a forma como a abordagem de work-stealing pode ser resenhada para
cumprir os requisitos de tempo real, mantendo, ao mesmo tempo, os seus princípios fundamentais
que tão bons resultados têm demonstrado. Muito resumidamente, a única fila de gestão
de processos convencional (deque) é substituída por uma fila de deques, ordenada de forma
crescente por prioridade das tarefas. De seguida, aplicamos por cima o conhecido algoritmo de
escalonamento dinâmico G-EDF, misturamos as regras de ambos, e assim nasce a nossa proposta: o algoritmo de escalonamento RTWS.
Tirando partido da modularidade oferecida pelo escalonador do Linux, o RTWS é adicionado
como uma nova classe de escalonamento, de forma a avaliar na prática se o algoritmo proposto
é viável, ou seja, se garante a eficiência e escalonabilidade desejadas. Modificar o núcleo do
Linux é uma tarefa complicada, devido à complexidade das suas funções internas e às fortes interdependências
entre os vários subsistemas. Não obstante, um dos objetivos desta tese era ter
a certeza que o RTWS é mais do que um conceito interessante. Assim, uma parte significativa
deste documento é dedicada à discussão sobre a implementação do RTWS e à exposição de situações
problemáticas, muitas delas não consideradas em teoria, como é o caso do desfasamento
entre vários mecanismo de sincronização.
Os resultados experimentais mostram que o RTWS, em comparação com outro trabalho prático de escalonamento dinâmico de tarefas com restrições temporais, reduz significativamente
o overhead de escalonamento através de um controlo de migrações, e mudanças de contexto,
eficiente e escalável (pelo menos até 8 CPUs), ao mesmo tempo que alcança um bom balanceamento
dinâmico da carga do sistema, até mesmo de uma forma não custosa. Contudo, durante
a avaliação realizada foi detetada uma falha na implementação do RTWS, pela forma como facilmente
desiste de roubar trabalho, o que origina períodos de inatividade, no CPU em questão,
quando a utilização geral do sistema é baixa.
Embora o trabalho realizado se tenha focado em manter o custo de escalonamento baixo e
em alcançar boa localidade dos dados, a escalonabilidade do sistema nunca foi negligenciada.
Na verdade, o algoritmo de escalonamento proposto provou ser bastante robusto, não falhando
qualquer meta temporal nas experiências realizadas. Portanto, podemos afirmar que alguma
inversão de prioridades, causada pela sub-política de roubo BAS, não compromete os objetivos
de escalonabilidade, e até ajuda a reduzir a contenção nas estruturas de dados. Mesmo assim, o
RTWS também suporta uma sub-política de roubo determinística: PAS. A avaliação experimental,
porém, não ajudou a ter uma noção clara do impacto de uma e de outra. No entanto, de uma
maneira geral, podemos concluir que o RTWS é uma solução promissora para um escalonamento
eficiente de tarefas paralelas com restrições temporais.Multiple programming models are emerging to address the increased need for dynamic task-level
parallelism in applications for multi-core processors and shared-memory parallel computing, presenting promising solutions from a user-level perspective. Nonetheless, while high-level parallel
languages offer a simple way for application programmers to specify parallelism in a form that
easily scales with problem size, they still leave the actual scheduling of tasks to be performed at
runtime. Therefore, if the underlying system cannot efficiently map those tasks on the available
cores, the benefits will be lost.
This is particularly important in modern real-time systems as their average workload is rapidly
growing more parallel, complex and computing-intensive, whilst preserving stringent timing constraints.
However, as the real-time scheduling theory has mostly been focused on sequential task
models, a shift to parallel task models introduces a completely new dimension to the scheduling
problem.
Within this context, the work presented in this thesis considers how to dynamically schedule
highly heterogeneous parallel applications that require real-time performance guarantees on
multi-core processors. A novel scheduling approach called RTWS is proposed. RTWS combines
the G-EDF scheduler with a priority-aware work-stealing load balancing scheme, enabling parallel
real-time tasks to be executed on more than one processor at a given time instant. Two stealing
sub-policies have arisen from this proposal and their suitability is discussed in detail.
Furthermore, this thesis describes the implementation of a new scheduling class in the Linux
kernel concerning RTWS, and extensively evaluate its feasibility. Experimental results demonstrate
the greater scalability and lower scheduling overhead of the proposed approach, comparatively to an existing real-time deadline-driven scheduling policy for the Linux kernel, as well as
reveal its better performance when considering tasks with intra-task parallelism than without,
even for short-living applications.
We show that busy-aware stealing is robust to small deviations from a strict priority schedule
and conclude that some priority inversion may be actually acceptable, provided it helps reduce
contention, communication, synchronisation and coordination between parallel threads
Parallel Markov Chain Monte Carlo
The increasing availability of multi-core and multi-processor architectures provides
new opportunities for improving the performance of many computer simulations.
Markov Chain Monte Carlo (MCMC) simulations are widely used for approximate
counting problems, Bayesian inference and as a means for estimating very highdimensional
integrals. As such MCMC has found a wide variety of applications in
fields including computational biology and physics,financial econometrics, machine
learning and image processing.
This thesis presents a number of new method for reducing the runtime of
Markov Chain Monte Carlo simulations by using SMP machines and/or clusters.
Two of the methods speculatively perform iterations in parallel, reducing the runtime
of MCMC programs whilst producing statistically identical results to conventional
sequential implementations. The other methods apply only to problem domains
that can be presented as an image, and involve using various means of dividing
the image into subimages that can be proceed with some degree of independence.
Where possible the thesis includes a theoretical analysis of the reduction in
runtime that may be achieved using our technique under perfect conditions, and
in all cases the methods are tested and compared on selection of multi-core and
multi-processor architectures. A framework is provided to allow easy construction
of MCMC application that implement these parallelisation methods
Locality Awareness for Task Parallel Computation
The task parallel programming model allows programmers to express concurrency at a high level of abstraction and places the burden of scheduling parallel execution on the run time system. Efficient scheduling of tasks on multi-socket multicore shared memory systems requires careful consideration of an increasingly complex memory hierarchy, including shared caches and non-uniform memory access (NUMA) characteristics. In this dissertation, we study the performance impact of these issues and other performance factors that limit parallel speedup in task parallel program executions and propose new scheduling strategies to improve performance. Our performance model characterizes lost efficiency in terms of overhead time, idle time, and work time inflation due to increased data access costs. We introduce a hierarchical run time scheduler that combines the benefits of work stealing and parallel depth-first schedulers. Matching the scheduler design to the memory hierarchy of multicore NUMA systems limits costly remote data accesses while maintaining load balance and exploiting constructive data sharing among threads that share a cache. We also propose a locality- based scheduling framework based on locality domains and comprising an API for programmers to specify application locality and a scheduler that honors those specifications. Implementations of the hierarchical and locality-based schedulers in our OpenMP run time system exhibit performance improvements on several task parallel benchmark applications over existing scheduling strategies and production OpenMP run time systems.Doctor of Philosoph
Development of An Empirical Approach to Building Domain-Specific Knowledge Applied to High-End Computing
This dissertation presents an empirical approach for building and storing knowledge about software engineering through human-subject research. It is based on running empirical studies in stages, where previously held hypotheses are supported or refuted in different contexts, and new hypotheses are generated. The approach is both mixed-methods based and opportunistic, and focuses on identifying a diverse set of potential sources for running studies. The output produced is an experience base which contains a set of these hypotheses, the empirical evidence which generated them, and the implications for practitioners and researchers. This experience base is contained in a software system which can be navigated by stakeholders to trace the "chain of evidence" of hypotheses as they evolve over time and across studies.
This approach has been applied to the domain of high-end computing, to build knowledge related to programmer productivity. The methods include controlled experiments and quasi-experiments, case studies, observational studies, interviews, surveys, and focus groups. The results of these studies have been stored in a proof-of-concept system that implements the experience base
A language and a system for program optimization
Hardware complexity has increased over time, and as architectures evolve and new ones are adopted, programs must often be altered by numerous optimizations to attain maximum computing power on each target environment. As a result, the code becomes unrecognizable over time, hard to maintain, and challenging to modify. Furthermore, as the code evolves, it is hard to keep the optimizations up to date. The need to develop and maintain separate versions of the application for each target platform is an immense undertaking, especially for the large and long-lived applications commonly found in the high-performance computing (HPC) community.
This dissertation presents Locus, a new system, and a language for optimizing complex, long-lived applications for different platforms. We describe the requirements that we believe are necessary for making automatic performance tuning widely adopted. We present the design and implementation of a system that fulfills these requirements. It includes a domain-specific language that can represent complex collections of transformations, an interface to integrate external modules, and a database to manage platform-specific efficient code. The database allows the system’s users to access optimized code without having to install the code generation toolset. The Locus language allows the definition of a search space combined with the programming of optimization sequences separated from the application’s reference code. After all, we present an approach for performance portability.
Our thesis is that we can ameliorate the difficulty of optimizing applications using a methodology based on optimization programming and automated empirical search. Our system automatically selects, generates, and executes candidate implementations to find the one with the best performance.
We present examples to illustrate the power and simplicity of the language. The experimental evaluation shows that exploring the space of candidate implementations typically leads to better performing codes than those produced by conventional compiler optimizations that are based solely on heuristics. Locus was able to generate a matrix-matrix multiplication code that outperformed the IBM XLC internal hand-optimized version by 2× on the Power 9 processors. On Intel E5, Locus generates code with performance comparable to Intel MKL’s. We also improve performance relative to the reference implementation of up to 4× on stencil computations.
Locus ability to integrate complex search spaces with optimization sequences can result in very complicated optimization programs. Locus compiler applies optimizations to remove from the optimization sequences unnecessary search statements making the exploration for faster implementations more accessible.
We optimize matrix transpose, matrix-matrix multiplication, fast Fourier transform, symmetric eigenproblem, and sparse matrix-vector multiplication through divide and conquer. We implement three strategies using the Locus language to create search spaces to find the best shapes of the base case and the best ways of subdividing the problem. The search space representation for the divide-and-conquer strategy uses a combination of recursion and OR blocks. The Locus compiler automatically expands the recursion and ensures that the search space is correctly represented. The results showed that the empirical search was important to improve performance by generating faster base cases and finding the best splitting.
We also use Locus to optimize large, complex applications. We match the performance of hand-optimized kernels of the Kripke transport code for different input data layouts. The Plascom2 multi-physics application is optimized to find the best way to use a multi-core CPU and GPU. The use of Tangram, Hydra, and OpenMP provided an interesting search space that improved performance by approximately 4.3× on ZAXPY and ZXDOTY kernels. Lastly, in a similar fashion to how a compiler works, we applied a search space representing a collection of optimization sequences to 856 loops extracted from 16 benchmarks that resulted in good performance improvements
Multicore Scheduling of Real-Time Irregular Parallel Algorithms in Linux
Face à estagnação da tecnologia uniprocessador registada na passada década, aos principais fabricantes
de microprocessadores encontraram na tecnologia multi-core a resposta `as crescentes
necessidades de processamento do mercado. Durante anos, os desenvolvedores de software viram
as suas aplicações acompanhar os ganhos de performance conferidos por cada nova geração
de processadores sequenciais, mas `a medida que a capacidade de processamento escala em função
do número de processadores, a computação sequencial tem de ser decomposta em várias partes
concorrentes que possam executar em paralelo, para que possam utilizar as unidades de processamento
adicionais e completar mais rapidamente.
A programação paralela implica um paradigma completamente distinto da programação sequencial.
Ao contrário dos computadores sequenciais tipificados no modelo de Von Neumann, a
heterogeneidade de arquiteturas paralelas requer modelos de programação paralela que abstraiam
os programadores dos detalhes da arquitectura e simplifiquem o desenvolvimento de aplicações
concorrentes. Os modelos de programação paralela mais populares incitam os programadores a
identificar instruções concorrentes na sua lógica de programação, e a especificá-las sob a forma
de tarefas que possam ser atribuídas a processadores distintos para executarem em simultâneo.
Estas tarefas são tipicamente lançadas durante a execução, e atribuídas aos processadores pelo
motor de execução subjacente. Como os requisitos de processamento costumam ser variáveis, e
não são conhecidos a priori, o mapeamento de tarefas para processadores tem de ser determinado
dinamicamente, em resposta a alterações imprevisíveis dos requisitos de execução.
`A
medida que o volume da computação cresce, torna-se cada vez menos viável garantir as
suas restrições temporais em plataformas uniprocessador. Enquanto os sistemas de tempo real se
começam a adaptar ao paradigma de computação paralela, há uma crescente aposta em integrar
execuções de tempo real com aplicações interativas no mesmo hardware, num mundo em que
a tecnologia se torna cada vez mais pequena, leve, ubíqua, e portável. Esta integração requer
soluções de escalonamento que simultaneamente garantam os requisitos temporais das tarefas de
tempo real e mantenham um nível aceitável de QoS para as restantes execuções. Para tal, torna-se
imperativo que as aplicações de tempo real paralelizem, de forma a minimizar os seus tempos
de resposta e maximizar a utilização dos recursos de processamento. Isto introduz uma nova
dimensão ao problema do escalonamento, que tem de responder de forma correcta a novos requisitos
de execução imprevisíveis e rapidamente conjeturar o mapeamento de tarefas que melhor
beneficie os critérios de performance do sistema.
A técnica de escalonamento baseado em servidores permite reservar uma fração da capacidade de processamento para a execução de tarefas de tempo real, e assegurar que os efeitos de latência
na sua execução não afectam as reservas estipuladas para outras execuções. No caso de tarefas
escalonadas pelo tempo de execução máximo, ou tarefas com tempos de execução variáveis,
torna-se provável que a largura de banda estipulada não seja consumida por completo. Para
melhorar a utilização do sistema, os algoritmos de partilha de largura de banda (capacity-sharing)
doam a capacidade não utilizada para a execução de outras tarefas, mantendo as garantias de
isolamento entre servidores.
Com eficiência comprovada em termos de espaço, tempo, e comunicação, o mecanismo de
work-stealing tem vindo a ganhar popularidade como metodologia para o escalonamento de tarefas
com paralelismo dinâmico e irregular. O algoritmo p-CSWS combina escalonamento baseado
em servidores com capacity-sharing e work-stealing para cobrir as necessidades de escalonamento
dos sistemas abertos de tempo real. Enquanto o escalonamento em servidores permite
partilhar os recursos de processamento sem interferências a nível dos atrasos, uma nova política
de work-stealing que opera sobre o mecanismo de capacity-sharing aplica uma exploração de
paralelismo que melhora os tempos de resposta das aplicações e melhora a utilização do sistema.
Esta tese propõe uma implementação do algoritmo p-CSWS para o Linux. Em concordância
com a estrutura modular do escalonador do Linux, ´e definida uma nova classe de escalonamento
que visa avaliar a aplicabilidade da heurística p-CSWS em circunstâncias reais. Ultrapassados
os obstáculos intrínsecos `a programação da kernel do Linux, os extensos testes experimentais
provam que o p-CSWS ´e mais do que um conceito teórico atrativo, e que a exploração heurística
de paralelismo proposta pelo algoritmo beneficia os tempos de resposta das aplicações de tempo
real, bem como a performance e eficiência da plataforma multiprocessador.With sequential machines approaching their physical bounds, parallel computers are rapidly becoming
pervasive in most areas of modern technology.
To realize the full potential of parallel platforms, applications must split onto concurrent parts
that can be assigned to different processors and execute in parallel. Parallel programming models
abstract the myriad of parallel computer specifications to simplify the development of concurrent
applications, allowing programmers to decompose their code onto concurrent tasks, and leaving
it to the runtime system to schedule these tasks for parallel execution. The resulting parallelism
is often input-dependent and irregular, requiring that the mapping of tasks to processors be performed
at runtime in response to dynamic changes of the workload.
Motivated by the promises of performance scalability and cost effectiveness, real-time researchers
are now beginning to exploit the benefits of parallel processing, with ground-breaking
scheduling heuristics to improve the efficiency of time-sensitive concurrent applications. Realtime
developments are switching to open scenarios, where real-time tasks of variable and unpredictable
size share the available processing resources with other applications, making it essential
to utilize as much of the available processing capacity as possible.
The p-CSWS algorithm employs bandwidth isolation, capacity-sharing and work-stealing to
exploit the intra-task parallelism of hard and soft real-time executions on parallel platforms. This
thesis proposes an implementation of the p-CSWS scheduler for the Linux kernel, to evaluate its
applicability to real scenarios and bring Linux one step closer to becoming a viable open real-time
platform.
To the best of our knowledge we are the first to employ scheduling heuristics to exploit dynamic
parallelism of real-time tasks on the Linux kernel.
Through extensive tests, we show that...