<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://aeminium.dei.uc.pt/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aeminium</id>
		<title>Aeminium - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://aeminium.dei.uc.pt/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aeminium"/>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php/Special:Contributions/Aeminium"/>
		<updated>2026-08-06T22:52:16Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1718</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1718"/>
				<updated>2013-04-19T21:58:13Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium at the Carnegie Mellon University ==&lt;br /&gt;
Contact Jonathan Aldrich at CMU for more information. http://www.cs.cmu.edu/~aldrich/&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1717</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1717"/>
				<updated>2013-04-19T21:55:39Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Other project members */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The project is a consortium of four principal investigators and one industrial partner. &lt;br /&gt;
&lt;br /&gt;
'''Paulo Marques''' is an Assistant Professor at the '''University of Coimbra'''. His main research interests are concurrent systems, software reliability, and modern programming languages. He has recently led the RAIL and RAIL2 projects on code instrumentation for virtual machines, sponsored by Microsoft Research, and the LeonVM and QERL projects on dynamic code translation for the LEON2 processor, under contract with the European Space Agency. He has published extensively at international research conferences and journals and has authored two books on software development in C#. &lt;br /&gt;
&lt;br /&gt;
'''Nestor Catano''' is an Assistant Professor in the Department of Mathematics and Engineering at The '''University of Madeira''', Portugal. He earned a M.Sc. and Ph.D. in Computer Science from the University of Paris 7, France. His Ph.D. was funded by the European&lt;br /&gt;
project Verificard (Verification of Java Card programs). He was a research associate at the University of York, U.K, from 2004 to 2006. Nestor's main research interests are the development of JML‐based tools and techniques for the verification of programs, and the mechanization of machine‐checked correctness proofs of mathematical algorithms. He has published in international research conferences on formal methods. &lt;br /&gt;
&lt;br /&gt;
'''Jonathan Aldrich''' is an Assistant Professor of Computer Science at '''Carnegie Mellon University''' and Director of the Software Engineering Minor Program in the School of Computer Science. Aldrich’s research contributions include techniques for verifying object and component interaction protocols, modular reasoning techniques for aspects and stateful programs, and new object‐oriented language models. For his work on verifying software architecture, Aldrich received a 2006 NSF CAREER award and the 2007 Dahl‐Nygaard Junior Prize, the top international award for junior faculty making significant contributions to object‐oriented programming. &lt;br /&gt;
&lt;br /&gt;
'''Bruno Cabral''' received his PhD in Informatics Engineering in 2009 from the University of Coimbra. He is an Assistant Professor at the '''University of Coimbra''', Portugal, and an Adjunct Associate Teaching Professor at the '''Carnegie Mellon University''', USA. His main research interests are concurrent programming and programming languages, exception handling models and code instrumentation. He has participated in many research and industrial projects in cooperation with institutions such as the European Space Agency, Microsoft Research and the Portuguese Government. He is currently leading the Institute for Software Engineering at the University of Coimbra.&lt;br /&gt;
&lt;br /&gt;
Our industrial partner '''Novabase''' is one of the largest software companies in Portugal, generating&lt;br /&gt;
more than 140M€/year in software solutions and consulting. Novabase’s ACD (Advanced Custom Development) business unit brings a wealth of experience in developing advanced custom software solutions for its customers. Effectively leveraging the emerging class of highly parallel and multicore systems has been a significant challenge for Novabase, and the company will be an active project participant through providing motivating examples and testbeds for ensuring that Aeminium solves critical real‐world problems.&lt;br /&gt;
&lt;br /&gt;
== Other project members ==&lt;br /&gt;
&lt;br /&gt;
'''Sven Stork''' - Ph.D. student on the join doctoral program between CMU and the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Filipe Militão''' - Ph.D. student on the join doctoral program between CMU and Nova University of Lisbon&lt;br /&gt;
&lt;br /&gt;
'''Alcides Fonseca''' - Ph.D. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Ijaz Ahmed''' - Ph.D. student at the University of Madeira.&lt;br /&gt;
&lt;br /&gt;
'''Josh Sunshine''' - PhD student at Carnegie Mellon University&lt;br /&gt;
 &lt;br /&gt;
'''Karl Naden''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Ligia Nistor''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Roger Wolf''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''João Rafael''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Cristiano Gonçalves''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Pedro Costa''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Marcelo Sousa''' - Researcher at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Sukriti Bhattacharya''' - Post-doc at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Rob Bocchino''' - Post-doc at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Hannes Mehnert''' -  Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
'''Iain McGinniss''' - Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
== Past project members ==&lt;br /&gt;
&lt;br /&gt;
'''Ivo Correia''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Manuel Mohr''' - M.Sc. student at the Karlsruhe university&lt;br /&gt;
&lt;br /&gt;
'''João Barbosa''' - B.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Duarte Abreu''' - M.Sc. student at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Alican Turk''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Mark Hahnenberg''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Matthew Rodriguez''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
== External Collaborators ==&lt;br /&gt;
&lt;br /&gt;
'''Radu Siminiceanu''' - National Institute of Aerospace, NIA, USA&lt;br /&gt;
&lt;br /&gt;
'''Camilo Rueda, Carlos Olarte, Gerardo Sarria''' - Pontificia Universidad Javeriana, PUJ, Cali, Colombia&lt;br /&gt;
&lt;br /&gt;
'''Elaine Pimentel''' - Universidade Federal de Minas Gerais, UFMG, Brazil&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1716</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1716"/>
				<updated>2013-04-19T21:54:59Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Past project members */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The project is a consortium of four principal investigators and one industrial partner. &lt;br /&gt;
&lt;br /&gt;
'''Paulo Marques''' is an Assistant Professor at the '''University of Coimbra'''. His main research interests are concurrent systems, software reliability, and modern programming languages. He has recently led the RAIL and RAIL2 projects on code instrumentation for virtual machines, sponsored by Microsoft Research, and the LeonVM and QERL projects on dynamic code translation for the LEON2 processor, under contract with the European Space Agency. He has published extensively at international research conferences and journals and has authored two books on software development in C#. &lt;br /&gt;
&lt;br /&gt;
'''Nestor Catano''' is an Assistant Professor in the Department of Mathematics and Engineering at The '''University of Madeira''', Portugal. He earned a M.Sc. and Ph.D. in Computer Science from the University of Paris 7, France. His Ph.D. was funded by the European&lt;br /&gt;
project Verificard (Verification of Java Card programs). He was a research associate at the University of York, U.K, from 2004 to 2006. Nestor's main research interests are the development of JML‐based tools and techniques for the verification of programs, and the mechanization of machine‐checked correctness proofs of mathematical algorithms. He has published in international research conferences on formal methods. &lt;br /&gt;
&lt;br /&gt;
'''Jonathan Aldrich''' is an Assistant Professor of Computer Science at '''Carnegie Mellon University''' and Director of the Software Engineering Minor Program in the School of Computer Science. Aldrich’s research contributions include techniques for verifying object and component interaction protocols, modular reasoning techniques for aspects and stateful programs, and new object‐oriented language models. For his work on verifying software architecture, Aldrich received a 2006 NSF CAREER award and the 2007 Dahl‐Nygaard Junior Prize, the top international award for junior faculty making significant contributions to object‐oriented programming. &lt;br /&gt;
&lt;br /&gt;
'''Bruno Cabral''' received his PhD in Informatics Engineering in 2009 from the University of Coimbra. He is an Assistant Professor at the '''University of Coimbra''', Portugal, and an Adjunct Associate Teaching Professor at the '''Carnegie Mellon University''', USA. His main research interests are concurrent programming and programming languages, exception handling models and code instrumentation. He has participated in many research and industrial projects in cooperation with institutions such as the European Space Agency, Microsoft Research and the Portuguese Government. He is currently leading the Institute for Software Engineering at the University of Coimbra.&lt;br /&gt;
&lt;br /&gt;
Our industrial partner '''Novabase''' is one of the largest software companies in Portugal, generating&lt;br /&gt;
more than 140M€/year in software solutions and consulting. Novabase’s ACD (Advanced Custom Development) business unit brings a wealth of experience in developing advanced custom software solutions for its customers. Effectively leveraging the emerging class of highly parallel and multicore systems has been a significant challenge for Novabase, and the company will be an active project participant through providing motivating examples and testbeds for ensuring that Aeminium solves critical real‐world problems.&lt;br /&gt;
&lt;br /&gt;
== Other project members ==&lt;br /&gt;
&lt;br /&gt;
'''Sven Stork''' - Ph.D. student on the join doctoral program between CMU and the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Filipe Militão''' - Ph.D. student on the join doctoral program between CMU and Nova University of Lisbon&lt;br /&gt;
&lt;br /&gt;
'''Alcides Fonseca''' - Ph.D. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Ijaz Ahmed''' - Ph.D. student at the University of Madeira.&lt;br /&gt;
&lt;br /&gt;
'''Josh Sunshine''' - PhD student at Carnegie Mellon University&lt;br /&gt;
 &lt;br /&gt;
'''Karl Naden''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Ligia Nistor''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Roger Wolf''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''João Rafael''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Cristiano Gonçalves''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Sukriti Bhattacharya''' - Post-doc at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Rob Bocchino''' - Post-doc at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Hannes Mehnert''' -  Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
'''Iain McGinniss''' - Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
== Past project members ==&lt;br /&gt;
&lt;br /&gt;
'''Ivo Correia''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Manuel Mohr''' - M.Sc. student at the Karlsruhe university&lt;br /&gt;
&lt;br /&gt;
'''João Barbosa''' - B.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Duarte Abreu''' - M.Sc. student at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Alican Turk''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Mark Hahnenberg''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Matthew Rodriguez''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
== External Collaborators ==&lt;br /&gt;
&lt;br /&gt;
'''Radu Siminiceanu''' - National Institute of Aerospace, NIA, USA&lt;br /&gt;
&lt;br /&gt;
'''Camilo Rueda, Carlos Olarte, Gerardo Sarria''' - Pontificia Universidad Javeriana, PUJ, Cali, Colombia&lt;br /&gt;
&lt;br /&gt;
'''Elaine Pimentel''' - Universidade Federal de Minas Gerais, UFMG, Brazil&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1715</id>
		<title>Members</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Members&amp;diff=1715"/>
				<updated>2013-04-19T21:54:48Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Other project members */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The project is a consortium of four principal investigators and one industrial partner. &lt;br /&gt;
&lt;br /&gt;
'''Paulo Marques''' is an Assistant Professor at the '''University of Coimbra'''. His main research interests are concurrent systems, software reliability, and modern programming languages. He has recently led the RAIL and RAIL2 projects on code instrumentation for virtual machines, sponsored by Microsoft Research, and the LeonVM and QERL projects on dynamic code translation for the LEON2 processor, under contract with the European Space Agency. He has published extensively at international research conferences and journals and has authored two books on software development in C#. &lt;br /&gt;
&lt;br /&gt;
'''Nestor Catano''' is an Assistant Professor in the Department of Mathematics and Engineering at The '''University of Madeira''', Portugal. He earned a M.Sc. and Ph.D. in Computer Science from the University of Paris 7, France. His Ph.D. was funded by the European&lt;br /&gt;
project Verificard (Verification of Java Card programs). He was a research associate at the University of York, U.K, from 2004 to 2006. Nestor's main research interests are the development of JML‐based tools and techniques for the verification of programs, and the mechanization of machine‐checked correctness proofs of mathematical algorithms. He has published in international research conferences on formal methods. &lt;br /&gt;
&lt;br /&gt;
'''Jonathan Aldrich''' is an Assistant Professor of Computer Science at '''Carnegie Mellon University''' and Director of the Software Engineering Minor Program in the School of Computer Science. Aldrich’s research contributions include techniques for verifying object and component interaction protocols, modular reasoning techniques for aspects and stateful programs, and new object‐oriented language models. For his work on verifying software architecture, Aldrich received a 2006 NSF CAREER award and the 2007 Dahl‐Nygaard Junior Prize, the top international award for junior faculty making significant contributions to object‐oriented programming. &lt;br /&gt;
&lt;br /&gt;
'''Bruno Cabral''' received his PhD in Informatics Engineering in 2009 from the University of Coimbra. He is an Assistant Professor at the '''University of Coimbra''', Portugal, and an Adjunct Associate Teaching Professor at the '''Carnegie Mellon University''', USA. His main research interests are concurrent programming and programming languages, exception handling models and code instrumentation. He has participated in many research and industrial projects in cooperation with institutions such as the European Space Agency, Microsoft Research and the Portuguese Government. He is currently leading the Institute for Software Engineering at the University of Coimbra.&lt;br /&gt;
&lt;br /&gt;
Our industrial partner '''Novabase''' is one of the largest software companies in Portugal, generating&lt;br /&gt;
more than 140M€/year in software solutions and consulting. Novabase’s ACD (Advanced Custom Development) business unit brings a wealth of experience in developing advanced custom software solutions for its customers. Effectively leveraging the emerging class of highly parallel and multicore systems has been a significant challenge for Novabase, and the company will be an active project participant through providing motivating examples and testbeds for ensuring that Aeminium solves critical real‐world problems.&lt;br /&gt;
&lt;br /&gt;
== Other project members ==&lt;br /&gt;
&lt;br /&gt;
'''Sven Stork''' - Ph.D. student on the join doctoral program between CMU and the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Filipe Militão''' - Ph.D. student on the join doctoral program between CMU and Nova University of Lisbon&lt;br /&gt;
&lt;br /&gt;
'''Alcides Fonseca''' - Ph.D. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Ijaz Ahmed''' - Ph.D. student at the University of Madeira.&lt;br /&gt;
&lt;br /&gt;
'''Josh Sunshine''' - PhD student at Carnegie Mellon University&lt;br /&gt;
 &lt;br /&gt;
'''Karl Naden''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Ligia Nistor''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Roger Wolf''' - Ph.D. student at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''João Rafael''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Cristiano Gonçalves''' - M.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Sukriti Bhattacharya''' - Post-doc at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Rob Bocchino''' - Post-doc at Carnegie Mellon University&lt;br /&gt;
&lt;br /&gt;
'''Hannes Mehnert''' -  Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
'''Iain McGinniss''' - Ph.D. student visitor at CMU&lt;br /&gt;
&lt;br /&gt;
== Past project members ==&lt;br /&gt;
&lt;br /&gt;
'''Manuel Mohr''' - M.Sc. student at the Karlsruhe university&lt;br /&gt;
&lt;br /&gt;
'''João Barbosa''' - B.Sc. student at the University of Coimbra&lt;br /&gt;
&lt;br /&gt;
'''Duarte Abreu''' - M.Sc. student at the University of Madeira&lt;br /&gt;
&lt;br /&gt;
'''Alican Turk''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Mark Hahnenberg''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
'''Matthew Rodriguez''' - B.Sc. student at Carnegie mellon University&lt;br /&gt;
&lt;br /&gt;
== External Collaborators ==&lt;br /&gt;
&lt;br /&gt;
'''Radu Siminiceanu''' - National Institute of Aerospace, NIA, USA&lt;br /&gt;
&lt;br /&gt;
'''Camilo Rueda, Carlos Olarte, Gerardo Sarria''' - Pontificia Universidad Javeriana, PUJ, Cali, Colombia&lt;br /&gt;
&lt;br /&gt;
'''Elaine Pimentel''' - Universidade Federal de Minas Gerais, UFMG, Brazil&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1714</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1714"/>
				<updated>2013-04-19T21:53:24Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Past Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2011 Aeminium-Interfaces Joint Workshop, November 9th'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2010 Workshop on Facilitating Adoption of Parallel Computing'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1713</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1713"/>
				<updated>2013-04-19T21:52:55Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Past Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2011 Aeminium-Interfaces Joint Workshop, November 9th''&amp;lt;/big&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2010 Workshop on Facilitating Adoption of Parallel Computing'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1712</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1712"/>
				<updated>2013-04-19T21:51:46Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Past Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1711</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1711"/>
				<updated>2013-04-19T21:51:18Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* 2012 International Workshop on Languages for the Multi-core Era */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1710</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1710"/>
				<updated>2013-04-19T21:50:52Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* 2013 International Workshop on Languages for the Multi-core Era */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1709</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1709"/>
				<updated>2013-04-19T21:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* 2013 International Workshop on Languages for the Multi-core Era */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
          (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1708</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1708"/>
				<updated>2013-04-19T21:50:03Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* 2012 International Workshop on Languages for the Multi-core Era */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2013 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                July 2013, at ECOOP 2013, Montpellier, France&lt;br /&gt;
                      http://www.lirmm.fr/ec-montpellier-2013/&lt;br /&gt;
 (also colocated with ECMFA and ECSA, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME provides a venue for exploring how languages and related artifacts (e.g., abstractions implemented as libraries, compilers, analysis tools, and parallel runtimes) can make parallel programming safer and more productive, without sacrificing performance. The workshop allows researchers to present new ideas, research directions, and preliminary results in an informal atmosphere that fosters discussion and feedback.&lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame2013.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1707</id>
		<title>Dissemination</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1707"/>
				<updated>2013-04-19T21:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Thesis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Publications ==&lt;br /&gt;
&lt;br /&gt;
Néstor Cataño and Ijaz Ahmed and Jonathan Aldrich and Radu Siminiceanu, Lightweight Verification of a Multi-Task Threaded Server, in Science of Computer Programming, 2013.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca and Cabral, B. ,AeminiumGPU: An Intelligent Framework for GPU Programming, in Facing the Multicore-Challenge III, 2012&lt;br /&gt;
&lt;br /&gt;
Radu I. Siminiceanu Ijaz Ahmed and Néstor Catanõ, Automated Verification of Specifications with Typestates and Access Permissions, in Proceedings of the 12th International Workshop on Automated Verification of Critical Systems (AVoCS 2012), Electronic Communications of the EASST, September 2012.&lt;br /&gt;
&lt;br /&gt;
C. Olarte and E. Pimentel and N. Cataño and C. Rueda, A Linear Concurrent Constraint approach for the automatic verification of access permissions, in Proceedings of the 14th symposium on Principles and practice of declarative programming (PPDP), ACM Press, September 2012.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, Bruno Cabral, Handling Exceptions in Programs with Hidden Concurrency: New Challenges for &amp;quot;Old&amp;quot; Solutions, in ICSE'12 Workshop Proceedings, 5th International Workshop on Exception Handling (WEH.12), Zurich, Switzerland, June, 2012.&lt;br /&gt;
&lt;br /&gt;
Néstor Cataño and Ijaz Ahmed, Lightweight Veriﬁcation of a Multi-Task Threaded Server: A Case Study With The Plural Tool, in Proceedings of 16th International Workshop on Formal Methods for Industrial Critical Systems (FMICS'11), Trento, Italy, August 29-30, 2011 [http://aeminium.dei.uc.pt/images/6/67/Mtts.pdf]&lt;br /&gt;
&lt;br /&gt;
Nels E. Beckman, Duri Kim, and Jonathan Aldrich, An Empirical Study of Object Protocols in the Wild, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-empirical-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Roger Wolff, Ronald Garcia, Éric Tanter, and Jonathan Aldrich, Gradual Typestate, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-gradual-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Ligia Nistor and Jonathan Aldrich, Verifying Object-Oriented Code Using Object Propositions, in International Workshop on Aliasing, Confinement and Ownership in object-oriented programming (IWACO), 2011.  [http://www.cs.cmu.edu/~aldrich/papers/nistor-iwaco11.pdf]&lt;br /&gt;
&lt;br /&gt;
Joshua Sunshine, Karl Naden, Sven Stork, Jonathan Aldrich, and Éric Tanter, First-Class State Change in Plaid, To appear in Proceedings of Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA '11), 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-oopsla11.pdf]&lt;br /&gt;
&lt;br /&gt;
David Alves, Pedro Bizarro and Paulo Marques, Deadline Queries: Leveraging the Cloud to Produce On-Time Results, in Proceedings of the Fourth IEEE International Conference on Cloud Computing (CLOUD 2011), July 4-9, 2011, Washington Marriott, Washington DC, USA, [http://aeminium.dei.uc.pt/images/5/5a/Paper_cloud_2011_cr_final_v2.pdf]&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff, &lt;br /&gt;
Permission-Based Programming Languages (NIER Track), in Proceedings of the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-NIER2010.pdf]&lt;br /&gt;
&lt;br /&gt;
Filipe Militão, Jonathan Aldrich, and Luís Caires, Aliasing Control with View-Based Typestate, in Proceedings of Formal Techniques for Java Like Programs (FTfJP), 2010. [http://www.cs.cmu.edu/~aldrich/papers/ftfjp2010-view.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Paulo Marques, Jonathan Aldrich. Concurrency by Default: Using Permissions to Express Dataflow in Stateful Programs. Onward! Conference, Orlando, Florida, USA, October, 2009, [http://www.cs.cmu.edu/~svens/papers/onward-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Thesis ==&lt;br /&gt;
&lt;br /&gt;
Sven Stork, ÆMINIUM - Freeing Programmers from the Shackles of Sequentiality, thesis submitted to the University of Coimbra and Carnegie Mellon University in fulfilment of the requirement for the degree of Doctor of Philosophy, March 2013.&lt;br /&gt;
&lt;br /&gt;
Ijaz Ahmed, On the Formal Verification of Specifications based on Typestates with Access Permissions, thesis submitted to the University of Madeira in fulfilment of the requirement for the degree of Doctor of Philosophy, December 2012.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, Strategies for Optimization of Parallel Programs, PhD Thesis Proposal, Coimbra, Portugal, September 2012.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, ÆminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language, thesis submitted to the University of Coimbra for obtaining the Masters’ Degree in Informatics Engineering, September 2011 [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf]&lt;br /&gt;
&lt;br /&gt;
Manuel Mohr, AEminium Compilation Theory in the Context of the Plaid Language, Diploma thesis submitted to the Karlsruhe Institute of&lt;br /&gt;
Technology, February 2011 [http://pp.info.uni-karlsruhe.de/~mohr/DiplomaThesisMohr.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Concurrent Programming via Access Permissions, PhD Thesis Proposal, Coimbra, Portugal, September 2009, [http://www.cs.cmu.edu/~svens/papers/proposal-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Internal Presentations ==&lt;br /&gt;
&lt;br /&gt;
July 2011: [http://aeminium.dei.uc.pt/images/6/6a/Presentation.pdf Pulse: Plural To EVMDD-SMC - The Compiler and Model Generator]&lt;br /&gt;
&lt;br /&gt;
March 2011 at Novabase: [http://aeminium.dei.uc.pt/images/0/05/Novabase.pdf Lightweight Verification of a Multi-Task Threaded Server: A Case Study With The Plural Tool]&lt;br /&gt;
&lt;br /&gt;
== Public Presentations ==&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff.  Permission-Based Programming Languages (NIER Track). At the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011 [http://aeminium.dei.uc.pt/images/9/91/Plaidpermissions-icsenier-may11.pdf Plaidpermissions-icsenier-may11.pdf]&lt;br /&gt;
&lt;br /&gt;
Concurrency-Workshop 2010: [http://aeminium.dei.uc.pt/images/a/ae/AEminium-in-a-Nutshell.pdf AEminium-in-a-Nutshell.pdf]&lt;br /&gt;
&lt;br /&gt;
UC/Seminar presentation January 2009: [http://aeminium.dei.uc.pt/images/1/1e/Designing-a-Concurrent-Programming-Language.pdf Designing-a-Concurrent-Programming-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG talk 2009: [http://aeminium.dei.uc.pt/images/a/a6/SSSG-Conurrency-by-Default.pdf SSSG-Concurrency-by-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
PhD-Proposal short presentation: [http://aeminium.dei.uc.pt/images/6/6c/Concurrent-Programming-via-Access-Permissions.pdf Concurrent-Programming-via-Access-Permissions.pdf]&lt;br /&gt;
&lt;br /&gt;
Phd-Proposal UC: [http://aeminium.dei.uc.pt/images/f/f6/PhD-Proposal-Defense-UC.pdf PhD-Proposal-Defense-UC.pdf]&lt;br /&gt;
&lt;br /&gt;
Onward 2009: [http://aeminium.dei.uc.pt/images/f/ff/Concurrency-By-Default.pdf Concurreny-By-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/e/e2/ParallelProgrammingModels.pdf Parallel-Programming-Models.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/d/d5/SSSG-CurrentResearch.pdf SSSG-CurrentResearch.pdf]&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1706</id>
		<title>Dissemination</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1706"/>
				<updated>2013-04-19T21:34:43Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Publications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Publications ==&lt;br /&gt;
&lt;br /&gt;
Néstor Cataño and Ijaz Ahmed and Jonathan Aldrich and Radu Siminiceanu, Lightweight Verification of a Multi-Task Threaded Server, in Science of Computer Programming, 2013.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca and Cabral, B. ,AeminiumGPU: An Intelligent Framework for GPU Programming, in Facing the Multicore-Challenge III, 2012&lt;br /&gt;
&lt;br /&gt;
Radu I. Siminiceanu Ijaz Ahmed and Néstor Catanõ, Automated Verification of Specifications with Typestates and Access Permissions, in Proceedings of the 12th International Workshop on Automated Verification of Critical Systems (AVoCS 2012), Electronic Communications of the EASST, September 2012.&lt;br /&gt;
&lt;br /&gt;
C. Olarte and E. Pimentel and N. Cataño and C. Rueda, A Linear Concurrent Constraint approach for the automatic verification of access permissions, in Proceedings of the 14th symposium on Principles and practice of declarative programming (PPDP), ACM Press, September 2012.&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, Bruno Cabral, Handling Exceptions in Programs with Hidden Concurrency: New Challenges for &amp;quot;Old&amp;quot; Solutions, in ICSE'12 Workshop Proceedings, 5th International Workshop on Exception Handling (WEH.12), Zurich, Switzerland, June, 2012.&lt;br /&gt;
&lt;br /&gt;
Néstor Cataño and Ijaz Ahmed, Lightweight Veriﬁcation of a Multi-Task Threaded Server: A Case Study With The Plural Tool, in Proceedings of 16th International Workshop on Formal Methods for Industrial Critical Systems (FMICS'11), Trento, Italy, August 29-30, 2011 [http://aeminium.dei.uc.pt/images/6/67/Mtts.pdf]&lt;br /&gt;
&lt;br /&gt;
Nels E. Beckman, Duri Kim, and Jonathan Aldrich, An Empirical Study of Object Protocols in the Wild, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-empirical-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Roger Wolff, Ronald Garcia, Éric Tanter, and Jonathan Aldrich, Gradual Typestate, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-gradual-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Ligia Nistor and Jonathan Aldrich, Verifying Object-Oriented Code Using Object Propositions, in International Workshop on Aliasing, Confinement and Ownership in object-oriented programming (IWACO), 2011.  [http://www.cs.cmu.edu/~aldrich/papers/nistor-iwaco11.pdf]&lt;br /&gt;
&lt;br /&gt;
Joshua Sunshine, Karl Naden, Sven Stork, Jonathan Aldrich, and Éric Tanter, First-Class State Change in Plaid, To appear in Proceedings of Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA '11), 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-oopsla11.pdf]&lt;br /&gt;
&lt;br /&gt;
David Alves, Pedro Bizarro and Paulo Marques, Deadline Queries: Leveraging the Cloud to Produce On-Time Results, in Proceedings of the Fourth IEEE International Conference on Cloud Computing (CLOUD 2011), July 4-9, 2011, Washington Marriott, Washington DC, USA, [http://aeminium.dei.uc.pt/images/5/5a/Paper_cloud_2011_cr_final_v2.pdf]&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff, &lt;br /&gt;
Permission-Based Programming Languages (NIER Track), in Proceedings of the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-NIER2010.pdf]&lt;br /&gt;
&lt;br /&gt;
Filipe Militão, Jonathan Aldrich, and Luís Caires, Aliasing Control with View-Based Typestate, in Proceedings of Formal Techniques for Java Like Programs (FTfJP), 2010. [http://www.cs.cmu.edu/~aldrich/papers/ftfjp2010-view.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Paulo Marques, Jonathan Aldrich. Concurrency by Default: Using Permissions to Express Dataflow in Stateful Programs. Onward! Conference, Orlando, Florida, USA, October, 2009, [http://www.cs.cmu.edu/~svens/papers/onward-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Thesis ==&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, ÆminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language, thesis submitted to the University of Coimbra for obtaining the Masters’ Degree in Informatics Engineering, September 2011 [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf]&lt;br /&gt;
&lt;br /&gt;
Manuel Mohr, AEminium Compilation Theory in the Context of the Plaid Language, Diploma thesis submitted to the Karlsruhe Institute of&lt;br /&gt;
Technology, February 2011 [http://pp.info.uni-karlsruhe.de/~mohr/DiplomaThesisMohr.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Concurrent Programming via Access Permissions, PhD Thesis Proposal, Coimbra, Portugal, September 2009, [http://www.cs.cmu.edu/~svens/papers/proposal-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Internal Presentations ==&lt;br /&gt;
&lt;br /&gt;
July 2011: [http://aeminium.dei.uc.pt/images/6/6a/Presentation.pdf Pulse: Plural To EVMDD-SMC - The Compiler and Model Generator]&lt;br /&gt;
&lt;br /&gt;
March 2011 at Novabase: [http://aeminium.dei.uc.pt/images/0/05/Novabase.pdf Lightweight Verification of a Multi-Task Threaded Server: A Case Study With The Plural Tool]&lt;br /&gt;
&lt;br /&gt;
== Public Presentations ==&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff.  Permission-Based Programming Languages (NIER Track). At the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011 [http://aeminium.dei.uc.pt/images/9/91/Plaidpermissions-icsenier-may11.pdf Plaidpermissions-icsenier-may11.pdf]&lt;br /&gt;
&lt;br /&gt;
Concurrency-Workshop 2010: [http://aeminium.dei.uc.pt/images/a/ae/AEminium-in-a-Nutshell.pdf AEminium-in-a-Nutshell.pdf]&lt;br /&gt;
&lt;br /&gt;
UC/Seminar presentation January 2009: [http://aeminium.dei.uc.pt/images/1/1e/Designing-a-Concurrent-Programming-Language.pdf Designing-a-Concurrent-Programming-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG talk 2009: [http://aeminium.dei.uc.pt/images/a/a6/SSSG-Conurrency-by-Default.pdf SSSG-Concurrency-by-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
PhD-Proposal short presentation: [http://aeminium.dei.uc.pt/images/6/6c/Concurrent-Programming-via-Access-Permissions.pdf Concurrent-Programming-via-Access-Permissions.pdf]&lt;br /&gt;
&lt;br /&gt;
Phd-Proposal UC: [http://aeminium.dei.uc.pt/images/f/f6/PhD-Proposal-Defense-UC.pdf PhD-Proposal-Defense-UC.pdf]&lt;br /&gt;
&lt;br /&gt;
Onward 2009: [http://aeminium.dei.uc.pt/images/f/ff/Concurrency-By-Default.pdf Concurreny-By-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/e/e2/ParallelProgrammingModels.pdf Parallel-Programming-Models.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/d/d5/SSSG-CurrentResearch.pdf SSSG-CurrentResearch.pdf]&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1704</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1704"/>
				<updated>2012-05-21T17:41:34Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium at the Carnegie Mellon University ==&lt;br /&gt;
Contact Jonathan Aldrich at CMU for more information. http://www.cs.cmu.edu/~aldrich/&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1703</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1703"/>
				<updated>2012-05-21T17:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1702</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1702"/>
				<updated>2012-05-21T17:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1701</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1701"/>
				<updated>2012-05-21T17:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt;&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1700</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1700"/>
				<updated>2012-05-21T17:38:59Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1699</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1699"/>
				<updated>2012-05-21T17:38:00Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;'''2012 International Workshop on Languages for the Multi-core Era'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
                June 13 2012, at ECOOP 2012, Beijing China&lt;br /&gt;
                      http://ecoop12.cs.purdue.edu/&lt;br /&gt;
 (also colocated with PLDI, ISMM, LCTES, the X10 workshop, and other events)&lt;br /&gt;
&lt;br /&gt;
LaME is an interactive venue for exposing, evaluating, and developing programming language support for concurrency. This workshop provides a forum for the proposal and discussion of creative ideas that spur the development of innovative or improved concurrency models, languages, run-time systems, libraries and tools for multicore programming. &lt;br /&gt;
&lt;br /&gt;
'''MORE INFORMATION AVAILABLE AT http://http://lame.dei.uc.pt'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
&lt;br /&gt;
'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1698</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1698"/>
				<updated>2012-05-21T17:36:28Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Program'''&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1697</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1697"/>
				<updated>2012-05-21T17:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1696</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1696"/>
				<updated>2012-05-21T17:35:51Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program&lt;br /&gt;
&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the&lt;br /&gt;
&lt;br /&gt;
Æminium Language&lt;br /&gt;
&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1695</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Events&amp;diff=1695"/>
				<updated>2012-05-21T17:35:27Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Aeminium-Interfaces Joint Workshop, November 9th 2011'''&lt;br /&gt;
&amp;quot;Reitoria da Universidade Nova&amp;quot; in the room &amp;quot;Sala do Senado&amp;quot;. http://www.unl.pt/onde-estamos/mapa/reitoria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program&lt;br /&gt;
10:00 am - Welcome and Workshop Introduction&lt;br /&gt;
Session 1: Language-based Safety and Security for the Web&lt;br /&gt;
10:15 am - João Seco, Data Security with Refinement Types&lt;br /&gt;
10:45 am - Luís Caires, Interface Certification for Software Services&lt;br /&gt;
11:15 am - Antonio Melo (OutSystems), Validation Issues in web applications.&lt;br /&gt;
11:45 am - Discussion&lt;br /&gt;
12:00 am - Lunch&lt;br /&gt;
Session 2: Enabling Parallelism for the Masses&lt;br /&gt;
1:30 pm - Sven Stork, Aeminium language&lt;br /&gt;
2:00 pm - Alcides Fonseca, AEminiumGPU: A CPU-GPU Hybrid Runtime for the&lt;br /&gt;
Æminium Language&lt;br /&gt;
2:30 pm - Filipe Martins (Novabase) - TBD&lt;br /&gt;
3:00 pm - Discussion&lt;br /&gt;
3:15 pm - Break&lt;br /&gt;
Session 3: Type-based Static Analysis&lt;br /&gt;
3:45 pm - Ijaz Ahmed (UMA) - Automated Verification of Specifications with&lt;br /&gt;
Typestates and Access Permissions&lt;br /&gt;
4:15 pm - Vasco Vasconcelos, Checking Dynamic Roles in Multiparty Communication&lt;br /&gt;
4:45 pm - Discussion and Wrapup&lt;br /&gt;
5:15 pm - Informal follow-up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Past Events==&lt;br /&gt;
'''Workshop on Facilitating Adoption of Parallel Computing'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Date''': Wednesday, '''May 5, 2010'''&lt;br /&gt;
&lt;br /&gt;
'''Location''': GHC 7501 at CMU&lt;br /&gt;
&lt;br /&gt;
'''Sponsor''': CMU|Portugal Program&lt;br /&gt;
&lt;br /&gt;
With the rise of multicore processors and the increasing richness of application functionality, leveraging parallel computation is increasingly necessary to achieve good performance.  However, parallel computing is also difficult for programmers, due to the need to decompose the problem into sub-parts which can be solved in parallel, and due to the challenges of managing potential interference between concurrent tasks.&lt;br /&gt;
&lt;br /&gt;
This workshop focuses on research approaches intended to facilitate the practical adoption of parallel computing.  These may include engineering approaches, new models of parallel computing, approaches for verification and reasoning in the presence of concurrency, and approaches for teaching parallel computing.&lt;br /&gt;
&lt;br /&gt;
'''Schedule'''  &lt;br /&gt;
&lt;br /&gt;
9:00    Welcome and Workshop Introduction&lt;br /&gt;
&lt;br /&gt;
9:15    Engineering Parallelism: What Works in Practice&lt;br /&gt;
&lt;br /&gt;
10:15   Break&lt;br /&gt;
&lt;br /&gt;
10:30   New Programming Models Facilitating Adoption of Parallelism&lt;br /&gt;
&lt;br /&gt;
12:00   Lunch (provided for workshop participants)&lt;br /&gt;
&lt;br /&gt;
1:00    Verification: Helping Developers Reason about Concurrency&lt;br /&gt;
&lt;br /&gt;
2:00    Hardware Factors in Parallel Computing&lt;br /&gt;
&lt;br /&gt;
2:45    Break&lt;br /&gt;
&lt;br /&gt;
3:00    Teaching Parallel Computing&lt;br /&gt;
&lt;br /&gt;
3:30    Wrapup&lt;br /&gt;
&lt;br /&gt;
4:00    Informal Follow-up&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1694</id>
		<title>AEminium</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=AEminium&amp;diff=1694"/>
				<updated>2012-05-21T17:31:47Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;'''Freeing Programmers from the Shackles of Sequentiality.'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current programming systems shackle developers to a sequential coding paradigm.&lt;br /&gt;
This paradigm hampers developers from taking advantage of emerging large‐scale multicore hardware. We propose a platform which builds in concurrency by default: instead of sequencing code, programmers express dependency information, which is used by a compile‐time checker to verify correctness conditions, and by the libraries and runtime system to enable concurrent execution. As a result, developers can write parallel code in a natural style and have confidence in its correctness and performance.&lt;br /&gt;
&lt;br /&gt;
Consult the [http://aeminium.dei.uc.pt/images/1/13/Aeminium_ExecutiveSummary.pdf Executive Summary] for information on the project.&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Coimbra ==&lt;br /&gt;
AEminiumGPU [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf] is a sub-project of the AEminium project. It provides an high-level programming framework for developing parallel programs for both CPUs and GPUs. AEminiumGPU drives inspiration from Functional Programming and currently allows developers to implement programs based on the Map-Reduce pattern. In the future, the framework can be extended with other higher-order functions. AEminiumGPU does not force developers to understand the particularities of GPU programming. Programs can be written in pure Java (and soon AEminium) but specific parts of the code are compiled to OpenCL and executed on the GPU.&lt;br /&gt;
&lt;br /&gt;
AEMiniumGPU is a framework composed by a compiler and a runtime. It is available for download the following address: https://github.com/alcides/AeminiumGPUCompiler/&lt;br /&gt;
&lt;br /&gt;
== AEminium at the University of Madeira ==&lt;br /&gt;
&lt;br /&gt;
The organizers of FMICS'11 selected the article &amp;quot;Multi-Task Threaded Server: A Case Study With The Plural Tool&amp;quot; by Néstor Cataño and Ijaz Ahmed for submission to Science of Computer Programming (SCP). FMICS invited 7 papers in total and will select 5 of them for final publication to SCP. This article discusses the business case provided by AEMinium's industrial partner Novabase.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://www3.uma.pt/ncatano/aeminium/Home.html link] for more information on what the University of Madeira is doing on the AEminium project.&lt;br /&gt;
&lt;br /&gt;
== AEminium source code ==&lt;br /&gt;
Check out [http://code.google.com/p/aeminium/ Google Code] for code and examples (under development).&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1693</id>
		<title>Dissemination</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=Dissemination&amp;diff=1693"/>
				<updated>2012-04-10T16:32:42Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Publications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Publications ==&lt;br /&gt;
&lt;br /&gt;
A. Fonseca, B. Cabral, &amp;quot;Handling Exceptions in Programs with Hidden Concurrency: New Challenges for &amp;quot;Old&amp;quot; Solutions&amp;quot;, in ICSE'12 Workshop Proceedings, 5th International Workshop on Exception Handling (WEH.12), Zurich, Switzerland, June, 2012.&lt;br /&gt;
&lt;br /&gt;
Néstor Cataño and Ijaz Ahmed, Lightweight Veriﬁcation of a Multi-Task Threaded Server: A Case Study With The Plural Tool, in Proceedings of 16th International Workshop on Formal Methods for Industrial Critical Systems (FMICS'11), Trento, Italy, August 29-30, 2011 [http://aeminium.dei.uc.pt/images/6/67/Mtts.pdf]&lt;br /&gt;
&lt;br /&gt;
Nels E. Beckman, Duri Kim, and Jonathan Aldrich, An Empirical Study of Object Protocols in the Wild, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-empirical-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Roger Wolff, Ronald Garcia, Éric Tanter, and Jonathan Aldrich, Gradual Typestate, in Proceedings of the European Conference on Object-Oriented Programming (ECOOP '11), 2011. [http://www.cs.cmu.edu/~aldrich/papers/aldrich-gradual-ecoop11.pdf]&lt;br /&gt;
&lt;br /&gt;
Ligia Nistor and Jonathan Aldrich, Verifying Object-Oriented Code Using Object Propositions, in International Workshop on Aliasing, Confinement and Ownership in object-oriented programming (IWACO), 2011.  [http://www.cs.cmu.edu/~aldrich/papers/nistor-iwaco11.pdf]&lt;br /&gt;
&lt;br /&gt;
Joshua Sunshine, Karl Naden, Sven Stork, Jonathan Aldrich, and Éric Tanter, First-Class State Change in Plaid, To appear in Proceedings of Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA '11), 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-oopsla11.pdf]&lt;br /&gt;
&lt;br /&gt;
David Alves, Pedro Bizarro and Paulo Marques, Deadline Queries: Leveraging the Cloud to Produce On-Time Results, in Proceedings of the Fourth IEEE International Conference on Cloud Computing (CLOUD 2011), July 4-9, 2011, Washington Marriott, Washington DC, USA, [http://aeminium.dei.uc.pt/images/5/5a/Paper_cloud_2011_cr_final_v2.pdf]&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff, &lt;br /&gt;
Permission-Based Programming Languages (NIER Track), in Proceedings of the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011, [http://www.cs.cmu.edu/~aldrich/papers/plaid-NIER2010.pdf]&lt;br /&gt;
&lt;br /&gt;
Filipe Militão, Jonathan Aldrich, and Luís Caires, Aliasing Control with View-Based Typestate, in Proceedings of Formal Techniques for Java Like Programs (FTfJP), 2010. [http://www.cs.cmu.edu/~aldrich/papers/ftfjp2010-view.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Paulo Marques, Jonathan Aldrich. Concurrency by Default: Using Permissions to Express Dataflow in Stateful Programs. Onward! Conference, Orlando, Florida, USA, October, 2009, [http://www.cs.cmu.edu/~svens/papers/onward-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Thesis ==&lt;br /&gt;
&lt;br /&gt;
Alcides Fonseca, ÆminiumGPU: A CPU-GPU Hybrid Runtime for the Æminium Language, thesis submitted to the University of Coimbra for obtaining the Masters’ Degree in Informatics Engineering, September 2011 [http://aeminium.dei.uc.pt/images/7/73/Alcides_fonseca_msc_thesis.pdf]&lt;br /&gt;
&lt;br /&gt;
Manuel Mohr, AEminium Compilation Theory in the Context of the Plaid Language, Diploma thesis submitted to the Karlsruhe Institute of&lt;br /&gt;
Technology, February 2011 [http://pp.info.uni-karlsruhe.de/~mohr/DiplomaThesisMohr.pdf]&lt;br /&gt;
&lt;br /&gt;
Sven Stork, Concurrent Programming via Access Permissions, PhD Thesis Proposal, Coimbra, Portugal, September 2009, [http://www.cs.cmu.edu/~svens/papers/proposal-2009.pdf].&lt;br /&gt;
&lt;br /&gt;
== Internal Presentations ==&lt;br /&gt;
&lt;br /&gt;
July 2011: [http://aeminium.dei.uc.pt/images/6/6a/Presentation.pdf Pulse: Plural To EVMDD-SMC - The Compiler and Model Generator]&lt;br /&gt;
&lt;br /&gt;
March 2011 at Novabase: [http://aeminium.dei.uc.pt/images/0/05/Novabase.pdf Lightweight Verification of a Multi-Task Threaded Server: A Case Study With The Plural Tool]&lt;br /&gt;
&lt;br /&gt;
== Public Presentations ==&lt;br /&gt;
&lt;br /&gt;
Jonathan Aldrich, Ronald Garcia, Mark Hahnenberg, Manuel Mohr, Karl Naden, Darpan Saini, Sven Stork, Joshua Sunshine, Éric Tanter, and Roger Wolff.  Permission-Based Programming Languages (NIER Track). At the International Conference on Software Engineering (ICSE '11), New Ideas and Emerging Results Track, 2011 [http://aeminium.dei.uc.pt/images/9/91/Plaidpermissions-icsenier-may11.pdf Plaidpermissions-icsenier-may11.pdf]&lt;br /&gt;
&lt;br /&gt;
Concurrency-Workshop 2010: [http://aeminium.dei.uc.pt/images/a/ae/AEminium-in-a-Nutshell.pdf AEminium-in-a-Nutshell.pdf]&lt;br /&gt;
&lt;br /&gt;
UC/Seminar presentation January 2009: [http://aeminium.dei.uc.pt/images/1/1e/Designing-a-Concurrent-Programming-Language.pdf Designing-a-Concurrent-Programming-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG talk 2009: [http://aeminium.dei.uc.pt/images/a/a6/SSSG-Conurrency-by-Default.pdf SSSG-Concurrency-by-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
PhD-Proposal short presentation: [http://aeminium.dei.uc.pt/images/6/6c/Concurrent-Programming-via-Access-Permissions.pdf Concurrent-Programming-via-Access-Permissions.pdf]&lt;br /&gt;
&lt;br /&gt;
Phd-Proposal UC: [http://aeminium.dei.uc.pt/images/f/f6/PhD-Proposal-Defense-UC.pdf PhD-Proposal-Defense-UC.pdf]&lt;br /&gt;
&lt;br /&gt;
Onward 2009: [http://aeminium.dei.uc.pt/images/f/ff/Concurrency-By-Default.pdf Concurreny-By-Default.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/e/e2/ParallelProgrammingModels.pdf Parallel-Programming-Models.pdf]&lt;br /&gt;
&lt;br /&gt;
SSSG 2008: [http://aeminium.dei.uc.pt/images/d/d5/SSSG-CurrentResearch.pdf SSSG-CurrentResearch.pdf]&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1692</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1692"/>
				<updated>2012-02-21T10:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Running an Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/username/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/username/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# Firstly, as stated before, a instance of the class DataCollection is created.&lt;br /&gt;
# Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values.&lt;br /&gt;
# The next step is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
# At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
Our Profiler uses JProfiler method interception for controlling the time every task spend at each state. We take advantage of the fact that tasks change theirs state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), and so, we only intercept method entrances.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
Let's now take a look at the interception mechanism. To achieve the time measuring, we use a systematic and quite simple procedure, which is aided by auxiliary hashtables, one for each state a task can assume. The hashtables will hold payloads, which save the time of their creation.&lt;br /&gt;
&lt;br /&gt;
At the entry of a method, we have two states to consider. The one a thread has at the moment, the old state, and another, which is the state this task will change to. We get the payload from the old state's hashtable, passing it to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a that state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the previous paragraph. This second step marks the starting time of the new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1691</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1691"/>
				<updated>2012-02-18T17:29:47Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* IMPORTANT NOTE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# Firstly, as stated before, a instance of the class DataCollection is created.&lt;br /&gt;
# Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values.&lt;br /&gt;
# The next step is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
# At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
Our Profiler uses JProfiler method interception for controlling the time every task spend at each state. We take advantage of the fact that tasks change theirs state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), and so, we only intercept method entrances.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
Let's now take a look at the interception mechanism. To achieve the time measuring, we use a systematic and quite simple procedure, which is aided by auxiliary hashtables, one for each state a task can assume. The hashtables will hold payloads, which save the time of their creation.&lt;br /&gt;
&lt;br /&gt;
At the entry of a method, we have two states to consider. The one a thread has at the moment, the old state, and another, which is the state this task will change to. We get the payload from the old state's hashtable, passing it to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a that state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the previous paragraph. This second step marks the starting time of the new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1690</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1690"/>
				<updated>2012-02-18T17:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* The profiler package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# Firstly, as stated before, a instance of the class DataCollection is created.&lt;br /&gt;
# Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values.&lt;br /&gt;
# The next step is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
# At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
Our Profiler uses JProfiler method interception for controlling the time every task spend at each state. We take advantage of the fact that tasks change theirs state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), and so, we only intercept method entrances.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
Let's now take a look at the interception mechanism. To achieve the time measuring, we use a systematic and quite simple procedure, which is aided by auxiliary hashtables, one for each state a task can assume. The hashtables will hold payloads, which save the time of their creation.&lt;br /&gt;
&lt;br /&gt;
At the entry of a method, we have two states to consider. The one a thread has at the moment, the old state, and another, which is the state this task will change to. We get the payload from the old state's hashtable, passing it to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a that state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the previous paragraph. This second step marks the starting time of the new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1689</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1689"/>
				<updated>2012-02-18T17:14:01Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* CountersProbe (Telemetry Data) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# Firstly, as stated before, a instance of the class DataCollection is created.&lt;br /&gt;
# Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values.&lt;br /&gt;
# The next step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
# At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1688</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1688"/>
				<updated>2012-02-18T17:13:26Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* CountersProbe (Telemetry Data) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# Firstly, as stated before, a instance of the class DataCollection is created.&lt;br /&gt;
# Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values.&lt;br /&gt;
# The next, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
# At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1687</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1687"/>
				<updated>2012-02-18T17:12:29Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* The profiler package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
# As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
# At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
#At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1686</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1686"/>
				<updated>2012-02-18T17:11:11Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* The profiler package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider is a simple class that let's JProfiler know which are the probe classes present in the project that are going to be used for profiling. It merely contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global task activity for the scheduler and graph. By global task activity, we mean, for example, the number of completed tasks or how many tasks marked as running at a given moment.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
This second group separates by the values by each working thread, whose number is defined by the value in 'maxParallelism'.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed, going through the following steps:&lt;br /&gt;
1. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData().&lt;br /&gt;
2. At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1685</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1685"/>
				<updated>2012-02-18T17:05:35Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /*  JProfiler Classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analysis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1684</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1684"/>
				<updated>2012-02-18T17:05:12Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /*  JProfiler Classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three classes left for analyzis are the ones which are required by JProfiler to collect telemetry information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1683</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1683"/>
				<updated>2012-02-18T17:03:57Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This extra step is necessary because the JProfiler classes must use a fixed constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for instance, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime at start time and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references. In order to avoid ''null'' values (if the JProfiler starts sampling before the Runtime is fully ready), it's wise to always double check the contents of the references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measurement, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these two components responsible for filling the fields that are related to them.&lt;br /&gt;
Therefore, DataCollection contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will also have more than a single working thread. Besides it, there are three different types of tasks too, namely Atomic, Non-blocking and Blocking tasks. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1682</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1682"/>
				<updated>2012-02-18T16:59:02Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The ''profiler package'' contains two types of classes. The first type concerns the classes which were only created to make the process of collecting the profiling information easier. Then, in the second type, we can include all the classes that are strictly required by the JProfiler to perform its activity. &lt;br /&gt;
The first two classes present in this text belong tot he first type, while the other three fall in the second category.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1681</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1681"/>
				<updated>2012-02-18T16:55:33Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Running an Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1680</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1680"/>
				<updated>2012-02-18T16:55:07Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Running an Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on the online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1679</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1679"/>
				<updated>2012-02-18T16:54:46Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Running an Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on the online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1678</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1678"/>
				<updated>2012-02-18T16:54:29Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Running an Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on the online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,&amp;lt;br&amp;gt;config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1677</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1677"/>
				<updated>2012-02-18T16:53:58Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on the online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
To know more about the 'config.xml' file, check the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1676</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1676"/>
				<updated>2012-02-18T16:48:28Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Æminium Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime, so you must download it before starting any profiling tests.&lt;br /&gt;
Besides reading the documentation present in this page, also consider consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered here.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
This will allow you monitoring the Runtime activity on the online mode, requiring you to start a new session at JProfiler, listening in the port 8849. The meaning of the flags are the following:&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
As for offline mode, use the following command:&lt;br /&gt;
&lt;br /&gt;
java -agentpath:/home/jprofiler7/bin/linux-x64/libjprofilerti.so=offline,id=3652,config=/home/Tools/jprofiler7_scripts/config.xml -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1675</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1675"/>
				<updated>2012-02-12T23:04:36Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Preparing the ground */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IMPORTANT NOTE ==&lt;br /&gt;
This page is still under construction, so the text might eventually be reviewed.&lt;br /&gt;
&lt;br /&gt;
== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1674</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1674"/>
				<updated>2012-02-12T22:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* TaskDetailsProbe (Method Interception) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure. At the entry of a method, we pick the payload from the hashtable reserved tot he old state, passing it afterwards to the InterceptorContext, which will calculate the difference between the creation time and the current time. This will define the time this task has spent at a given state.&lt;br /&gt;
When this is done, a new payload info must be created and stored in the corresponding hashtable, so the next method interception can use it as described in the first step. This second step marks the starting time of a new state.&lt;br /&gt;
&lt;br /&gt;
Naturally, this procedure is different for for the methods addTask() and taskCompleted(), as they correspond to the beginning of the first useful state (WAITING_FOR_DEPENDENCIES) and the end of the last (WAITING_FOR_CHILDREN). For them, we can only insert a new payload info or remove it from the hashtable.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1673</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1673"/>
				<updated>2012-02-12T22:52:06Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* TaskDetailsProbe (Method Interception) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The use the JProfiler method interception for controlling the time the task spend at each state. As each task change it's state at the beginning of a method (for example, the task turns into the state RUNNING when the method invoke() is called), we only intercept method entrances, because at this point, we know that the previous state is over and new one is starting.&lt;br /&gt;
&lt;br /&gt;
Firstly, we need to define all the method to intercept at the method getInterceptionMethods(). As stated in the JProfiler API Javadocs, for the class [ftp://202.127.19.60/home/ddg2/chenting/jprofiler5/api/javadoc/com/jprofiler/api/agent/interceptor/InterceptionMethod.html InterceptionMethod], it is used the JVM's representation of type signatures for both argument type and return type.&lt;br /&gt;
&lt;br /&gt;
Once you have defined all the methods to be intercepted, it's time to handle them at the interceptionEnter(). As said before, we can do all the work by only intercepting the entries, and therefore, we leave the interceptionExit() untouched.&lt;br /&gt;
&lt;br /&gt;
At this point, we take a systematic and quite simple procedure.&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1672</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1672"/>
				<updated>2012-02-12T22:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* TaskDetailsProbe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe (Method Interception)===&lt;br /&gt;
&lt;br /&gt;
The class&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1671</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1671"/>
				<updated>2012-02-12T22:32:44Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* CountersProbe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe (Telemetry Data) ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1670</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1670"/>
				<updated>2012-02-12T22:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* CountersProbe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe ===&lt;br /&gt;
&lt;br /&gt;
The CounterProbe is responsible for monitoring the global variables related to the scheduler and graph. By global variables, we mean, for example, the number of tasks that were completed so far or how many tasks are marked as running at a given time.&lt;br /&gt;
&lt;br /&gt;
The variables to collect are defined in the method getMetaData(). The first group of variables correspond to the sum of the values of all the active threads. Then, you have a second group, which is defined inside the following 'for' cycle: &lt;br /&gt;
&lt;br /&gt;
 1 for (int i = 0; i &amp;lt; maxParallelism; i++)&lt;br /&gt;
 2 {&lt;br /&gt;
 3     metaData.addCustomTelemetry(&amp;quot;Tasks in Non-blocking Queue (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 4     metaData.addCustomTelemetry(&amp;quot;No of Atomic Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 5     metaData.addCustomTelemetry(&amp;quot;No of Blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 6     metaData.addCustomTelemetry(&amp;quot;No of Non-blocking Tasks Handled (&amp;quot; + (i + 1) + &amp;quot;)&amp;quot;, Unit.PLAIN, 1f);&lt;br /&gt;
 7 }&lt;br /&gt;
&lt;br /&gt;
The Java variable 'maxParallelism' correspond to the number of active threads in the Æminium Runtime and so, we will have profiling variables separated by each thread.&lt;br /&gt;
&lt;br /&gt;
For collecting data, the method fillTelemetryData() is executed. As stated before, a instance of the class DataCollection is created. Then, after checking if the scheduler reference is not null, we simply call the method collectData(). At this point, the DataCollection object will have all the information coming from the scheduler, so it's only a matter of filling up the 'customTelemetries' array with the correct values. The second step, is exactly the same, but now, we will doing the profiling for the graph variables. &lt;br /&gt;
At the end, the array will be completely full and it's up to the JProfiler to display the graphs.&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1669</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1669"/>
				<updated>2012-02-12T17:47:28Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* AeminiumProbeProvider */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
AeminiumProbeProvider tells JProfiler which are the probe classes present in the project which should be used for profiling. It simply contains a method, getProbes(), which return an array with the necessary probe classes. In the Æminium Runtime, those will be CountersProbe and TaskDetailsProbe, discussed right away.&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	<entry>
		<id>http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1668</id>
		<title>DocumentationAeminiumRuntimeProfiler</title>
		<link rel="alternate" type="text/html" href="http://aeminium.dei.uc.pt/index.php?title=DocumentationAeminiumRuntimeProfiler&amp;diff=1668"/>
				<updated>2012-02-12T17:43:34Z</updated>
		
		<summary type="html">&lt;p&gt;Aeminium: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preparing the ground ==&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
The Profiler uses the [http://www.ej-technologies.com/products/jprofiler/overview.html JProfiler framework] to collect and manage all the information concerning the performance of the Æminium Runtime.&lt;br /&gt;
Also, considering consulting the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation] whenever you have a doubt which isn't covered in this page.&lt;br /&gt;
&lt;br /&gt;
=== Running an Application===&lt;br /&gt;
To run an application along with the JProfiler, you must add a few flags before executing the 'java' command, namely the '-agentpath' and '-Djprofiler.probeProvider', as described in the example bellow for Linux 32-bit:&lt;br /&gt;
&lt;br /&gt;
 java -agentpath:/home/alcides/Tools/jprofiler7/bin/linux-x64/libjprofilerti.so=port=8849 -Djprofiler.probeProvider=aeminium.runtime.profiler.AeminiumProbeProvider -jar Fibonnaci.jar''&lt;br /&gt;
&lt;br /&gt;
* The '-agentpath' flags tells the JVM the location of the 'jprofilerti library', which is usually located the folder where JProfiler was installed. &lt;br /&gt;
&lt;br /&gt;
:* In Windows 32-bit, you can try '-agentpath:&amp;quot;C:\Program Files\jprofiler7\bin\windows\jprofilerti.dll=port=8849&amp;quot;'. For more information, look in the section 'B.3.10 Starting Remote Sessions' of the [http://resources.ej-technologies.com/jprofiler/help/doc/help.pdf JProfiler documentation].&lt;br /&gt;
&lt;br /&gt;
* The '-Djprofiler.probeProvider' will tell the JVM the class path to the probe provider, a class whose contents are discussed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The profiler package == &lt;br /&gt;
&lt;br /&gt;
The first two classes are regular Java classes, which were created just to make easier the process of collecting the profiling information.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProfiler ===&lt;br /&gt;
&lt;br /&gt;
This class was created so we could statically refer the scheduler and the graph. This is necessary because the JProfiler classes must follow a strict constructor and are initialized by the JProfiler itself. Therefore, we couldn't pass, for the example, the Runtime as an argument to the probe providers.&lt;br /&gt;
To accomplish this goal, the class AeminiumProfiler is initialized by the Runtime and whenever JProfiler needs to collect data from the scheduler or the graph, it simply has to pick the AeminiumProfiler's references.&lt;br /&gt;
&lt;br /&gt;
=== DataCollection ===&lt;br /&gt;
&lt;br /&gt;
The DataCollection works like a structure that will hold all the variables to profile. At each measuring, the JProfiler passes an instance of this class to the scheduler and then to the graph, being these components responsible for filling with values the fields that are related to them.&lt;br /&gt;
Therefore, it contains the following variables:&lt;br /&gt;
&lt;br /&gt;
===== Scheduler variables =====&lt;br /&gt;
* public int noOccupiedQueues;&lt;br /&gt;
* public int [] taskInNonBlockingQueue;&lt;br /&gt;
* public int taskInBlockingQueue;&lt;br /&gt;
* public int [][] tasksHandled;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may have more than one non-blocking queue, and hence the array for this variable.&lt;br /&gt;
In most cases, we will have more than a single working thread. Also, there is also three different types of tasks, namely Atomic, Non-blocking and Blocking. Due to this two conditions, we need a matrix to store all the information about how many tasks were handled by each thread.&lt;br /&gt;
&lt;br /&gt;
===== Graph variables =====&lt;br /&gt;
* public int noTasksCompleted[];&lt;br /&gt;
* public int noUnscheduledTasks;&lt;br /&gt;
* public int noWaitingForChildrenTasks;&lt;br /&gt;
* public int noWaitingForDependenciesTasks;&lt;br /&gt;
* public int noTasksWaitingInQueue;&lt;br /&gt;
* public int noRunningTasks;&lt;br /&gt;
* public int noCompletedTasks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The number of tasks completed must be array because, as above, we have three different types of tasks.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#8B0000&amp;quot;&amp;gt; JProfiler Classes&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The three other classes that also belong to the profiler package are the ones which are required by JProfiler to collect telemetries information, as well as handle method interception.&lt;br /&gt;
&lt;br /&gt;
=== AeminiumProbeProvider ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;br /&gt;
&lt;br /&gt;
=== CountersProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;br /&gt;
&lt;br /&gt;
=== TaskDetailsProbe ===&lt;br /&gt;
&lt;br /&gt;
The class&lt;/div&gt;</summary>
		<author><name>Aeminium</name></author>	</entry>

	</feed>